Сообщений: 17
Тем: 6
Зарегистрирован: Jul 2013
Репутация:
466
Всем, привет!
После первых двух частей где мы подготавливали свою DLL к бою
, в этой части я обещал что будет очень интересно.
А именно будет представлен сам процесс модификации, а именно мы будем в IDA Pro искать нам нужные функции и редактировать их.
Создадим класс FixGame.
И объявим статическую функцию Initialize
Эта функция будет главной, внутри её мы будем писать изменения. И она будет вызываться внутри DllInitializer.
FixGame.h
PHP код:
<?php
#pragma once
class FixGame
{
FixGame() {};
~FixGame() {};
public:
static void Initialize(void);
};
FixGame.cpp
PHP код:
<?php
#include "stdafx.h"
#include "FixGame.h"
void FixGame::Initialize(void)
{
//:D
int x = 2 + 2 == 5;
}
Теперь запустим игру и попробуем что-то внутри нее изменить
При создании скриншота я заметил что игра переходит в режим паузы, когда я перехожу в другое приложение.
И в качестве примера сейчас попробуем это убрать. Запускаем IDA Pro. Переходим на вкладку Imports.
И ищем WINAPI функции связаны с фокусом окна.
Далее двойной щелчок по функции GetFocus для того чтобы увидеть где она размещена в памяти. Теперь нам нужно найти где она вызывается, правой кнопкой мыши по названию функции.
И выбираем Jump to xref to operand... IDA Pro покажет где эта функция вызывается, в нашем случае только 1 раз в функции sub_602410. Нажимаем снова два раза на название чтобы нас переместили в то месте где она вызывается.
Теперь мы видим дизассемблированый код этой функции sub_602410. Нажимаем кнопку F5, чтобы увидеть приближенный к С++ код.
Поставим вот здесь breakpoint для того чтобы определить здесь ли нам нужно патчить или нет. И запускаем игру в IDA Pro. Пытаемся поставить игру на паузу.
Видим что игра стоит на паузе, но breakpoint не сработал, значит это не та функция которая нам нужна. Да и если посмотреть выше, то это функция для какого-то левого окна.
Погуглив я нашел что можно определять фокус окна с помощью функции GetActiveWindow, проделываем то же самое что и с GetFocus.
Видим что здесь намного больше адресов где она вызывается, ну что же, нам нужно каждый проверить. Просто ставим breakpoint и ставим игру на паузу, пока не сработает breakpoint.
Когда я проверил все функции, я увидел в последней то что при запуске игры, игра записывает результат выполнения в какую-то переменную. Значит это значение анализируется в другом месте. Посмотрев эту функцию sub_5D4CC0
Можно сделать вывод о том что здесь создается главное окно игры. Здесь можно увидеть то что игра передает созданному окну указатель на класс создателя.
Ниже можно увидеть что создается таймер возможно он проверяет находится ли окно в фокусе, и у него последний параметр равен 0, то есть таймер обрабатывается в WndProc.
Найдем функцию WndProc, которая указывается при регистрации класса окна.
В нашем случае зарегистрирован класс с наименованием MainWindow. Попробуем найти его регистрацию. Откроем вспомогательное окно в IDA Pro, Strings.
Попробуем найти все места где упоминаются MainWindow. Всё точно так же как и с поиском функций.
И вот мы видим функцию WndProc. Зайдем внутрь её. Для того чтобы найти наш таймер. С помощью Visual Studio узнаем номер сообщения
Теперь переходим на LABEL_28 и снова ищем 0x113. Найдя это сообщения можно увидеть что оно просто сбрасывает переменную в 0. И это никак не может относится к проверки фокуса окна.
Вернемся к функции sub_5D4CC0 в которой создавалось окно и куда-то записывался результат выполнения функции GetActiveWindow. И переименуем переменную dwNewLong на THIS. Так как это адрес объекта который управляет созданием окна.
На скриншоте показано как это я определил.