Всем, привет!
На сегодняшний день когда в мире много различных игр, так же много игроков которые в них играют, большинство этих игроков хотят упростить прохождение конкретной игры.
Они используют различные трейнеры, читы, программы такие как: Cheat Engine, ArtMoney. Эти программы позволяют изменять значения в памяти игры.
Например у игрока 100 золота, с помощью этих программ он может изменить это количество на любое другое.
Но есть так же люди которые разрабатывают читы к играм, им намного интересней разобраться как игра работает(взглянуть на её изнутри) нежели играть в эту игру
Здесь я хочу поделится своим опытом в модификации игр с новичками которые хотят научится создавать читы к играм, а так же изменить что-то в игре.
Я буду показывать именно пример модификации(изменения игры), внедрение своего кода в игру.
Скажу сразу я не профессионал в этом деле. Так же хочу услышать советы людей которые многое прошли в обратной разработке приложений.
Для начала нужно сказать про приложения которые будут помогать в создании модификации.
Дизассемблер - IDA Pro + Hex Rays;
Cheat Engine - для поиска значений в памяти игры;
CFF Explorer - для подключения своей DLL к приложениям; (Об этом чуть позже);
Писать модификацию я буду на VC++ с использованием WINAPI;
PEID - анализатор исполняемых файлов. Хорошо определяет многие упаковщики и протекторы; (Можно еще использовать DIE);
ReClass - для удобного создания классов разных объектов в игре;
WinHex - для патчинга приложений.
Этого достаточно для написания своей первой модификации.
В качестве примера я буду писать модификацию для игры Plants vs Zombies.
Первое что нам надо сделать это скачать и проанализировать игру. Запустим программу PEID и выберем EXE файл игры.
[Ссылки могут видеть только зарегистрированные пользователи. ]
На скриншоте видно что игра написана на VC++, а так же то что она не упакована и не защищена протекторами.
Следующий этап это написание своей DLL и подключение её к игре.
Создадим в Visual Studio проект Win32 DLL.
И напишем следующий код:
Код:
__declspec(dllexport) BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
MessageBox(NULL, _T("DLL PROCESS ATTACH"), _T("DLL"), MB_OK | MB_ICONINFORMATION);
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
Компилируем с конфигурацией Release. И копируем DLL в папку с игрой.
[Ссылки могут видеть только зарегистрированные пользователи. ]
Теперь запускаем CFF Explorer и подключаем нашу DLL к игре.
На всякий случай сделаем backup нашего EXE, если что-то пойдет не так чтобы можно было восстановить все в исходное состояние.
Открываем в этой программе PlantsVsZombies.exe и переходим на вкладку Import Adder.
Нажимаем на кнопку Add и выбираем нашу DLL. Внизу появится список функций которые экспортируются, выбираем DllMain и нажимаем Import By Name.
[Ссылки могут видеть только зарегистрированные пользователи. ]
Причина ее возникновения следующая: программа была скомпилирована с Microsoft.VC80.CRT и в ней проверяются атрибуты секций. Которые мы изменили
Для исправления этой проблемы нужно пропатчить в исполняемом файле функцию __fptrap, которая и отвечает за появление этого сообщения об ошибке.
Запускаем дизассемблер IDA Pro и ждем когда она проанализирует всю игру.
Находим функцию __fptrap.
Код:
.text:006B5B17 __fptrap proc near ; DATA XREF: .data:off_718908
.text:006B5B17 ; .data:off_71890C ...
.text:006B5B17 push 2
.text:006B5B19 call __amsg_exit
.text:006B5B1E pop ecx
.text:006B5B1F retn
.text:006B5B1F __fptrap endp
Следующее что нам надо сделать так это изменить её действие например забить всё NOP'ами или сделать вначале вместо push 2, сразу же выход retn.
[Ссылки могут видеть только зарегистрированные пользователи. ]
И видим что в файле они находятся по смещению 002B4F17, переходим в WinHex по этому смещению. И изменяем наш байтик на C3 90. Нопить не обязательно, можно просто изменить первый байт. Теперь сохраняем изменения.
Проверим что мы записали с помощью IDA Pro. Запустим снова анализ приложения.
Код:
.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
Теперь осталось лишь проверить игру на наличие этой ошибки. Запустим её и убедимся что ошибки больше нет.
Если нужен исходник:
[Ссылки могут видеть только зарегистрированные пользователи. ]
[Ссылки могут видеть только зарегистрированные пользователи. ]
Скоро напишу продолжение...
Последний раз редактировалось VOLKyiv; 25.07.2016 в 02:16.