Створюємо трейнер в Дельфи, використовуючи winapi

У цьому підручнику я збираюся описати основний API, необхідний для створення трейнера в Дельфи. Основи знання Дельфі кращі, але Дельфі тож досить простий в освоєнні.

Ось що нам треба для цього:

Число байт, яке ми хочемо писати
У тому значенні, яке ми отримали вище, ми повинні знати також скільки байт це займе в пам'яті. Наприклад, число 32 займе лише 1 байт, але FF07 займе вже два байта. У загальному випадку, дві цифри будуть займати один байт.

Ми збираємося використовувати Win32 API щоб записувати значення в пам'ять іншого процесу. Ось ті функції, які ми будемо використовувати. По порядку:

FindWindow
GetWindowThreadProcessID
OpenProcess
ReadProcessMemory
WriteProcessMemory
CloseHandle

(Прочитайте опису цих функцій в файлі Win32.hlp (або MSDN - прім.пер.) Для повного опису.)

Я буду показувати лише основи, так що початківці можуть просто копіювати код з цього документа і вставляти його в свій проект.)

Отже, початок. По-перше, ми оголошуємо наші змінні. Скопіюйте та вставте це в свій проект:

Var WindowName. integer;
ProcessId. integer;
ThreadId. integer;
buf. PChar;
HandleWindow. Integer;
written. cardinal;

Тепер треба оголосити наступні константи. Скопіюйте та цей розділ. Ці константи встановлюються відповідно до того, що ви записали вище.

Const WindowTitle = 'prog test';
Address = $ 41D090;
PokeValue = $ 32;
NumberOfBytes = 1;

Тепер, щоб записати значення, ви повинні отримати хендл пам'яті гри. Неможливо зробити це в одну дію, тому ми зробимо наступне.

Отримуємо хендл головного вікна

З цим хендлов ми отримуємо ідентифікатор процесу (process identifier - pID)

З цим pID, ми отримуємо хендл області пам'яті.

З цим хендлом ми можемо починати хакати.

По-перше, нам треба отримати хендл головного вікна. Використовуємо функцію FindWindow

WindowName: = FindWindow (nil, WindowTitle);
If WindowName = 0 then
begin
MessageDlg ( 'Гра повинна бути запущена до трейнера.
Запустіть її, потім трейнер ', mtwarning, [mbOK], 0);
end;

Зауважимо, що код перевіряє, чи рівний нулю хендл цього вікна. Якщо воно дорівнює, це означає, що гра не запущена, так що ми попереджаємо користувача і говоримо йому про те, щоб він запустив гру.

Тепер нам потрібен pID. Ми використовуємо функцію GetWindowThreadProcessId. Після цього ми отримуємо хендл області пам'яті через OpenProcess. Скопіюйте код, наведений нижче.

ThreadId: = GetWindowThreadProcessId (WindowName, @ ProcessId);
HandleWindow: = OpenProcess (PROCESS_ALL_ACCESS, False, ProcessId);

Ось воно. Тепер нам треба використовувати WriteProcessMemory щоб писати щось всередині цього хендлом. Як тільки ми це зробимо, ми закриваємо хендл. Так прийнято. Так безпечно. Скопіюйте код, наведений нижче:

GetMem (buf, 1);
buf ^: = Chr (PokeValue);
WriteProcessMemory (HandleWindow, ptr (Address), buf, NumberOfBytes, write);
FreeMem (buf);
CloseHandle (HandleWindow);

Ось вихідний код для всього трейнера. Для початківців програмістів, щоб швидко зробити трейнер, потрібно тільки поміняти константи, оголошені на початку програми.

Var WindowName. integer;
ProcessId. integer;
ThreadId. integer;
buf. PChar;
HandleWindow. Integer;
write. cardinal;
Const WindowTitle = 'prog test';
Address = $ 41D090;
PokeValue = $ 32;
NumberOfBytes = 1;

WindowName: = FindWindow (nil, WindowTitle);
If WindowName = 0 then
begin
MessageDlg ( 'Гра повинна бути запущена до трейнера.
Запустіть її, потім трейнер ', mtwarning, [mbOK], 0);
end;

ThreadId: = GetWindowThreadProcessId (WindowName, @ ProcessId);
HandleWindow: = OpenProcess (PROCESS_ALL_ACCESS, False, ProcessId);

GetMem (buf, 1);
buf ^: = Chr (PokeValue);
WriteProcessMemory (HandleWindow, ptr (Address), buf, NumberOfBytes, write);
FreeMem (buf);
CloseHandle (HandleWindow);
end;

Схожі статті