special

This webpage has been robot translated, sorry for typos if any. To view the original content of the page, simply replace the translation subdomain with www in the address bar or use this link.

Написание трейнеров для игр (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;


Защита:
Если в игре имеется официальная таблица рекордов или игра является сетевой и не все расчеты идут на стороне сервера, то существование тренеров губит игру. В этом случае приходится встраивать систему защиту от тренеров, поскольку системы защиты от копирования не справляются с этой задачей. Для этого важнейшие игровые параметры шифруются и расшифровываются на короткое время перед использованием или создается зашифрованная копия с которой оригинальный параметр постоянно сравнивается. Для обхода таких защит не обойтись без дизассемблирования программы.




Дата створення/оновлення: 25.05.2018

';>