Модификация игры ASM/C++ Часть 2.

Тема в разделе "Уроки, Создание читов и трейнеров, исходники", создана пользователем RedYu, 25 июл 2016.

  1. Оффлайн

    RedYu

    На форуме с:
    25 июл 2016
    Сообщения:
    6
    Симпатии:
    4
    Баллы:
    2
    Пол:
    Мужской
    Всем, привет!
    Сразу же продолжу тему про модификацию игры Plants vs Zombies. Так как в прошлой части ничего интересного не было, а лишь только то что мы создали DLL, и подключили её к игре.
    Это не очень интересно так как наша DLL пока еще ничего не делает полезного.
    И так первое что нам понадобится это инициализация (запуск) нашей DLL в игре.

    Сначала нужно подготовить наш проект, а именно нужно написать функции для работы с памятью игры. Чтобы не изобретать велосипед я нашел хороший пример в интернете.



    Это мне понравилось не только тем что позволяет писать в память, а еще есть дефайны для проверки офстета и размера объекта. Что очень полезно при правильном создании классов игры.

    CompileTimeSizeCheck
    CompileTimeOffsetCheck


    Так же создадим файлик Global.h
    В котором напишем следующее


    Инклуды
    PHP:
    #include "Enumerations.h"
    #include "Structures.h"
    Вспомогательные внутри их мы будем писать найденные в игре структуры и перечисления, для глобального доступа по всему проекту.

    Подключим наш файлик в stdafx.h

    PHP:
    #pragma once

    #include "Global.h"
    На этом подготовка проекта закончена.

    Теперь приступим к инициализации нашей DLL в игре.
    Для того чтобы проверить к какой игре подключена DLL. Мы в IDA Pro перейдем по адресу 0x401000 и скопируем первые 8 байт нашей игры.

    Код:
    00401000  53 55 57 8B CE E8 76 AE  14 00 8B 44 24 10 C7 06  SUWЛ+шvо..ЛD$.¦.
    53 55 57 8B CE E8 76 AE - в памяти эти байты будут размещены в обратном порядке то есть вот так AE 76 E8 CE 8B 57 55 53

    Теперь напишем функцию инициализации нашей библиотеки.


    Не забудьте запустить нашу функцию в DllMain

    PHP:
        case DLL_PROCESS_ATTACH:
            
    DllInitializer(hModule);
            break;
    Компилируем и убеждаемся что это работает с игрой. То есть процесс открыт для работы с ним.

    Для примера, в первой части мы помним что патчили функцию __fptrap.
    Давайте вернем её прежнее состояние, мы заменили 2 байтика 6A 02 на C3 90.

    Код:
    .text:006B5B17 nullsub_4       proc near               ; DATA XREF: .data:off_718908
    .text:006B5B17                                         ; .data:off_71890C ...
    .text:006B5B17                 retn
    .text:006B5B17 nullsub_4       endp
    .text:006B5B17
    .text:006B5B17 ; ---------------------------------------------------------------------------
    .text:006B5B18                 db 2
    .text:006B5B19 ; ---------------------------------------------------------------------------
    .text:006B5B19                 call    __amsg_exit
    .text:006B5B1E                 pop     ecx
    .text:006B5B1F                 retn
    Для того чтобы изменить их через нашу DLL нам нужно узнать адрес в памяти игры. Помним что она была размещена по адресу 006B5B17. Почему мы здесь выбрали этот адрес, а не 002B4F17 смещение, спросите вы, а всё потому что мы будем работать с виртуальным адресом, а не с самим файлом игры. То было смещение именно в файле, а здесь это уже адрес в памяти.
    То есть приложение запуститься и адреса уже будут виртуальные.

    Теперь вернёмся к коду.
    Для того чтобы записать 2 байта в память будем использовать функцию WriteMemoryWORD(...), так как WORD занимает 2 байта, это то что нам нужно.

    Вместо функции
    PHP:
    MessageBox(NULL_T("DLL PROCESS ATTACH"), _T("DLL"), MB_OK MB_ICONINFORMATION);
    PHP:
    WriteMemoryWORD(0x006B5B170x026A);
    Скомпилируем и убедимся что при завершении игры вернулась наша ошибка
    Runtime error R6002 floating point not loaded

    Хотя если мы откроем EXE файл в WinHex и посмотрим что в нем ничего не изменилось. Мы видим байты C3 90. Магия? Теперь объясню что произошло.
    Когда начала запускаться игра, наша библиотека в памяти игры изменила байтики, а не в EXE файле.
    Мы могли бы пропатчить нашу программу и без WinHex. Это уже кому как удобней.

    На этом конец этой части. Следующая часть будет еще интересней этойsmile-z

    Если нужен исходник:
    PlantsVsZombies.rar
    --- Добавлено, 26 июл 2016, Дата первого сообщения: 25 июл 2016 ---
    https://www.virustotal.com/ru/file/...c7a123f8f70d671632eba6a2/analysis/1469530487/
     
    Rango нравится это.
  2.  

Поделиться этой страницей

Уважаемый пользователь!

Мы обнаружили, что вы блокируете показ рекламы на нашем сайте.

Просим внести его в список исключения или отключить AdBlock.

Наши материалы предоставляются БЕСПЛАТНО и единственным доходом является реклама.

Спасибо за понимание!