This page has been robot translated, sorry for typos if any. Original content here.

Написання трейнерів для ігор (games trainer)

інтро:

Всі ми колись, давно або недавно, грали в ігри - в настільні, спортивні, а c впровадженням у наше життя обчислювальної техніки і в комп'ютерні. В силу свого віку, звичок, або просто бажання розслабиться і підняти настрій після важкого робочого дня.

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

Зрозуміло, що при створенні ігор, розробники насамперед керуються якщо не своїм смаком, то смаком керівника проекту, іноді статистикою. Але ж іноді так і хочеться, щоб ефекти уповільнення з Матриці, перекочували в гру Індіана Джонс, а не самий повороткі герой ігрової індустрії - кілер Hitman, навчився бігати по стінах. Для цих цілей і створюються трейнери.

теорія:

Трейнер (англ. Trainer) - програма, призначена для зміни поведінки гри, зазвичай працює безпосередньо з оперативною пам'яттю комп'ютера.

У 1980-х і 1990-х роках, тренери зазвичай вбудовувалися хакерами прямо в код ігор. При запуску, спочатку запускався тренер з діалоговим вікном "Ви хочете використовувати чіти?", Далі виконувався код гри. У назві тренера використовувалися знаки додавання (+), по одному на кожну опцію тренера. Наприклад, "Група Хакерів представляє: Doom +++" - три опції, наприклад, безсмертя, нескінченна амуніції і телепортація.

Сучасні ж тренери, зазвичай запускається як окрема програма, до гри, і в своїх назви використовують один знак додавання з числом опцій після нього, наприклад, "Doom Trainer +15". Крім того, сучасні тренери працюють з оперативною пам'яттю гри, а не її виконуваним файлом, оскільки внесення змін до виконуваний файл ускладнюється системами захисту від копіювання.

методи:

Для створення тренерів використовуються дампер пам'яті, отладчики і дизасемблери. Найпростіший спосіб створити тренер - пошук значення в пам'яті, що збігається з потрібним ігровим параметром. Потім змінити його і пошукати в отриманому списку знову. Після декількох ітерацій швидше за все залишиться невеликий список адрес, значення за якими можна спробувати змінити. Існує безліч утиліт таких як: ArtMoney, Cheat'o'Matic - автоматизують процес пошуку і зміни значень.

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

Підіб'ємо підсумок - так що ж таке, DMA? DMA (Dynamic Memory Allocation) - це динамічний розподіл пам'яті. Простіше кажучи, DMA гри, на відміну від не DMA ігор, зберігають використовувані ними значення за адресами в пам'яті, які змінюються після кожного запуску гри. Всі ігри під DOS - не використовують DMA, в той час як більшість ігор під Win32 його використовують.


Практика:

У цій статті я буду розглядати прінцип написання трейнерів для DMA і не-DMA ігор. В рунеті зовсім мало інформації на цю тему, вже наявні приклади коду, написання тренерів часто не перевірялися на практиці, а значить можуть просто заплутати новачків. Все що нам потрібно так це мова програмування Delphi і відладчик TSearch.
  1. Чи не DMA гри:

Запускаємо TSearch. Натиснувши Open Process, вибераем зі списку цікавить нас процес. Далі, використовуючи пошук шукаємо, відсіюємо а потім і визначаємо адресу цікавить значення. Як приклад я буду розглядати гру GTA - Vice City. Цікавий праметров - час.

Як бачите, коду по мінімуму, я не став використовувати перевірок на існування вікна програми. Так як сенсу в тому щоб згортати-розгортати додаток не бачу, набагато практичніше буде пользоватьсялюбим Джойнер і склеїти файл гри і трейнер воєдино.

 var
 Form1: TForm1;
 WindowName: integer;
 ProcessId: integer;
 ThreadId: integer;
 HandleWindow: Integer;
 write: cardinal;

 buf: dword;
 const 
 WindowTitle = 'GTA: Vice City'; 
 Address = $ 0097F266; 
 NumberOfBytes = 4; 

 implementation

 {$ R * .dfm}

 procedure s1ow_mode; 
 begin
 WindowName: = FindWindow (nil, WindowTitle); 
 ThreadId: = GetWindowThreadProcessId (WindowName, @ ProcessId);
 HandleWindow: = OpenProcess (PROCESS_ALL_ACCESS, False, ProcessId);
 buf: = $ 3E90;
 WriteProcessMemory (HandleWindow, ptr (address), @buf, 4, write);
 end;

 procedure nos1_mode; 
 begin
 WindowName: = FindWindow (nil, WindowTitle); 
 ThreadId: = GetWindowThreadProcessId (WindowName, @ ProcessId);
 HandleWindow: = OpenProcess (PROCESS_ALL_ACCESS, False, ProcessId);
 buf: = $ 3F80;
 WriteProcessMemory (HandleWindow, ptr (address), @buf, 4, write);
 end;

 procedure TForm1.Timer1Timer (Sender: TObject);
 begin
 if (GetAsyncKeyState (VK_LBUTTON) <> 0) then 
 begin
 s1ow_mode;
 end;
 if (GetAsyncKeyState (VK_RBUTTON) <> 0) then
 begin
 nos1_mode;
 end;
 end; 


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