Модификация игры ASM/C++ Часть 2. - Форум администраторов игровых серверов
Форум администраторов игровых серверов StormWall - Защита от DDos атак
Регистрация Мнения Справка Пользователи Календарь Все разделы прочитаны
Вернуться   Форум администраторов игровых серверов > Полезное / Common > Программирование / Programming

Программирование / Programming
Ищете помощи в написании программы, есть сложность в выполнении задания (в институте и т.д.), пожалуйста, спросите у нас в данном форуме и мы обязательно вам поможем.

Ответ
Опции темы
Непрочитано 27.07.2016, 14:04   #1
Аватар для VOLKyiv
Пользователь

Автор темы (Топик Стартер) Модификация игры ASM/C++ Часть 2.

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

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

Utils.h:
Свернуть ↑Развернуть ↓


Utils.cpp:
Свернуть ↑Развернуть ↓


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

CompileTimeSizeCheck
CompileTimeOffsetCheck


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

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

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

DllInitializer:
Свернуть ↑Развернуть ↓


Не забудьте запустить нашу функцию в 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. Это уже кому как удобней.

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

Если нужен исходник:
PlantsVsZombies.rar

1 часть
VOLKyiv вне форума Ответить с цитированием
Сказали спасибо:
Ответ

Метки
модификация игры, создание чита


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Модификация игры ASM/C++ Часть 1. VOLKyiv Программирование / Programming 0 27.07.2016 13:59
Модификация клиента raindew Игровой клиент 3 19.01.2015 14:59
Giran 2.0. Модификация Respect Курилка / Yak floor 30 29.07.2012 21:30
Визуальная часть игры Ajax52 Документация 5 04.01.2012 21:10
Часть Клиента и часть серверная DRAGYN Lineage II 3 20.02.2011 00:25


© 2007–2024 «Форум администраторов игровых серверов»
Защита сайта от DDoS атак — StormWall
Работает на Булке неизвестной версии с переводом от zCarot
Текущее время: 18:33. Часовой пояс GMT +3.

Вверх