Гайд Revers Game

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

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


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

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

Для x32dbg:



Запускаем программу от "Имени администратора", во вкладке "Модули" выбираем плагин 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.
Если открыть СДК движка, и немного проанализировать, то мы можем найти такую
Пожалуйста, авторизуйтесь для просмотра ссылки.


Код:
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 например). Видим два вызова, переходим по любому из них(второй вызов соответствует указанной выше функции)).


Второй вызов


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

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



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

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

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

//todo
 
Последнее редактирование:
HVH HATER
Пользователь
Статус
Оффлайн
Регистрация
3 Авг 2016
Сообщения
302
Реакции[?]
100
Поинты[?]
0
Думаю, все умеют делать дамп памяти, но я не думал, что это будет так, не знаю.. Удобно. В IDA у меня крашит каждые n-минут. А гайд здоровский. Когда-нибудь я разберу этот WF по частям.
 
Эксперт
Статус
Оффлайн
Регистрация
12 Июн 2014
Сообщения
991
Реакции[?]
1,209
Поинты[?]
3K
Думаю, все умеют делать дамп памяти
Знал бы как меня задолбало отвечать на вопросы: "как сделать дамп?", "пАмАги, не видит процесс варфиса в списке"и подобное
IDA у меня крашит каждые n-минут
Скачай нормальный билд. или у тебя китайский процессор?
 
HVH HATER
Пользователь
Статус
Оффлайн
Регистрация
3 Авг 2016
Сообщения
302
Реакции[?]
100
Поинты[?]
0
Скачай нормальный билд. или у тебя китайский процессор?
Держу в курсе, сейчас попробовал перекачать на более стабильную версию. Откатывал до тех пор, пока вылетов не будет. Вроде проблем, что были раньше нет. Но надо все проверять на деле.
 
Забаненный
Статус
Оффлайн
Регистрация
12 Мар 2018
Сообщения
299
Реакции[?]
115
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Зачем юзать scylla, если есть PETools?
 
Эксперт
Статус
Оффлайн
Регистрация
12 Июн 2014
Сообщения
991
Реакции[?]
1,209
Поинты[?]
3K
Я лучше тебя
Пользователь
Статус
Оффлайн
Регистрация
9 Окт 2017
Сообщения
184
Реакции[?]
75
Поинты[?]
1K
Годно! Красава =)
Как думаешь слить ли сигнатурки глобала? А еще поиски по текстам?
 
Эксперт
Статус
Оффлайн
Регистрация
12 Июн 2014
Сообщения
991
Реакции[?]
1,209
Поинты[?]
3K
в общем,так как информация объемная и добавлять через редактирование очень неудобно, все будет разбито на отдельные сообщения и в конечном итоге соберется в одну большую тему.


ISystem\ITimer\IConsole

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

Код:
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;
}
сопоставляем с декомпилированным вариантом:

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

IGame/IGameFramework

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

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

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

Код:
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
 
Эксперт
Статус
Оффлайн
Регистрация
12 Июн 2014
Сообщения
991
Реакции[?]
1,209
Поинты[?]
3K
IRenderer

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


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


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


todo
 
Забаненный
Статус
Оффлайн
Регистрация
3 Авг 2017
Сообщения
7
Реакции[?]
0
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Если не сложно то можешь написать гайд на эти смещение(классы)
SetScale,SetLocalPos,GetName,SetName ,GetWorldBounds,GetFlags,GetProxy,SetCountdown
 
Я лучше тебя
Пользователь
Статус
Оффлайн
Регистрация
9 Окт 2017
Сообщения
184
Реакции[?]
75
Поинты[?]
1K
HVHLEGEND
Забаненный
Статус
Оффлайн
Регистрация
13 Май 2018
Сообщения
745
Реакции[?]
121
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Я лучше тебя
Пользователь
Статус
Оффлайн
Регистрация
9 Окт 2017
Сообщения
184
Реакции[?]
75
Поинты[?]
1K
HVHLEGEND
Забаненный
Статус
Оффлайн
Регистрация
13 Май 2018
Сообщения
745
Реакции[?]
121
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
HVHLEGEND
Забаненный
Статус
Оффлайн
Регистрация
13 Май 2018
Сообщения
745
Реакции[?]
121
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Начинающий
Статус
Оффлайн
Регистрация
23 Ноя 2018
Сообщения
11
Реакции[?]
1
Поинты[?]
0
Вообще не понимаю что тут происходит. Какие-то коды. Дампы. Для чего это вообще?
 
Начинающий
Статус
Оффлайн
Регистрация
18 Фев 2018
Сообщения
82
Реакции[?]
19
Поинты[?]
0
Чит на Warface ProjectX, подробности в ЛС!
Пользователь
Статус
Оффлайн
Регистрация
30 Ноя 2017
Сообщения
215
Реакции[?]
38
Поинты[?]
0
Сверху Снизу