Revers Game

Эксперт
Эксперт
Статус
Оффлайн
Регистрация
12 Июн 2014
Сообщения
994
Реакции
1,209
При наличии свободного времени буду описывать способы и поиск офсетов\индексов\функций для WarFace.

Необходимый софт:
  • PeTools/Scylla/x32dbg
  • IdaPro
  • ReClass
  • Блокнот
  • Калькулятор
  • Пожалуйста, авторизуйтесь для просмотра ссылки.
*Стоит понимать, что игра написана на более старой версии движка, и актуальная версия предоставленная разработчиками CryEngine3 не будет совпадать на 100% с анализируемым кодом. Но тем не менее большинство алгоритмов совпадают или поддаются сравнительному анализу.


Для начала делаем дамп Game.exe: Для этого заходим в папку игры Warface\Bin32Release\ и запускаем Game.exe. Выскочит окошко "Пожалуйста, используйте Игровой центр.....". Дале5е запускаем
PeTools/Scylla/x32dbg
Для PeTools:
PBhecXon.png

Запускаем программу от "Имени администратора", в верхнем окне выбираем процесс игры, в нижнем жмем ПКМ->Dump Full, выбираем место сохранение и имя, жмем OK. PROFIT!!

Для x32dbg:
jozG4e4l.png

nsjgv4Fn.png


Запускаем программу от "Имени администратора", во вкладке "Модули" выбираем плагин Scylla, Откроется окно дампера, в списке выбираем процесс, жмем "Dump", выбираем куда сохранить. PROFIT!!!

Далее запускаем IdaPro, выбираем созданный нами дамп, и на все предложения жмем "ОК"(за исключением загрузки .pdb). В случа, если Вы сохранили дамп не в папке Warface\Bin32Release\, то вам предложат указать путь к необходимым длл (ijl15.dll, ocevogyv.dll) просто выбираем в окне расположение этих фаилов(Warface\Bin32Release\). Если дамп в папке с игрой, то IdaPro сама все подгрузит.
Ждем завершения анализа файла(на слабых Пк может до 40 минут доходить) и можем приступать к работе.


SSystemGlobalEnvironment - это основной базовый класс где хранятся указатели на "стартовые классы". примерное описание и содержание можно посмотреть на
Пожалуйста, авторизуйтесь для просмотра ссылки.
.

Минимальный набор необходимых нам классов:
IRenderer* pIRenderer;
IPhysicalWorld* pIPhysicalWorld;
IGame* pIGame;
ISystem* pISystem;



Найдем их и соберем актуальный класс для работы в internal.

самый простой для поиска указатель - это указатель на класс IRenderer.
Если открыть СДК движка, и немного проанализировать, то мы можем найти такую
Пожалуйста, авторизуйтесь для просмотра ссылки.


Код:
Expand Collapse Copy
void CHardwareMouse::SetHardwareMouseClientPosition(float fX, float fY)
{
#if CRY_PLATFORM_WINDOWS
    HWND hWnd = (HWND) gEnv->pRenderer->GetCurrentContextHWND();
    CRY_ASSERT_MESSAGE(hWnd, "Impossible to set position of the mouse relative to client coordinates from a non existing window!");

    if (hWnd)
    {
        POINT pointCursor;
        pointCursor.x = (int)fX;
        pointCursor.y = (int)fY;
        ClientToScreen(hWnd, &pointCursor);
        SetCursorPos(pointCursor.x, pointCursor.y);
    }
#else
    SetHardwareMousePosition(fX, fY);
#endif
}

Тут мы видим два импортируемых функции: ClientToScreen и SetCursorPos.
Так же у нас есть два нужных нам указателя(gEnv->pRenderer) и одна из функций(GetCurrentContextHWND(возвращает актуальный дескриптор окна(HWND)), которая возможно пригодится нам.

Переходим в IdaPro во вкладку Import. Ищем одну из импортируемых функций(SetCursorPos например). Видим два вызова, переходим по любому из них(второй вызов соответствует указанной выше функции)).
a87ubUjD.png

hAwVpBFa.png

Второй вызов
hAwVpBFa.png


Жмем F5 и видим вполне знакомые инструкции и необходимые нам данные
SfIbnGFn.png

dword_1BB8B08; указатель на SSystemGlobalEnvironment
dword_1BB8B08 + 156 указатель на IRenderer
v3 + 96 индекс в виртуальной таблице для GetCurrentContextHWND()
Переименуем и подпишем все для более легкой ориентации

LzsWj2NO.png


открываем ReClass и собираем наш класс:

Код:
Expand Collapse Copy
class SSystemGlobalEnvironment
{
public:
   char pad_0000[156]; //0x0000
   class IRenderer* pRenderer; //0x009C
   char pad_00A0[32]; //0x00A0
}; //Size: 0x00C0


