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

[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

 

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

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

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.

 

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

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

 

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

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

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

В 10.01.2019 в 20:39, Xipho сказал:

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

 

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

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

46 минут назад, qymb сказал:

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

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

  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

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

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