Тренеры игр — это программы, созданные для изменения памяти компьютерной игры , тем самым изменяя ее поведение с помощью адресов и значений, чтобы позволить мошенничество. Они могут «заморозить» адрес памяти , не позволяя игре понижать или изменять информацию, хранящуюся по этому адресу памяти (например, счетчик здоровья, счетчик боеприпасов и т. д.), или манипулировать данными по указанным адресам памяти в соответствии с потребностями человека, мошенничающего в игре.
В 1980-х и 1990-х годах трейнеры обычно интегрировались непосредственно в саму игру группами взломщиков . Когда игра запускалась впервые, трейнер загружался первым, спрашивая игрока, хочет ли он читерить и какие читы он хотел бы включить. Затем код переходил к самой игре. Эти встроенные трейнеры поставлялись с вступлениями о группах, выпускающих игру, и трейнер часто использовался для демонстрации навыков демо- кодирования группы взломщиков. [1] Некоторые из этих групп сегодня полностью сосредоточены на своей Демосцене . [2] В списках релизов и вступлениях групп взломщиков обученные игры были отмечены одним или несколькими знаками плюс после них, по одному для каждой опции или чита в трейнере, например: «Mega Krew представляет: Ms. Astro Chicken++ » . Современные трейнеры добавляют свои названия одним + или пишут «плюс» и номер, так как многие из них имеют несколько функций. Используемое число представляет собой количество модификаций, доступных трейнеру, например, «бесконечное здоровье» или «убийства с одного удара». Другое отличие — включение версии игры или источника цифровой загрузки игры. Например: «Hitman: Absolution Steam +11 Trainer», [3] «FEAR 3 v 1.3 PLUS 9 Trainer» и т. д. [4] [5]
Современные трейнеры также поставляются как отдельно загружаемые программы. Вместо того, чтобы напрямую изменять программирование игры, они изменяют значения, хранящиеся в памяти. Фактически, это стало настолько распространенным, что трейнеры сегодня, по определению, изменяют только память; изменение исполняемого файла игры не приветствуется, и такие программы считаются не настоящими трейнерами, а патчами.
При объектно-ориентированном программировании объекты памяти часто динамически хранятся в куче , но современные операционные системы используют рандомизацию адресного пространства (ASLR) . Поэтому единственный способ изменить такую память воспроизводимым образом — получить информацию изнутри игрового процесса. Для этого требуются методы обратной разработки, такие как API-подключение malloc () и free() , внедрение кода или поиск статических указателей доступа. Тренер становится активным, когда объект был выделен, и снова деактивируется, когда объект освобождается.
Современные операционные системы также поставляются с позиционно-независимыми исполняемыми файлами (PIE) для безопасности. Вместе с ASLR двоичные файлы загружаются в другой адрес виртуальной памяти при каждом выполнении кода. Это делает надежную модификацию значений статической памяти более сложной. Адрес загрузки должен быть определен и вычтен из найденного адреса памяти, чтобы получить смещение статической памяти. Это смещение часто является в точности адресом статической переменной в двоичном файле PIE. Например, инструмент Linux scanmem поддерживает PIE таким образом. [6] Для настроенного смещения памяти игровой тренер также определяет адрес загрузки и добавляет его обратно во время выполнения. Тот же метод можно использовать и для динамических библиотек .
Поиск и отслеживание указателей доступа, обратных указателям на статическую память, может быть обременительным. Он не предоставляет размер объекта, и если есть несколько объектов одного класса, их часто нельзя обработать правильно, так как между ними в куче могут быть, например, векторы или списки. Но преимущество в том, что этот метод можно использовать для присоединения к уже запущенному процессу, если он работает. Поддержка DMA (динамического распределения памяти) в Cheat Engine является примером этого.
API hooking работает совершенно иначе: предварительный загрузчик загружает библиотеку в игровой процесс при его запуске. Библиотека шпионит за динамическими выделениями памяти, и обнаружение начинается с их записи. При параллельном поиске в статической памяти можно сопоставить найденный адрес значения с уникальным выделением памяти. Идея состоит в том, чтобы закрыть игровой процесс сразу после того, как значение найдено, а объект все еще существует. Затем последнее совпадающее выделение памяти является правильным. Поэтому сопоставление его в обратном порядке является методом выбора. Размер объекта, а также смещение значения внутри него обнаруживаются, и адрес кода перехода назад в двоичном файле игры может быть определен с помощью обратной трассировки. Часто находится конструктор, и с его помощью можно отслеживать все объекты памяти, которые он выделяет. Библиотека в игровом процессе и игровой тренер должны взаимодействовать друг с другом посредством межпроцессного взаимодействия (IPC) . Недостаток в том, что это может быть обнаружено как вредоносное ПО . Но можно найти больше значений внутри объектов, выгрузив и сравнив их. Также адаптация к другим версиям игр и компиляторов становится простой, поскольку все, что требуется, это найти вызов библиотечной функции с известным параметром (размер объекта) в дизассемблировании. Например, бесплатный и открытый (FOSS) универсальный игровой тренажер "ugtrain" показывает, что этот метод полностью легален на примерах игр FOSS . [7]
В прошлом трейнеры часто кодировались на языке ассемблера или любом другом языке высокого уровня, доступном в то время. Сегодня трейнеры также можно создавать с помощью автоматизированных инструментов создания трейнеров, которым требуется только базовая информация о читах, такая как адрес и код инъекции, затем программа компилирует трейнер, используя предопределенные значения и настройки, не требующие никаких навыков программирования от конечного пользователя. Самым популярным инструментом создания трейнеров, используемым сегодня, является Cheat Engine , который поддерживает широкий спектр типов инъекций и указателей, другими инструментами, которые использовались в прошлом, но больше не применяются, являются Trainer Maker Kit, Game Trainer Studio и Trainer Creation Kit и т. д. [8] Некоторые из передовых методов, которые поддерживает трейнер Cheat Engine, включают инъекцию кода , сдвиг кода и гибкость и универсальность, предоставляемые его скриптами Lua [9] [10], которые постепенно вытеснили другие инструменты создания трейнеров, в которых отсутствовала поддержка некоторых из этих функций. [11]