Как сделать трейнер для игры
Создание трейнера своими руками
Представьте себе ситуацию: вы никак не можете пройти уровень в любимой игрушке, и при этом к ней не существует читов. Что делать? Правильно, нужно воспользоваться трейнером.
Трейнер — это небольшая программа, с помощью которой можно изменять некоторые параметра игры.
Предположим, вы запустили игру, в которой у вас 10 жизней. С помощью трейнера можно изменить количество жизней, например, с 10 до 100, или вовсе сделаться бессмертным. Трейнеры предоставляют несравнимо большие возможности, чем обыкновенные коды. Вообще большинство геймеров старается пользоваться именно трейнерами, а не обычными кодами.
Принцип работы этой программы таков. Игра загружает некоторые данные в оперативную память. В их число входят количество жизней, деньги и многие другие игровые параметры. Трейнер, включаемый после запуска игры, занимается тем, что меняет или “замораживает” эти параметры прямо в оперативной памяти.
Для создания трейнера существует много различных программ. Одной из самых распространенных является Magic Trainer Creator (далее MTC), скачать который можно, например, с сайт или сайт . Поэтому создавать трейнер мы будем с ее помощью.
Как искать неизвестные значения
Например, вы хотите бесконечные жизни в GTA Vice city. Сначала запускаем MTC, затем игру. Запоминаем количество жизней и переключаемся в MTC нажатием ALT+TAB. Далее следуйте инструкции:
1. Переключитесь в режим PID LOCK (рис. 1) и выберите из списка запущенную игру.
2. Выберите алгоритм поиска Normal.
3. В окне ввода значения для поиска (Value to search) наберите количество жизней в игре.
4. Нажмите кнопку Start.
5. После того, как поиск будет закончен, переключитесь обратно в игру.
6. Потратьте немного жизней. К примеру, их у вас осталось 90.
7. Переключитесь в MTC.
8. В окне ввода значения для поиска наберите 90.
9. Нажмите кнопку Continue.
10. По окончании поиска переключитесь в игру.
11. Повторяйте эти действия, пока не останется только одно значение.
Находить и “замораживать” таким образом можно не только численные значения, но и бары (полоски силы, выносливости и т.д.)
Когда вы нашли нужное значение, вы можете изменить его или “заморозить” — не давать ему изменяться:
1. Выберите частоту обновления значения. Чем правее указатель, тем быстрее будет обновляться адрес. Если вы не знаете, что выбрать, — доведите указатель до правой границы.
2. Сделайте двойной щелчок по кнопке Freeze.
Теперь значение не должно меняться.
Изменить значение на нужное вам:
1. Выберите адрес.
2. Введите нужное значение.
3. Нажмите Poke.
4. Если вы изменили значения по нескольким адресам, то можете нажать кнопку Poke All, чтобы внести сразу все изменения.
Помните, что значения тоже должны вводится в HEX-формате. То есть цифра 75, которую вы видите на картинке, вовсе не будет 75 жизнями в игре (рис. 2). На самом деле их будет 117, т.к. 75 в шестнадцатеричной системе исчисления (которая и называется HEX) равно 117 в десятичной. Чтобы вы не запутались, в программу встроен калькулятор. Как правило, аналогичные программы позволяют вводить значения в десятеричной системе исчисления.
Создание трейнера
Теперь, когда мы научились находить значения и работать с ними, пора приступить к созданию трейнера. Перед этим надо сохранить “замороженное” или измененное вами значение. Нажмите кнопку save и сохраните значение параметра в файл, место которого нужно указать на диске. Он может быть сохранен в любую папку.
Файл будет иметь расширение *.gtc. Теперь приступим непосредственно к созданию трейнера.
Нажмите на кнопку, изображенную на рис. 3. Откроется окно создания трейнера.
Теперь вам необходимо ввести следующую информацию:
TITLE: заголовок трейнера.
MADE BY: кем сделан.
DATE: когда был создан.
FOR: для какой игры.
INFO: пишите, что хотите.
EXE NAME: имя файла, который сгенерирует MTC.
EMPTY: здесь мы открываем сохраненные значения и даем им имя, которое хотим видеть на кнопке трейнера (ее тоже нужно указать). Важно, чтобы эти клавиши не совпадали с клавишами управления в самой игре. Очень часто модерируемые параметры заводятся на F1-F12, которые могут использоваться игрой.
Рядом с этой надписью — место для галочки. Если галочка стоит, значение по данному адресу будет заморожено. Если галочки нет, значение будет записано лишь один раз и потом может измениться.
В левом нижнем углу находится опция Auto PID: если она не отмечена, то в получившемся трейнере можно будет использовать только горячие клавиши, если отмечена — можно управлять действиями трейнера из него самого, нажимая кнопки.
Когда все будет заполнено, нажмите на кнопку генерации трейнера, и он будет записан в директорию с MTC. Вы узнаете его по названию и иконке, изображающей молнии на зеленом фоне.
Конечно, Magic Trainer Creator далеко не единственная программа такого рода. Есть и аналогичные, например, ArtMoney или DetectiveStory. Принцип работы у них одинаков. Если вы захотите воспользоваться другими программами для создания трейнера, то вот линки на них:
Как создать трейнер для игр?
Вам понадобится
Программа Magic Trainer Creator
Инструкция
1
Загрузите программу Magic Trainer Creator и игру. Перейдите в режим PID LOCK, выберите из перечня название игры. Затем обозначьте алгоритм поиска Normal. В окне ввода значения для поиска укажите количество жизней в игре. Запустите процесс.
2
После завершения поиска переключитесь в игру. «Истратьте» часть жизней, снова зайдите в Magic Trainer Creator. Введите в окне ввода значения для поиска конкретное число жизней, нажмите Continue.
Реклама 25
3
Перейдите в игру. Эти действия повторяйте до тех пор, пока не останется только одно значение. Далее выберите частоту обновления значения. Для этого укажите точное значение или доведите указатель до правой границы. Нажмите два раза на Freeze.
4
Выберите адрес, введите требуемое значение. Запустите Poke. Сохраните значение параметра в файл, указав его место на диске. Его расширение будет *.gtc.
5
Откройте окно создания трейнера. Введите в соответствующие поля заголовок трейнера; сведения о том, кем, когда и для какой игры он сделан. Укажите имя файла, который сгенерирует Magic Trainer Creator.
6
Откройте сохраненные значения, обозначьте их каким-то именем. Нажмите на кнопку генерации трейнера.
Совет 2: Как создавать трейнеры
Создание трейнеров, как считают многие игроманы – это занятие для новичков. Трейнеры создаются только для того, чтобы появилась возможность у игрока пройти те уровни или миссии, с которыми он не может справиться. Всем известно, что игры разделяются по сложности прохождения игрового процесса. Есть игры, в которых чит-коды не предусмотрены. При использовании кодов могут появляться предупреждения об умеренном их использовании, трейнеры помогают избегать таких случаев.
Как создавать трейнеры
Вам понадобится
Программное обеспечение Magic Trainer Creator.
Инструкция
1
Одна из наиболее простых программ по созданию трейнеров – Magic Trainer Creator. После запуска программы происходит копирование части кода игры, который находится в оперативной памяти. В скопированном коде игры находятся такие параметры, как количество жизней, денег, манны, силы и т. д. В программе Magic Trainer Creator вы находите необходимые значения, затем просто их замораживаете, т. е. они не меняются.
2
После запуска игры необходимо открыть игру. Перейдите в программу, активируйте режим PID (Process ID), выберите игру, а также алгоритм поиска Normal. Введите искомое число в поле Value to search, затем нажмите кнопку Start.
3
Перейдите в игру, чтобы изменить искомое значение. Снова вернитесь к программе, измените значение, затем нажмите кнопку Continue. Проделайте эту процедуру несколько раз до максимального уменьшения искомого значения.
4
Для заморозки найденного значения захватите мышкой полоску обновления и протяните ее вправо до конца, затем нажмите кнопку Freeze. Для сохранения созданного значения для трейнера нажмите кнопку Save, укажите расположение сохраняемого файла на диске.
5
В главном окне программы вам необходимо заполнить все информационные поля и нажать на кнопку создания трейнера. Файл трейнера стоит искать в папке программы.
Яндекс. Директ
Как сделать трейнер для игры
Пишем trainer для игры
Лично я считаю, что любая игра должна доставлять в первую очередь радость и глубокое удовлетворение, а не бурю негативных эмоций от того, что уже в сотый раз не можешь пройти очередного босса. Поэтому я всегда играю на самых легких уровнях с использованием всех доступных чит-кодов, трейнеров, прохождений и т.п. Но сегодня речь не об этом, а о том, как пишутся трейнеры.
Игра “Air Xonix”
В качестве “тренируемой” игрушки сегодня будет Air Xonix. Будем делать так, чтобы жизни в игре никогда не заканчивались. Игру сперва надо довести до ума, чтобы остался чистый исполняемый файл, после этого можно приступать к исследованиям.
Первый инструмент, который нам понадобится, это ArtMoney. Она умеет сканировать память для поиска каких-то определенных значений, отсеивать изменения, редактировать и замораживать значения ячеек памяти и т.п. Подробнее о возможностях ArtMoney прочитайте на офсайте. В принципе, вечные жизни в игре можно сделать средствами самой ArtMoney, но в данном случае для нас это будет только вспомогательный инструмент. И нам будет достаточно даже бесплатного варианта, который можно свободно скачать с офсайта и использовать без регистрации.
Ищем значение жизней в ArtMoney
Запускаем и начинаем игру, ставим на паузу во время игрового процесса, переключаем в ArtMoney и выбираем ее процесс по заголовку окна. Теперь нам надо найти значение жизней. Сперва это будет 4. Нажимаем кнопку “Искать”, вводим значение “4” и выбираем тип значений для поиска.
Задаем тип искомых значений
По моему опыту чаще всего счетчики хранятся в целом виде или в 2 байтах (WORD), 4 байтах (DWORD) или 8 байтах (QWORD). Начинать поиск лучше с них, это значительно сократит диапазон поиска, особенно для малых значений. Найденных значений после первого поиска может быть (и будет!) очень много, а нам надо выбрать только нужные. Поэтому поиск разделяется на два этапа – поиск значений и отсев ненужных значений. В итоге получаем адреса, в которых находятся числа, и их можно изменить на нужные.
Отсеиваем изменившееся значение
Переключаемся на игру, снимаем ее с паузы, нарываемся на противника и теряем жизнь. Снова ставим на паузу, переключаемся в ArtMoney и ищем новое значение. Но на этот раз воспользуемся кнопкой “Отсеять”. Повторяем процедуру отсеивания до тех пор, пока в списке не останется только одно значение. В нашем случае это будет адрес 0257DA10. Мы выяснили адрес ячейки памяти, в которой хранится значение жизней. Теперь нам надо выяснить, какой код в исполняемом файле отвечает за изменение этого значения.
Ставим в отладчике точку останова на запись в память
Запускаем отладчик и аттачимся к процессу игры. Переходим в окне дампа на адрес 0257DA10 и ставим точку останова на запись в память по этому адресу. Отпускаем игру и снова нарываемся на противника, чтобы потерять еще одну жизнь.
Точка останова сработала
Отладчик остановится на вышеуказанном коде. Он очень простой и понятный. В регистр ESI загружается значение жизней, уменьшается на 1 (команда DEC), затем записывается обратно. То есть, чтобы стать бессмертным, надо заNOPить команду уменьшения регистра.
Патчим файл в памяти вручную
Прямо в отладчике заменяем команду DEC ESI на NOP. Теперь, по идее, значение жизней не должно уменьшаться.
Убираем точку останова
Чтобы каждый раз не активировался отладчик, снимаем точку останова с ячейки памяти. Снимаем игру с паузы в отладчике, переключаемся на игровой процесс и снова нарываемся на противника. Но на этот раз мы видим, что значение жизней остается прежним, оно не уменьшается. А если подобрать бонусную жизнь, то значение увеличивается. Все, секрет бессмертия в игре Air Xonix разгадан.
Можно пропатчить исполняемый файл и жизни будут всегда вечными. Но это история для другой сказки. Мы будем делать трейнер, который будет патчить код игры в памяти. Первый, простейший вариант трейнера – это лоадер. Он запускает игру, сразу же патчит ее в памяти и завершает свою работу. Из продвинутых функций есть только проверка содержимого памяти перед патчем, потому что трейнер должен работать только с определенной версией игры. Трейнер должен находиться там же, где и исполняемый файл игры.
section ‘.data’ data readable writeable
; Данные для патча
life db 090h
errt db ‘Error’,0 ; Заголовок сообщения об ошибке
err1 db ‘File not found: ‘ ; Сообщение об отсутствии файла
fname db ‘AirXonix.exe’,0 ; Имя исполняемого файла
err2 db ‘Incorrect game version’,0 ; Неправильная версия игры
; Данные для запуска процесса
sinfo STARTUPINFO
pinfo PROCESS_INFORMATION
section ‘.code’ code readable executable
start:
; Запустить процесс игры
invoke CreateProcess,fname,0,NULL,NULL,NULL,
NORMAL_PRIORITY_CLASS,NULL,NULL,sinfo,pinfo
or eax,eax
jnz start_ok
; Невозможно запустить процесс
invoke MessageBox,0,err1,errt,MB_OK
jmp loc_exit
start_ok:
; Прочитать 4 байта из места будущего патча
invoke ReadProcessMemory,[pinfo.hProcess],00419680h,tmp,4,NULL
; Контрольное содержимое участка памяти
cmp [tmp],09E0C14Eh
; Если все нормально, то пропатчить файл в памяти
je patch_memory
; Иначе завершить процесс и вывести сообщение о неправильной версии игры
invoke TerminateProcess,[pinfo.hProcess],0
invoke MessageBox,0,err2,errt,MB_OK
jmp loc_exit
patch_memory:
; Записать NOP вместо DEC ESI
invoke WriteProcessMemory,[pinfo.hProcess],00419680h,life,1,NULL
loc_exit:
invoke ExitProcess,0
section ‘.data’ data readable writeable
; Структуры для работы привилегиями
struct LUID
lowPart dd ?
HighPart dd ?
ends
struct LUID_AND_ATTRIBUTES
pLuid LUID
Attributes dd ?
ends
struct _TOKEN_PRIVILEGES
PrivilegeCount dd ?
Privileges LUID_AND_ATTRIBUTES
ends
; Константы для работы привилегиями
TOKEN_ADJUST_PRIVILEGES = 20h
TOKEN_QUERY = 8h
SE_PRIVILEGE_ENABLED = 2h
; Заголовок окна игры для поиска
wTitle db ‘Воздушный Ксоникс’,0
; Данные для патча
life db 090h
errt db ‘Error’,0
err1 db ‘Can not open process’,0
err2 db ‘Incorrect game version’,0
SE_DEBUG_NAME db ‘SeDebugPrivilege’,0
tmp dd ?
hProcess dd ?
udtLUID LUID
tkp _TOKEN_PRIVILEGES
TTokenHd dd ?
section ‘.code’ code readable executable
start:
; Повысить привилегии процесса
invoke GetCurrentProcess
invoke OpenProcessToken,eax,TOKEN_ADJUST_PRIVILEGES+TOKEN_QUERY,TTokenHd
or eax,eax
jz loc_exit
; Получить привилегии процесса
invoke LookupPrivilegeValue,NULL,SE_DEBUG_NAME,udtLUID
or eax,eax
jz loc_exit
; Повысить привилегии процесса
mov [tkp.PrivilegeCount],1
mov [tkp.Privileges.Attributes],SE_PRIVILEGE_ENABLED
mov eax,[udtLUID.lowPart]
mov [tkp.Privileges.pLuid.lowPart],eax
mov eax,[udtLUID.HighPart]
mov [tkp.Privileges.pLuid.HighPart],eax
invoke AdjustTokenPrivileges,[TTokenHd],0,tkp,0,0,0
find_window:
; Поиск окна запущенной игры
invoke FindWindow,NULL,wTitle
or eax,eax
jnz open_process
; Пауза, чтобы не нагружать процессор
invoke Sleep,1000
jmp find_window
open_process:
; Получить родительский процесс окна
invoke GetWindowThreadProcessId,eax,tmp
; Открыть процесс
invoke OpenProcess,PROCESS_ALL_ACCESS,FALSE,[tmp]
or eax,eax
jnz @f
; Невозможно открыть процесс игры для записи
invoke MessageBox,0,err1,errt,MB_OK
jmp loc_exit
@@:
mov [hProcess],eax
; Прочитать 4 байта из места будущего патча
invoke ReadProcessMemory,[hProcess],00419680h,tmp,4,NULL
; Если все нормально, то пропатчить файл в памяти
cmp [tmp],09E0C14Eh
je patch_memory
; Иначе вывести сообщение о неправильной версии игры
invoke MessageBox,0,err2,errt,MB_OK
jmp loc_exit
patch_memory:
; Записать NOP вместо DEC ESI
invoke WriteProcessMemory,[hProcess],00419680h,life,1,NULL
loc_exit:
invoke ExitProcess,0
section ‘.data’ data readable writeable
; Данные для патча
life db 99
errt db ‘Error’,0
err1 db ‘File not found: ‘
fname db ‘AirXonix.exe’,0
err2 db ‘Incorrect game version’,0
; Данные для запуска процесса
sinfo STARTUPINFO
pinfo PROCESS_INFORMATION
section ‘.code’ code readable executable
start:
; Запустить процесс игры
invoke CreateProcess,fname,0,NULL,NULL,NULL,
NORMAL_PRIORITY_CLASS,NULL,NULL,sinfo,pinfo
or eax,eax
jnz start_ok
; Невозможно запустить процесс
invoke MessageBox,0,err1,errt,MB_OK
jmp loc_exit
start_ok:
; Прочитать 4 байта из места будущего патча
invoke ReadProcessMemory,[pinfo.hProcess],00419680h,tmp,4,NULL
; Контрольное содержимое участка памяти
cmp [tmp],09E0C14Eh
; Если все нормально, то пропатчить файл в памяти
je patch_memory
; Иначе завершить процесс и вывести сообщение о неправильной версии игры
invoke TerminateProcess,[pinfo.hProcess],0
invoke MessageBox,0,err2,errt,MB_OK
jmp loc_exit
patch_memory:
; Записать 99 жизней в ячейку памяти
invoke WriteProcessMemory,[pinfo.hProcess],0257DA10h,life,1,NULL
; Небольшая пауза
invoke Sleep,500
; Процесс еще активен?
invoke GetExitCodeProcess,[pinfo.hProcess],tmp
cmp [tmp],STILL_ACTIVE
; Продолжаем патчить значение в памяти
je patch_memory
loc_exit:
invoke ExitProcess,0
Это всего лишь минимальные заготовки трейнеров, для понимания процесса их работы. Для полноценных релизов их, конечно же, надо доукомплектовать диалоговыми окнами, красивой графикой и музыкой, добавить включение-выключение по горячим клавишам и всякое такое. Но это уже вы можете сделать самостоятельно. Да и “тренировать” можно не только игры, но и другие программы, тут главное освоить принцип взаимодействия с памятью сторонних процессов.
В приложении примеры всех трех вариантов трейнеров с исходными текстами, описанные в статье. Они протестированы и работают с игрой Air Xonix версии 1.45.
Источники:
https://vrgames.by/node/5345/backlinks
https://otvet.mail.ru/question/43287806
https://www.manhunter.ru/assembler/767_pishem_trainer_dlya_igri.html