Пишем простейший трейнер (на примере Star Wars: Galactic Battlegrounds)

Тема в разделе "Программирование читов", создана пользователем leshiy, 8 май 2016.

  1. leshiy

    leshiy
    Expand Collapse
    Пизжю лопатой, переезжаю вены коньками, в ЛС
    Команда форума Админ

    Регистрация:
    1 фев 2016
    Сообщения:
    1.166
    Симпатии:
    1.248
    Привет, народ. Учимся писать трейнер на более менее нормальном ЯП (языке программирования)

    Если везде почти все исходники либо на асме (ассемблере), либо на си или си ++, то мы же будем писать на PureBasic'е, который отлично для этого годится, как я считаю. Он не такой сложный в использовании, не такой страшный в создании проектов, как студия, поэтому он мне так нравится. К тому же он не сильно уступает по возможностям тому же С++.

    ЯП платный, но немного погуглив можно найти и бесплатные версии. У меня версия 5.30 х32 плюс установлены пользовательские библиотеки, самая полезная это DroopyLib, она в свободном доступе, установите сами, надеюсь)
    Внешне похожа на простой редактор текстовых документов.
    [​IMG]




    Начнём с взлома самой игры)
    качаем игру, у меня версия 1.001 или около того, это не важно
    Не умеем искать значения? Да и вообще ничего не умеем? Открываем YouTube, ищем канал Михаила Ремизова aka keng с форума gamehacklab(<--на этом сайте тоже полно всяких полезных уроков)
    И вообще, по хорошему без знаний, которые Михаил может вам дать, сюда, и вообще в эту сферу, не лезть. Тупо потеряете время)

    Как итог, имеем указатель на указатель на указатель на адрес (звучит нелепо, выглядит страшно, по факту это очень полезная штука=))
    Вот так выглядит
    [​IMG]
    (По секрету скажу, что если мы в верхней строке заменим 0 на 4, 8 или C, то получим остальные адреса ресурсов)
    Так, теперь сам трейнер!)

    Для начала трейнеру нужно найти игру, потом открыть процесс игры для записи и чтения
    у меня процесс игры называется battlegrounds_x1.exe
    Пишем такой код

    game_pid=GetPidProcess("battlegrounds_x1.exe") ;Получаем ID процесса по его имени
    If game_pid=0 ;если не удалось найти
    MessageBox_(#HWND_DESKTOP, "Игра не найдена!", "", #MB_ICONERROR) ;говорим, что не нашли
    End ;завершаем процесс трейнера
    EndIf

    Знак # означает не хэштэг, инстаграмщики, а константу)
    Так, идентификатор процесса есть, теперь нужно открыть его с правами на запись и чтение в его память
    Пишем код

    hProcess=OpenProcess_(#PROCESS_VM_WRITE|#PROCESS_VM_OPERATION|#PROCESS_VM_READ, #False, game_pid) ;Открываем процесс с правами на запись и чтение памяти
    If hProcess=0 ;если не удалось открыть
    MessageBox_(#HWND_DESKTOP, "Не удалось получить права на запись и чтение памяти", "", #MB_ICONERROR) ;говорим, что не открыли
    End ;завершаем процесс трейнера
    EndIf

    Наблюдательные заметили, что после знака ; можно писать комментарии к коду)

    Отлично, игру нашли, открыли с правами на запись, осталось записать. это самое важное в трейнере - правильно всё записать)
    Пишем (или ктрл+ц ктрл+в как прошлые два раза) такой код

    ReadProcessMemory_(hProcess, GetModuleHandle_(0)+$38F440, @pointer1, SizeOf(integer), @NumberOfBytesRead) ;читаем, помещаем результат в pointer1
    ReadProcessMemory_(hProcess, pointer1+$FC, @pointer2, SizeOf(integer), @NumberOfBytesRead) ;читаем из pointer1+смещение FC, помещаем результат в pointer2
    ReadProcessMemory_(hProcess, pointer2+$AC, @pointer3, SizeOf(integer), @NumberOfBytesRead) ;читаем из pointer2+смещение AC, помещаем результат в pointer3

    Здесь знак доллара означает, что число будет записано в шестнадцатиричной системе, а знак @ означает указатель на переменную
    Итого, в переменной pointer3 у нас будет лежать адрес значения еды у нас в наличии

    Осталось записать туда нужное кол-во (к примеру 999999)

    food.f=999999 ;говорим, что у нас будет переменная типа float
    WriteProcessMemory_(hProcess, pointer3, @food, SizeOf(float), @NumberOfBytesWritten) ;записываем в память

    Заходим в игру, проверяем. Лично у меня всё получилось. Не сложно по аналогии сделать такие же действия и для других ресурсов, учитывая, что в памяти их адреса расположены рядом)

    carbon.f=999999 ;говорим, что у нас будет переменная типа float
    WriteProcessMemory_(hProcess, pointer3+$4, @carbon, SizeOf(float), @NumberOfBytesWritten) ;записываем в память
    ore.f=999999 ;говорим, что у нас будет переменная типа float
    WriteProcessMemory_(hProcess, pointer3+$8, @ore, SizeOf(float), @NumberOfBytesWritten) ;записываем в память
    nova.f=999999 ;говорим, что у нас будет переменная типа float
    WriteProcessMemory_(hProcess, pointer3+$C, @nova, SizeOf(float), @NumberOfBytesWritten) ;записываем в память

    Запускаем, проверяем, всё отлично работает и будет работать даже после перезапуска игры\системы, переустановки игры\системы.

    Примечание:
    WinAPI функции в бейсике пишутся со знаком подчёркивания после заголовка функции.

    На этом пока всё, в сл. раз напишем уже улучшенный вариант этого трейнера с помощью code injection. Что это такое? Бегом на канал к человеку, имя которого я указал в начале темы
    Всем спасибо, вопросы пишем в комменты)
     
    Anchous нравится это.
  2. Anchous

    Anchous
    Expand Collapse
    Анчоувс
    Команда форума Админ

    Регистрация:
    13 дек 2015
    Сообщения:
    1.342
    Симпатии:
    846
    интересная статья, всем советую к прочтению.
     
  3. Drafys

    Drafys
    Expand Collapse
    Пользователь

    Регистрация:
    27 июл 2016
    Сообщения:
    54
    Симпатии:
    0
    Хороший гайд
     
  4. CrossBite

    CrossBite
    Expand Collapse
    Пользователь

    Регистрация:
    27 июл 2016
    Сообщения:
    65
    Симпатии:
    6
    Классный гайд
     
  5. oxxxy555

    oxxxy555
    Expand Collapse
    Пользователь

    Регистрация:
    27 июл 2016
    Сообщения:
    82
    Симпатии:
    22
    все довольно понятно
     
  6. Xuiter

    Xuiter
    Expand Collapse
    Пользователь

    Регистрация:
    30 июл 2016
    Сообщения:
    81
    Симпатии:
    3
    Ясно, спасибо