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

[Need for Speed: Most Wanted] Вопрос по нахождению адреса нитро

Рекомендуемые сообщения

Попытался я двумя способами найти адрес нитро в 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

С помощью этого видео я нашёл адрес нитро. Правда он оказался динамическим. После этого я нашёл рабочий указатель и не знаю, что делать дальше.

F_o2oG5PS7U.jpg

 

В геймхакинге и реверсе я новичок, но прошу помочь кто может.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что ты делаешь тут?

 

while (!GetAsyncKeyState(VK_F7))
 {
   WriteProcessMemory(handle, (LPVOID)0x00692A96, lpBuffer, sizeof(lpBuffer), NULL);
   WriteProcessMemory(handle, (LPVOID)0x00692AFA, lpBuffer, sizeof(lpBuffer), NULL);
 }

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
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

 

gdzl5baMHAU.jpg

 

Правда это делфи и я не знаю работает он вообще или нет))

Изменено пользователем Xipho
Нужно использовать коды для форматирования сообщений.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
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, 

сразу произойдет выход из цикла и больше ничего писаться не будет. 

 

Ошибку в логике видишь?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
while (true)
            {
                Sleep(100);
                if (GetAsyncKeyState(VK_MENU))
                {                    
                    WriteProcessMemory(handle, (LPVOID)0x00692A96, lpBuffer, sizeof(lpBuffer), NULL);
                    WriteProcessMemory(handle, (LPVOID)0x00692AFA, lpBuffer, sizeof(lpBuffer), NULL);
                }                
            }

я это исправил, но всё равно не могу понять почему не работает кнопка?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В общем, судя по всему, ты совершенно ничего пока не понимаешь в программировании трейнеров. Ты использовал функцию записи в память.

А что это за адреса, в которые ты пишешь? За что они отвечают? Судя по твоему же скрину выше, у тебя должно быть считывает цепочки указателей, и запись в финальный адрес.

Но в коде у тебя совершенно другое. В общем, смотри. На твоем скрине я выделил "отправной" адрес, с которого нужно начинать считывать цепочку указателей

image.png

 

Алгоритм следующий:

1. Находишь базовый адрес модуля (NFS.exe, или как он там у тебя прописан в том поле ввода, которое я указал).

2. К нему прибавляешь первое смещение (005352B0 на твоем скрине). Это получится базовый статический адрес указателя

3. К базовому статическому указателю прибавляешь первый оффсет (у тебя это 4). Из полученного адреса считываешь значение.

4. К полученному значению прибавляешь следующий оффсет (у тебя он тоже равен четырем). Из полученного адреса снова считываешь значение.

5. К этому значению добавляешь следующей оффсет (у тебя это АС). Из полученного адреса считываешь следующее значение

6. К этому значению добавляешь следующий оффсет (80 в хексе (! это важно) и последний уровень). Из полученного адреса считываешь значение. Это будет твой адрес закиси (нитро)

7. В этот полученный адрес записываешь нужное число (буфер у тебя правильный) с помощью WriteProcessMemory.

 

Все эти шаги нужно, естественно, выполнять в цикле, поскольку ты хочешь заморозить закись, а не заполнить ее один раз.

Чтобы запустить этот цикл независимо от основного потока выполнения (а это нужно, иначе будет криво работать) тебе нужно будет написать функцию, и создавать с этой функции поток. Но это уже программирование, и про это тебе придется почитать самостоятельно. 

 

Кстати, если посмотреть на твой скрин, то там четко будет видно вычисление всех уровней указателя по тому алгоритму, что я описал (справа от оффсетов показаны цифры вычисления).

Действуй, и все у тебя получится :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
7 часов назад, qymb сказал:

не могу понять почему не работает кнопка?

Не гадай на кофейной гуще. Потрать пару дней на изучение основ. И потом ты сделаешь этот хак за 15 мин. А так и будешь еще неделю методом тыка ковырять.

Изменено пользователем JustHack

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
В 10.01.2019 в 20:39, Xipho сказал:

Действуй, и все у тебя получится :)

 

Я нашёл базовый адрес модуля и он равен 400000, только я не могу понять, почему при добавлении [400000 + 005352B0] -> 02C0C370 ? Если должно быть 596D30

Изменено пользователем Xipho
В угол! Не нужно цитировать все сообщение целиком.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
46 минут назад, qymb сказал:

только я не могу понять, почему при добавлении [400000 + 005352B0] -> 02C0C370 ?

Указатель. Адрес  [4000000 + 005352B0] указывает данные внутри 45352B0, которые равны 0x2C0C370.

  • Плюс 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо большое!

Если надо, могу скинуть готовый код

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

×

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

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