Пишем трейнер на Visual Basic
До сих пор в журнале мы учили вас ломать игры и изготавливать для них
трейнеры с помощью таких программ, как MTC и ему подобных. Теперь же рассмотрим
более продвинутый вариант — попробуем научиться программировать трейнеры своими
силами. Зачем? А затем, что трейнеры, написанные самим на любом языке
программирования, имеют намного более широкие возможности. Во-первых,
поскольку вы сами пишете код, то, соответственно, знаете, где там что, и
получаете возможность настраивать трейнер так, как вам нужно, учитывая любые
мелочи. Во-вторых, такие трейнеры занимают небольшой объем памяти. Ну а
в-третьих, намного приятней юзать собственную прогу, а также показывать и дарить
ее своим знакомым. Но, разумеется, надо хотя бы немного знать какой-нибудь язык
программирования и разбираться в шестнадцатеричных кодах. Неважно, на каком
языке писать трейнер, общий принцип будет примерно тем же. Здесь мы рассмотрим
написание трейнеров на Visual Basic, так как этот язык — один из наиболее
простых и его легче осваивать начинающим. Если же вы хорошо разбираетесь в
программировании, то можете использовать любой другой язык.
Все, что нужно, это Visual Basic,
желательно не ниже 5-й версии, и программа для поиска адресов памяти. В качестве
последней вполне можно использовать тот же самый Magic Trainer Creator (MTC).
Также можно воспользоваться теми адресами, которые мы публикуем в
“шестнадцатеричном” разделе “КОДекса”.
Windows API — функции
Любое Windows-приложение использует так называемые стандартные
API-функции.
Вначале поговорим о тех функциях, которые понадобятся при
написании простейшего трейнера. О том, куда это все писать и как, будет
рассказано позже.
FindWindow (ClassName, “заголовок окна”) — с помощью этой функции
программа ищет окно по его заголовку. В скобках указывается класс окна и, через
запятую, в кавычках его заголовок. В Visual Basic любую функцию надо
“декларировать”, т.е. как бы описать машине, что это функция из себя
представляет. Выглядит это так: Declare Function FindWindow Lib “user32” Alias
“FindWindowA” (ByVal lpClassName As String, ByVal lpWindowName As String) As
Long. Я не буду подробно пояснять смысл этих слов, так как в этой строке менять
вам все равно ничего не придется, какую бы игру вы ни взяли.
GetWindowThreadProcessId
(WindowHandle, ProcessId) — перехватывает управление из FindWindow и возвращает
идентификатор процесса (ProcessId), который нужен для управления этим процессом.
Это описывается так: Declare Function GetWIndowProcessId Lib “user32” (ByVal
hwnd As Long, lpdwProcessId As Long) As Long
OpenProcess (DesiredAccess, Inherit, ProcessId) — эта
функция возвратит управление игре. Потом это можно использовать для записи и
чтения данных. DesiretAccess определяет права доступа к данным игры. Здесь мы
укажем полный доступ: PROCESS_ALL_ACCESS. Inherit всегда должен иметь значение
False. ProcessId устанавливается такой же как в функции, описанной в пункте 2.
Описывается все это так: Declare Function OpenProcess Lib “kernel32” (ByVal
dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As
Long) As Long
CloseHandle (ProcessHandle) — закрывает все открытые
программой процессы. Описывается так: DeclareFunction CloseHandle Lib “kernel32”
(ByVal hObject As Long) As Long
WriteProcessMemory (ProcessHandle, Address, Value, SizeofValue,
BytesWritten) — записывает значение в адрес игры. Декларируется так: Declare
Function WriteProcessMemory Lib “kernel32” (ByVal hProcess As Long, ByVal
lpBaseAddress As Any, ByVal lpBuffer As Any, ByVal nSize As Long,
lpNumberOfBytesWritten As Long) As Long
ReadProcessMemory (ProcessHandle, Address, Value, SizeofValue,
BytesWritten) — читает значение из адреса игры. Описывается: Declare Function
WriteProcessMemory Lib “kernel32” (ByVal hProcess As Long, ByVal lpBaseAddress
As Any, ByVal lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As
Long) As Long
Это пока что
все функции Windows, которые понадобятся. Вы можете использовать еще и другие,
если знаете их и если это вам понадобится для расширения возможностей. Прочитать
подробней про них можно в хелпах и в соответствующей литературе.
Если вы ничего не поняли из сказанного
выше, а под рукой не нащупывается книги по Visual Basic, то пока что продолжайте
читать дальше — по ходу разберетесь.
Простейший трейнер
Шаг первый — поиск адреса
Вначале ищем адрес. Для примера возьмем игру SimCity 3000 Holiday Theme Edition. Вы можете искать адрес любой удобной для вас программой, но здесь я объясню, как искать, на примере Magic Trainer Creator (МТС). Запустим игру, затем MTC. В поле Process ID выбираем запускаемый файл игры (Sc3.exe). Выбираем режим поиска Normal, в поле Value to search вводим текущую сумму денег. Нажимаем Start. По завершении поиска (нужный адрес, скорее всего, не будет найден с первого раза) возвращаемся в игру и меняем количество денег (строим новое недорогое здание, чтобы потратить немного). Затем в MTC ставим в поле Value to search новое количество денег и нажимаем Continue. Проделываем все это несколько раз, пока не найдем один адрес. У меня этот адрес был 235B218, но у вас может быть и другой. Адрес надо будет указывать в программе сразу после знаков &H без пробелов — это указывает программе, что мы используем шестнадцатеричные значения. Выглядеть будет так: &H235B218. Теперь на всякий случай проверим, правильно ли найден адрес. Щелкаем по нему, чтобы добавить в нижнее поле, затем щелкаем по нему там. В поле Monitor нажимаем кнопку в левом верхнем углу и в появившемся окне меняем первые 2 бита на FF FF. Нажимаем кнопку в нижнем правом углу окна для возврата в основное окно MTC. В поле Monitor нажимаем среднюю нижнюю кнопку. Возвращаемся в игру и смотрим, изменилось ли количество денег. Если да, тогда выписываем найденный адрес на бумагу — он нам пригодится при создании трейнера. Конечно, здесь можно ограничиться этим и создать трейнер в MTC. Но мы-то собрались писать трейнер сами. Выходим из MTC и игры и продолжаем читать статью дальше.
Шаг второй — написание трейнера
Запускайте Visual Basic. Начните новый проект и
выберите Standard EXE. В окне Properties в поле Caption
можете оставить свое название для заголовка окна вместо принятого по
молчанию Form1. Добавьте1 Textbox, 1 Button и Timer.
Выделите только что добавленное текстовое поле (Textbox) и сотрите в окне
Properties в поле Text название text1 — текстовое поле нужно для
записи желаемого значения. Выделите добавленный таймер (Timer) и в окне
Properties в поле Interval поставьте 500 — это частота обновления
значения в игре (заморозка).
Выделите добавленную
кнопку (Button), и в окне Properties в поле Caption сможете поставить свое
наименование кнопки (она нужна для записи в игру набранного нами в текстовом
поле трейнера значения). Выберите в меню Project опцию Add Module,
чтобы добавить новый модуль в программу. В окне Project перейдите в этот модуль
и наберите указанные ниже строчки. Каждая новая строка начинается со слова
Declare и должна быть набрана в одну строку (здесь некоторые строчки
могут быть напечатаны с переносом):
Теперь перейдите в Form1, щелкнув по ней в окне Project. Вы увидите исходный экран с образом вашего будущего трейнера. Щелкните в любом месте этого окна правой кнопкой мыши и выберите пункт View Code. Напоминаю, что адрес, который я использовал здесь и в котором хранится инфа о деньгах, был у меня 235B218, но у вас может быть и другой. А заголовок окна игры в моей версии был Sim City 3000. У вас заголовок может несколько отличаться, и узнать вы его можете, переключившись из игры по Alt+Tab — заголовок написан на кнопке свернутого окна. Теперь наберите весь написанный ниже текст программы (после знака ‘ следуют комментарии, которые можно и не писать):
Вот вроде и все. Теперь нажмите в меню File->Make Project1.exe,
чтобы создать запускаемый файл вашего трейнера. Не забудьте предварительно
сохранить проект и вообще почаще сохраняйтесь в процессе написания программы,
чтобы вернуться, если что, к первоначальному рабочему ее варианту. Вот теперь
уже можно испытать трейнер в работе. Не забудьте, что вначале нужно запускать
игру, а затем уже трейнер.
Прочие игры ломаются
аналогичным образом.
Засим прощаюсь, желаю вам
всяческих успехов во взломе. Удачных экспериментов!
Комментарии |
отсутствуют |
Добавление комментария |