qymb Опубликовано 9 января, 2019 Поделиться Опубликовано 9 января, 2019 Попытался я двумя способами найти адрес нитро в Need for Speed: Most Wanted. 1. https://www.youtube.com/watch?v=UKnDkq13Rgc Здесь все действия выполняются с помощью авто ассемблера Но мне это надо написать на с++ Потом я наткнулся на вопрос на форуме cheatengine. https://forum.cheatengine.org/viewtopic.php?t=531960&sid=4212af98a5403a96bcbba55deb9615ae Проблема в том, что там код на delphi (в самом низу). Я попытался его переделать на с++ : Спойлер #include <iostream> #include <windows.h> int main() { HWND hwnd; DWORD procID; HANDLE handle; byte lpBuffer[] = { 0x3f, 0x80, 0x00, 0x00 }; int nitro = 0; hwnd = FindWindow(NULL, TEXT("Need for Speed™ Most Wanted")); if (hwnd == 0)std::cout << "cannot find window"; else { GetWindowThreadProcessId(hwnd, &procID); handle = OpenProcess(PROCESS_ALL_ACCESS, NULL, procID); if (procID == 0) std::cout << "cannot open process"; else { while (!GetAsyncKeyState(VK_F7)) { WriteProcessMemory(handle, (LPVOID)0x00692A96, lpBuffer, sizeof(lpBuffer), NULL); WriteProcessMemory(handle, (LPVOID)0x00692AFA, lpBuffer, sizeof(lpBuffer), NULL); } } } system("pause"); return 0; } Игра не крашится, но и не работает как надо. А именно не работает клавиша использования нитро (она как-будто заморожена). 2. https://www.youtube.com/watch?v=EjGXKguBghs&t=1s С помощью этого видео я нашёл адрес нитро. Правда он оказался динамическим. После этого я нашёл рабочий указатель и не знаю, что делать дальше. В геймхакинге и реверсе я новичок, но прошу помочь кто может. Ссылка на комментарий Поделиться на другие сайты Поделиться
JustHack Опубликовано 9 января, 2019 Поделиться Опубликовано 9 января, 2019 (изменено) [censored] Изменено 11 апреля, 2020 пользователем JustHack Ссылка на комментарий Поделиться на другие сайты Поделиться
qymb Опубликовано 10 января, 2019 Автор Поделиться Опубликовано 10 января, 2019 (изменено) Alloc(Mem,4) Mem: dd 3F800000 00692A96: Fld Dword ptr [Mem] 00692AFA: Fld Dword ptr [Mem] Вот это было под этим видео https://www.youtube.com/watch?v=UKnDkq13Rgc Код на форуме: https://forum.cheatengine.org/viewtopic.php?t=531960&sid=4212af98a5403a96bcbba55deb9615ae Правда это делфи и я не знаю работает он вообще или нет)) Изменено 10 января, 2019 пользователем Xipho Нужно использовать коды для форматирования сообщений. Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 10 января, 2019 Поделиться Опубликовано 10 января, 2019 25 минут назад, qymb сказал: Правда это делфи и я не знаю работает он вообще или нет)) Тебе @JustHack в посте выше почти напрямую намекнул. Я же скажу без намеков. while (!GetAsyncKeyState(VK_F7)) { WriteProcessMemory(handle, (LPVOID)0x00692A96, lpBuffer, sizeof(lpBuffer), NULL); WriteProcessMemory(handle, (LPVOID)0x00692AFA, lpBuffer, sizeof(lpBuffer), NULL); } В этом куске кода логика следующая: Выполнять запись в два адреса, пока не будет нажата клавиша F7. То есть, после запуска, у тебя постоянно будет идти запись в вышеуказанные адреса. Но как только ты нажмешь F7, сразу произойдет выход из цикла и больше ничего писаться не будет. Ошибку в логике видишь? Ссылка на комментарий Поделиться на другие сайты Поделиться
qymb Опубликовано 10 января, 2019 Автор Поделиться Опубликовано 10 января, 2019 while (true) { Sleep(100); if (GetAsyncKeyState(VK_MENU)) { WriteProcessMemory(handle, (LPVOID)0x00692A96, lpBuffer, sizeof(lpBuffer), NULL); WriteProcessMemory(handle, (LPVOID)0x00692AFA, lpBuffer, sizeof(lpBuffer), NULL); } } я это исправил, но всё равно не могу понять почему не работает кнопка? Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 10 января, 2019 Поделиться Опубликовано 10 января, 2019 В общем, судя по всему, ты совершенно ничего пока не понимаешь в программировании трейнеров. Ты использовал функцию записи в память. А что это за адреса, в которые ты пишешь? За что они отвечают? Судя по твоему же скрину выше, у тебя должно быть считывает цепочки указателей, и запись в финальный адрес. Но в коде у тебя совершенно другое. В общем, смотри. На твоем скрине я выделил "отправной" адрес, с которого нужно начинать считывать цепочку указателей Алгоритм следующий: 1. Находишь базовый адрес модуля (NFS.exe, или как он там у тебя прописан в том поле ввода, которое я указал). 2. К нему прибавляешь первое смещение (005352B0 на твоем скрине). Это получится базовый статический адрес указателя 3. К базовому статическому указателю прибавляешь первый оффсет (у тебя это 4). Из полученного адреса считываешь значение. 4. К полученному значению прибавляешь следующий оффсет (у тебя он тоже равен четырем). Из полученного адреса снова считываешь значение. 5. К этому значению добавляешь следующей оффсет (у тебя это АС). Из полученного адреса считываешь следующее значение 6. К этому значению добавляешь следующий оффсет (80 в хексе (! это важно) и последний уровень). Из полученного адреса считываешь значение. Это будет твой адрес закиси (нитро) 7. В этот полученный адрес записываешь нужное число (буфер у тебя правильный) с помощью WriteProcessMemory. Все эти шаги нужно, естественно, выполнять в цикле, поскольку ты хочешь заморозить закись, а не заполнить ее один раз. Чтобы запустить этот цикл независимо от основного потока выполнения (а это нужно, иначе будет криво работать) тебе нужно будет написать функцию, и создавать с этой функции поток. Но это уже программирование, и про это тебе придется почитать самостоятельно. Кстати, если посмотреть на твой скрин, то там четко будет видно вычисление всех уровней указателя по тому алгоритму, что я описал (справа от оффсетов показаны цифры вычисления). Действуй, и все у тебя получится Ссылка на комментарий Поделиться на другие сайты Поделиться
JustHack Опубликовано 10 января, 2019 Поделиться Опубликовано 10 января, 2019 (изменено) [censored] Изменено 11 апреля, 2020 пользователем JustHack Ссылка на комментарий Поделиться на другие сайты Поделиться
qymb Опубликовано 11 января, 2019 Автор Поделиться Опубликовано 11 января, 2019 (изменено) В 10.01.2019 в 20:39, Xipho сказал: Действуй, и все у тебя получится Я нашёл базовый адрес модуля и он равен 400000, только я не могу понять, почему при добавлении [400000 + 005352B0] -> 02C0C370 ? Если должно быть 596D30 Изменено 11 января, 2019 пользователем Xipho В угол! Не нужно цитировать все сообщение целиком. Ссылка на комментарий Поделиться на другие сайты Поделиться
partoftheworlD Опубликовано 11 января, 2019 Поделиться Опубликовано 11 января, 2019 46 минут назад, qymb сказал: только я не могу понять, почему при добавлении [400000 + 005352B0] -> 02C0C370 ? Указатель. Адрес [4000000 + 005352B0] указывает данные внутри 45352B0, которые равны 0x2C0C370. 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
qymb Опубликовано 12 января, 2019 Автор Поделиться Опубликовано 12 января, 2019 Спасибо большое! Если надо, могу скинуть готовый код Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения