Перейти к содержанию

Abraham08

Пользователи
  • Постов

    28
  • Зарегистрирован

  • Посещение

Репутация

1 Навыки не прокачены

Информация о Abraham08

Посетители профиля

2 005 просмотров профиля
  1. Извиняюсь сразу за тупой вопрос ) В общем, как мне известно, чтобы внедрить свою дллку в игру, необходимо написать эту самую библиотеку, а затем создать отдельно приложение типа такого: собственно, вопрос, а есть ли способ внедрить свою длл без стороннего приложения? Т.е. чтобы закинул библиотеку в папку с игрой и она сама подключилась?)
  2. Вот спасибо, знать бы о них раньше) И, к слову, таки удалось запустить окно х64 проекта в в10, воспользовался этой шапкой: В итоге так и не понял почему мой вариант не работал. Вроде и тут и там одно и то же - создается, заполняется и регистриуется класс окна, создается окно с учетом разрешения, запускается цикл сообщений. Но мой вариант на х64 в10 не работал, а этот работает. Мистика.
  3. Вот полный код программы: Как уже говорил, проблема только на windows 10 и только в режиме x64 (в режиме x32 на w10 окно создается, но программа не работает т.к. функции принимают 4 байтовые значения) Может нужно какие-то ещё параметры изменить в Project Properties? Или версия студии неподходит?
  4. А вы трейнеры для 64 битных игр делали под windows 10? Тут такое дело, чтобы функции ReadProcessMemory и подобные принимали в качестве параметров 8 байтовые значения (я имею в виду второй параметр, в который заносится адрес из которого нужно считать данные, а в 64 битной игре и адреса 64 битные), необходимо перевести проект в Visual Studio 2013 в 64 битный режим (Project-> Project Properties->Configuration Manager->Active Solution Platform->x64), но вот в чем беда, на Windows 7 при таком раскладе всё продолжает работать, а в Windows 10 не создается окно (функция CreateWindow возвращает 0), я даже без трейнера попытался его создать, банальный шаблон программы HelloWorld, где просто создается окно и более ничего, в 32 битной версии нормально всё, а в 64 окно не хочет создаваться (проблема только на Windows 10), не знаете в чём дело?
  5. Нашел нужный адрес, по которому инструкция лежит, через сканер сигнатур. Но как теперь прочитать что в регистре лежит?
  6. Ещё такой вопрос: у меня есть байтовый адрес инструкции (48 8B 58 38 48 85 DB 74 * F6), есть сама инструкция (mov rbx,[rax+38]), в регистре rax хранится нужный мне адрес (тот самый, который был получен вчера через MODULEENTRY32), как можно на с++ добраться до этого регистра и считать из него информацию? Дело в том, что вчерашний вариант работает исключительно на в7, этот же вариант будет работать и на в10.
  7. Спасибо) Забыл размерность (mEntry.dwSize = sizeof(mEntry) ) указать, из-за этого адрес и возвращался нулевым)
  8. А где именно в той структуре адрес лежит? Я сделал так INT64 address; snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); pInfo.dwSize = sizeof(PROCESSENTRY32); if (Process32First(snapshot, &pInfo)){ while (Process32Next(snapshot, &pInfo)){ if (!strcmp(name, pInfo.szExeFile)){ HANDLE hSnap; hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pInfo.th32ProcessID); MODULEENTRY32 mod; if (Module32First(hSnap, &mod)) { } CloseHandle(hSnap); } } }В mod оказывается экзешник игры (если верить mod.szExePath), но как адрес вытащить? modBaseAddr мне 0 возвращает
  9. У меня такая проблема - в СЕ самый нижний указатель (который должен быть статическим ) имеет вид "xxx.exe+160B8D0", так вот, сам xxx.exe - динамический и каждый раз меняется. Как его можно занести в код на с++? Был бы он статическим, записал бы так: ReadProcessMemory(phandle, (LPVOID)(0x13F8D0000 + 0x160B8D0), &address, 8, NULL); ReadProcessMemory(phandle, (LPVOID)(address + 0xd0), &address, 8, NULL); ReadProcessMemory(phandle, (LPVOID)(address + 0x490), &address, 8, NULL); ReadProcessMemory(phandle, (LPVOID)(address + 0x1c6), &BlueRank, 2, NULL);Но увы, стоит перезрузить систему и уже не работает из-за измененного базового адреса (0x13F8D0000).
  10. Не, все эти типы тоже были 4 байтовые. Потратил пол дня на поиск ответа, а оказалось всё предельно просто.. http://www.mpgh.net/forum/showthread.php?t=860166 вот тут у человека была такая же проблема. Нужно было всего лишь перейти в режим 64 битного приложения в VS, после этого и LPVOID, и LPCVOID стали 8 байтовые и спокойно приняли этот адрес.
  11. В общем, хочу написать трейнер для 64битной игры (она использует 64 битные адреса, 0х7FFED6CF128, в этом духе), а функция ReadProcessMemory в качестве аргумента принимает LPVOID , который 4 байтовый. Т.е. передавая этой функции адрес, передается только ED6CF128, а остальная часть теряется и, соответственно, функция считывает мусор. Как передать ей полный адрес? С 32 битными процессами проблем нет, там всё считывается прекрасно.
  12. И снова здравствуйте. Может кто-нибудь помочь c пониманием как работает нижеследующий скрипт (сразу скажу - он рабочий, просто хочу наконец понять как точно он работает) ? Часть мне понятна, сам его несколько раз восстанавливал ибо для игры выходили патчи и ломали его, менялись адреса, поменялась инструкция раз и тд, но непонятная мне часть продолжала работать исправно. [ENABLE]alloc(magnet,4096,"DAI.exe"+BCB4AA)label(returned)label(skipme)label(skipplayer)label(pcoord)label(mcoord)label(moffset)label(mcount)label(mmindist)label(mcalcdist)label(mconst)label(pangle)label(tests)registersymbol(mmindist)registersymbol(mcount)registersymbol(moffset)magnet:push raxpush rbxpush rdxpush rcxpush rdipush rsipush edx //1push rbxmov rbx,[DAI.exe+160B8D0]mov rbx,[rbx+98]mov rbx,[rbx+28]mov rbx,[rbx+0]mov rbx,[rbx+100]mov rbx,[rbx+10]mov rbx,[rbx+10]mov rbx,[rbx+1d0]mov rbx,[rbx+20]mov edx,[rbx+1a0]pop rbxcmp [rax+000001A0],edxpop edxjne testspush edxpush rbxmov rbx,[DAI.exe+160B8D0]mov rbx,[rbx+98]mov rbx,[rbx+28]mov rbx,[rbx+0]mov rbx,[rbx+100]mov rbx,[rbx+10]mov rbx,[rbx+10]mov rbx,[rbx+1d0]mov rbx,[rbx+20]mov edx,[rbx+1a8]pop rbxcmp [rax+000001A8],edxpop edxje skipplayer //1{let's just check this isn't the player}//mov ebx,[[[[[[[DAI.exe+FDB074]+74]+B8]+8]+14]+1B0]+10]//cmp ebx,eax//je skipplayer{copy player coords}tests:push edx //2push rbxmov rbx,[DAI.exe+160B8D0]mov rbx,[rbx+98]mov rbx,[rbx+28]mov rbx,[rbx+0]mov rbx,[rbx+100]mov rbx,[rbx+10]mov rbx,[rbx+10]mov rbx,[rbx+1d0]mov rbx,[rbx+20]mov edx,[rbx+1a0]pop rbxmov [moffset+4],edxpop edxpush edxpush rbxmov rbx,[DAI.exe+160B8D0]mov rbx,[rbx+98]mov rbx,[rbx+28]mov rbx,[rbx+0]mov rbx,[rbx+100]mov rbx,[rbx+10]mov rbx,[rbx+10]mov rbx,[rbx+1d0]mov rbx,[rbx+20]mov edx,[rbx+1a8]pop rbxmov [moffset+C],edxpop edxpush edxpush rbxmov rbx,[DAI.exe+160B8D0]mov rbx,[rbx+98]mov rbx,[rbx+28]mov rbx,[rbx+0]mov rbx,[rbx+100]mov rbx,[rbx+10]mov rbx,[rbx+10]mov rbx,[rbx+1d0]mov rbx,[rbx+20]mov edx,[rbx+1a4]pop rbxmov [moffset+8],edxpop edx//2mov [mmindist],(float)5000mov [moffset],(float)1//3add rbx,1A0mov rsi,rbxmov rdi,pcoordcldmov rcx,2rep movsb //3//jmp skipplayer{copy monster coords}add rax,1A0mov rsi,raxmov rdi,mcoordcldmov rcx,2rep movsbsub rax,1A0{calculate distance}movss xmm0,[pcoord]movss xmm1,[mcoord]subss xmm0,xmm1mulss xmm0,xmm0movss [mcalcdist],xmm0movss xmm0,[pcoord+4]movss xmm1,[mcoord+4]subss xmm0,xmm1mulss xmm0,xmm0movss [mcalcdist+4],xmm0movss xmm0,[pcoord+8]movss xmm1,[mcoord+8]subss xmm0,xmm1mulss xmm0,xmm0movss [mcalcdist+8],xmm0movss xmm0,[mcalcdist]movss xmm1,[mcalcdist+4]addss xmm0,xmm1movss xmm1,[mcalcdist+8]addss xmm0,xmm1movss [mcalcdist+c],xmm0fld dword ptr [mcalcdist+c]fsqrtfstp dword ptr [mcalcdist+c]{test distance}movss xmm0,[mcalcdist+c]movss xmm1,[mmindist]cmpss xmm0,xmm1,1movss [mcalcdist+C],xmm0cmp [mcalcdist+C],0je skipme{increment monster counter}mov rcx,[mcount]inc rcxmov [mcount],rcx{get orientation}//mov ebx,[[[[DAI.exe+FDB074]+74]+B4]+A8]// movss xmm0,[ebx+54]//movss xmm0,[ebx]//addss xmm0,[mconst+4]//mulss xmm0,[mconst]//movss [pangle],xmm0{calculate sine/cosine pair}fld dword ptr [pangle]fsincosfstp dword ptr [pangle+4]fstp dword ptr [pangle+8]{calculate offsets}movss xmm0,[pcoord]addss xmm0,[moffset+4]movss xmm1,[moffset]mulss xmm1,[pangle+8]subss xmm0,xmm1movss [mcoord],xmm0movss xmm0,[pcoord+4]addss xmm0,[moffset+8]movss [mcoord+4],xmm0movss xmm0,[pcoord+8]addss xmm0,[moffset+C]movss xmm1,[moffset]mulss xmm1,[pangle+4]subss xmm0,xmm1movss [mcoord+8],xmm0{assign new coords to "previous" vector}add rax,1A0mov rsi,mcoordmov rdi,raxcldmov rcx,crep movsb{assign new coords to "next" vector}add rax,20mov rsi,mcoordmov rdi,raxcldmov rcx,crep movsbskipme:pop rsipop rdipop rcxpop rdxpop rbxpop rax{old scope}movaps xmm0,[rax+000001A0]jmp returnedskipplayer:mov [mcount],0 {start counting from zero again}pop rsipop rdipop rcxpop rdxpop rbxpop raxmovaps xmm0,[rax+000001A0]jmp returnedpcoord:dq 0dq 0dq 0pangle:dq 0dq 0dq 0mcoord:dq 0dq 0dq 0mcount:dq 0mcalcdist:dq 0dq 0dq 0dq 0mmindist:dq (float)10moffset:dq (float)5dq (float)0dq (float)0dq (float)0mconst:dq (float)3.14159265dq (float)1dq (float)-1{blank out the call to fall timer test (I think?)}//"DAI.exe"+34139D://nop//nop//nop//nop//nop{hook magnet at per-critter position update code}"DAI.exe"+BCB4AA:jmp magnetnopnopreturned:[DISABLE]"DAI.exe"+BCB4AA:movaps xmm0,[rax+000001A0]unregistersymbol(mmindist)unregistersymbol(mcount)unregistersymbol(moffset)dealloc(magnet)
  13. Инструкция вообще не имеет отношения к координатам.. У меня есть структура заклинаний. Там можно изменить кол-во вылетающих снарядов, скорость, траекторию и даже дочерние части спелла, прикрепленные к заклинанию. Т.е. изменяя числа и id в этой структуре можно создавать свои уникальные заклинания. Так вот, я написал скрипт, который приделан к удару правой рукой (инструкция считывается пока нажата кнопка удара, успевает за 1 нажатие проработать раз 15-20), сразу после срабатывания этой инструкции я вписал свои mov [xxx],(float)xx или mov [xxx],#xx и так далее, где вместо [xxx] - адреса, в которые я хочу внести изменения (и которые не имеют отношения к выполняемой инструкции), а в (float)xx - новые значения. Так вот некоторые адреса, изменяемые таким образом, дают нужный результат, а другие нет, хотя если менять их вручную - все выдают нужный результат. Телепорт я привел только в качестве примера тк это один из вариантов, в которых такая подмена работала неверно. Вот и хочу понять где зарыта собака.. скрипт выкладывать нет смысла мне кажется - стандартный шаблон, сразу после оригинальной инструкции (повторюсь, не имеющей отношения к изменяемым адресам) эти строки с подменой значений в адресах. Или так вообще не стоит делать? И еще, эти адреса, которые пытаюсь изменить таким способом - статические.
  14. А может кто-нибудь ответить еще на 1 вопрос - почему некоторые адреса, изменяемые через скрипт, работают иначе, чем при ручном изменении? Простой пример: я нашел адрес с координатами героя (там их было штук 100 для каждой координаты, я выбрал нужный), если вручную, через таблицу, поменять значение, то происходит телепорт и все нормально. Но если в этот адрес занести нужное значение через скрипт (записью вида: mov [xxxxxxxx],(float)xx ), то происходит лишь иллюзия телепорта - герой перемещается на нужный участок, но при любом движении сразу же возвращаетя назад. Я обратил внимание, что при ручном изменении все оставшиеся 99 адресов также изменяются на то, что я ввел в первый адрес. А при изменении скриптом они остаются прежними, меняется только тот, в который я занес значение, что и заставляет, видимо, персонажа вернуться назад. Как с этим бороться, что сделать, чтобы при изменении адреса через скрипт эффект был бы аналогичен ручному изменению?
  15. Да, так тоже работает, адрес максимальных жизней лежал в [rbx+170]. Но уже получилось и по другому сделать, запись вида: cmp rbx,000007FFEFDE9A40je exitoriginalcode:cmp dword ptr [rbx+00000168],00exit:jmp returnhereОказалась неисправной, а вот так: push raxmov rax,000007FFEFDE9A40cmp rbx,raxje exitoriginalcode:cmp dword ptr [rbx+00000168],00exit:pop raxjmp returnhereзаработало. Не понимаю в чем разница, какие еще сюрпризы принесет 64 разрядность.. причем если бы я напрямую сравнивал не с адресом жизней, а с каким-нибудь "0" - простым числом, то фильтр сработал бы сразу.
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.