Техническая поддержка :

Современные решения

для защиты Windows программ

и восстановления исходного кода
Автор: Ivanov Ivanovich Дата публикации: 31.5.04

Пишем трейнер на 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 и должна быть набрана в одну строку (здесь некоторые строчки могут быть напечатаны с переносом):
   

CODE NOW!
Declare Function FindWindow Lib “user32” Alias “FindWindowA” (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    Declare Function GetWindowThreadProcessId Lib “user32” (ByVal hwnd As Long, lpdwProcessId As Long) As Long
    Declare Function OpenProcess Lib “kernel32” (ByVal dwDesiredAcess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
    Declare Function WriteProcessMemory Lib “kernel32” (ByVal hProcess As Long, ByVal lpBaseAdress As Any, ByVal lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
    Declare Function ReadProcessMemory Lib “kernel32” (ByVal hProcess As Long, ByVal lpBaseAddess As Any, ByVal lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWriten As Long) As Long
    Declare Function CloseHandle Lib “kernel32” (ByVal hObject As Long) As Long

    Теперь перейдите в Form1, щелкнув по ней в окне Project. Вы увидите исходный экран с образом вашего будущего трейнера. Щелкните в любом месте этого окна правой кнопкой мыши и выберите пункт View Code. Напоминаю, что адрес, который я использовал здесь и в котором хранится инфа о деньгах, был у меня 235B218, но у вас может быть и другой. А заголовок окна игры в моей версии был Sim City 3000. У вас заголовок может несколько отличаться, и узнать вы его можете, переключившись из игры по Alt+Tab — заголовок написан на кнопке свернутого окна. Теперь наберите весь написанный ниже текст программы (после знака ‘ следуют комментарии, которые можно и не писать):
   
CODE NOW!
Private Sub Command1_Click() ‘ Объявляем некоторые необходимые моменты для кнопки.
    Dim hwnd As Long ‘ удерживает управление, переданное функцией Find Window.
    Dim pid As Long‘ используется для хранения идентификатора процесса.
    Dim pHandle As Long‘ держит управление процессом.
    ‘ Ищем окно игры и, если игра не запущена, выдаем сообщение об ошибке.
    hwnd = FindWindow(vbNullString, “Sim City 3000”)
    If (hwnd = 0) Then
    MsgBox “Window not found!”
    Exit Sub
    End If
    ‘ Теперь можно определить идентификатор процесса.
    GetWindowThreadProcessId hwnd, pid
    ‘ Используем этот идентификатор для получения управления процессом.
    pHandle = OpenProcess(PROCESS_ALL_ACCESS, False, pid)
    If (pHandle = 0) Then
    MsgBox “Couldn't get a process handle!”
    Exit Sub
    End If
    ‘ Теперь можно записать новое значение в память по нужному адресу.
    WriteProcessMemory pHandle, &H235B218, “Beans”, 5, 0&
    ‘ Прекращаем управлять процессом.
    CloseHandle hProcess
    End Sub
    Private Sub ReadTimer_Timer()
    ‘ Объявляем некоторые необходимые моменты для таймера.
    Dim hwnd As Long‘ удерживает управление, переданное функцией FindWindow.
    Dim pid As Long ‘ удерживает идентификатор процесса.
    Dim pHandle As Long ‘ удерживает управление процессом.
    Dim str As String * 20 ‘ параметр текстовой строки.
    ‘ Вначале ищем окно игры.
    hwnd = FindWindow(vbNullString, “Sim City 3000”)
    If (hwnd = 0) Then Exit Sub
    ‘ Теперь можно определить идентификатор процесса.
    GetWindowThreadProcessId hwnd, pid
    ‘ Используем идентификатор для управления процессом.
    pHandle = OpenProcess(PROCESS_ALL_ACCESS, False, pid)
    If (pHandle = 0) Then Exit Sub
    ‘ Теперь можно прочитать из памяти...
    ReadProcessMemory pHandle, &H235B218, str, 20, 0&
    ‘ ... и показать строку в текстовом поле трейнера.
    txtDisplay = str
    ‘ Прекращаем управлять процессом.
    CloseHandle hProcess
    End Sub

   

Вот вроде и все. Теперь нажмите в меню File->Make Project1.exe, чтобы создать запускаемый файл вашего трейнера. Не забудьте предварительно сохранить проект и вообще почаще сохраняйтесь в процессе написания программы, чтобы вернуться, если что, к первоначальному рабочему ее варианту. Вот теперь уже можно испытать трейнер в работе. Не забудьте, что вначале нужно запускать игру, а затем уже трейнер.
    Прочие игры ломаются аналогичным образом.
    Засим прощаюсь, желаю вам всяческих успехов во взломе. Удачных экспериментов!

Комментарии

отсутствуют

Добавление комментария


Ваше имя (на форуме):

Ваш пароль (на форуме):

Комментарии могут добавлять только пользователи,
зарегистрированные на форуме данного сайта. Если Вы не
зарегистрированы, то сначала зарегистрируйтесь тут

Комментарий:





Главная     Программы     Статьи     Разное     Форум     Контакты