добавим:
Код:
Expand Collapse Copy
static SSystemGlobalEnvironment*    m_env = nullptr;
static SSystemGlobalEnvironment*    GetGlobalEnvironment()
{
    if (!m_env)
        m_env = (SSystemGlobalEnvironment*)(*(DWORD*)0x1BB8B08);
    return m_env;
}
Теперь мы можем получить доступ к IRenderer используя:
Код:
Expand Collapse Copy
IRenderer* m_pRenderer  = GetGlobalEnvironment()->pRenderer;

//todo
 
Последнее редактирование:
Думаю, все умеют делать дамп памяти, но я не думал, что это будет так, не знаю.. Удобно. В IDA у меня крашит каждые n-минут. А гайд здоровский. Когда-нибудь я разберу этот WF по частям.
 
Думаю, все умеют делать дамп памяти
Знал бы как меня задолбало отвечать на вопросы: "как сделать дамп?", "пАмАги, не видит процесс варфиса в списке"и подобное
IDA у меня крашит каждые n-минут
Скачай нормальный билд. или у тебя китайский процессор?
 
Скачай нормальный билд. или у тебя китайский процессор?
Держу в курсе, сейчас попробовал перекачать на более стабильную версию. Откатывал до тех пор, пока вылетов не будет. Вроде проблем, что были раньше нет. Но надо все проверять на деле.
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Зачем юзать scylla, если есть PETools?
 
Годно! Красава =)
Как думаешь слить ли сигнатурки глобала? А еще поиски по текстам?
 
в общем,так как информация объемная и добавлять через редактирование очень неудобно, все будет разбито на отдельные сообщения и в конечном итоге соберется в одну большую тему.


ISystem\ITimer\IConsole

Открываем список текстовых констант(Shift+F12), Жмем Ctrl+F и ищем строку "exec TimeDemo.exc".она вызывается в одном месте, так что переходим на вызов и жмем F5. Мы перешли в функцию
Пожалуйста, авторизуйтесь для просмотра ссылки.

Код:
Expand Collapse Copy
void CTestSystemLegacy::Update()
{
    if (m_fQuitInNSeconds > 0.0f)
    {
        int iSec = (int)m_fQuitInNSeconds;

        m_fQuitInNSeconds -= gEnv->pTimer->GetFrameTime();

        if (m_fQuitInNSeconds <= 0.0f)
        {
            gEnv->pConsole->ExecuteString("ExitOnQuit 1");
            gEnv->pSystem->Quit();
        }
        else
        {
            if (iSec != (int)m_fQuitInNSeconds)
                gEnv->pLog->Log("quit in %d seconds ...", iSec);
        }
    }

    if (!m_bApplicationTest)
        return;

    if (m_sParameter.empty())
        return;

    if (m_bFirstUpdate)
    {
        if (m_sParameter.CompareNoCase("TimeDemo") == 0)
        {
            gEnv->pConsole->ExecuteString("exec TimeDemo.exc");
        }
    }

    m_bFirstUpdate = false;
}

сопоставляем с декомпилированным вариантом:
6DEsS9gP.png

отсюда нам интересны указатели pTimer(0x28) и pSystem(0xA8), а так же функция GetFrameTime()(76/4 = 19 позиция в виртуальной таблице, запоминаем)

IGame/IGameFramework

Ищем "AI System" или "ResetSubSystems", переходим по единственному вызову, жмем F5 и видим:
tBFfpVGX.png

pGame(0xA0) и GetIGameFramework()(544/4 = 136 позиция в виртуальной таблице)

собираем класс:

Код:
Expand Collapse Copy
class SSystemGlobalEnvironment
{
public:
   char pad_0000[40]; //0x0000
   class ITimer* pTimer; //0x0028
   char pad_002C[112]; //0x002C
   class IRenderer* pRenderer; //0x009C
   class IGame* pGame; //0x00A0
   char pad_00A4[4]; //0x00A4
   class ISystem* pSystem; //0x00A8
   char pad_00AC[20]; //0x00AC
}; //Size: 0x00C0

class IGame
{
public:
   char pad_0004[64]; //0x0004

   virtual void Function0();
   ............
   virtual void Function135();
   virtual IGameFramework*GetIGameFramework();
   virtual void Function137();
}; //Size: 0x0044
 
IRenderer

функция ProjectToScreen:
Ищем строку "ProjectToScreen", находим один вызов, переходим на нег, жмем F5 и видим вызовы нужных нам функций :

7RQtwP1o.png

жмем по указанному адресу два раза и переходим в функцию
Пожалуйста, авторизуйтесь для просмотра ссылки.

Vel90JIM.png

376/4 = 94(индекс в виртуальной таблице)


todo
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Если не сложно то можешь написать гайд на эти смещение(классы)
SetScale,SetLocalPos,GetName,SetName ,GetWorldBounds,GetFlags,GetProxy,SetCountdown
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
  • Scylla/x32dbg

  • ReClass
  • де их взят
 
Последнее редактирование:
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Вообще не понимаю что тут происходит. Какие-то коды. Дампы. Для чего это вообще?
 
Назад
Сверху Снизу