Написання трейнеров для ігор (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.
- Чи не 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;
захист:
Якщо в грі є офіційна таблиця рекордів або гра є мережевий і не всі розрахунки йдуть на стороні сервера, то існування тренерів губить гру. У цьому випадку доводиться вбудовувати систему захист від тренерів, оскільки системи захисту від копіювання не справляються з цим завданням. Для цього найважливіші ігрові параметри шифруються і розшифровуються на короткий час перед використанням або створюється зашифрована копія з якою оригінальний параметр постійно порівнюється. Для уникнення таких захистів не обійтися без дизассемблирования програми.
Коментарі
Коментуючи, пам'ятайте про те, що зміст і тон Вашого повідомлення можуть зачіпати почуття реальних людей, проявляйте повагу та толерантність до своїх співрозмовників навіть у тому випадку, якщо Ви не поділяєте їхню думку, Ваша поведінка за умов свободи висловлювань та анонімності, наданих інтернетом, змінює не тільки віртуальний, але й реальний світ. Всі коменти приховані з індексу, спам контролюється.