Sniper Ghost Warrior 2 (2013)
Cryengine 3
Понадобится:
Dx9 или Dx11 Hook, игра поддерживает оба Directx
(Тут не будет рассмотрен хук Directx)
Изначально для рисования местоположения противника надо выйти на EntityList или нечто подобное
Начинаем свой поиск через хп игрока, потом смотрим, что читает по адресу, и находим небольшой кусок кода который работает со всеми Entity
Выглядит примерно так
Работает как с хп локального игрока так и хп врагов / союзников
Именно этим мы и воспользуемся, на с++ напишем хук, который будет брать указатель на врага и сохранять в некий список
А после этого мы будем читать список и рисовать линию к этим врагам
Довольно нестандартный способ решения т.к тут не используется EntityList, по которому можно было бы проследить именно четкое смещение между врагами
Далее были найдены координаты игрока.
Ну и последнее что необходимо, это ProjectToWorld или же по другому WorldToScreen для перевода 3D координат на 2D плоскость (Окно игры)
Собственно реверснутые классы ниже
После поисков остается только написать все это на плюсах
EntityList будет получаться посредством хука на с++
//SniperGhostWarrior2.exe + 0xDCB8E3
Ровно тут и ставим хук для получения врагов
Остается только восстановить инструкции и сделать свой список Entity
Тут мы восстанавливаем оригинальные инструкции и перемещаем указатель врага в переменную TemporaryObject
Ну а после добавляем ее в наш некий EntityList где хранятся все указатели на врагов
Теперь остается только в цикле читать EntityList и проверять валидность, а также отрисовывать (используя dx9 endscene hook) врагов за стенками и прочим
Для этого воспользуемся методом ProjectToScreen из реверснутого класса IRenderer
Самая основная часть ниже, в которой и происходит все действие
Теперь можно протестировать работу
Все отлично отрисовывается, линия идет прямо под врагов
(Насчет того что нет моделек игроков, такая проблема возникает только на dx9
При включении dx11 такой проблемы не наблюдается)
Хук делал под d9, поэтому получилось вот так)
Cryengine 3 Classes Reverse
Указатель на SSystemGlobalEnvironment можно найти через строку ai_CompatibilityMode
Находим в IDA эту строку, переходим по Xref'y, Декомпилируем метод в псевдокод и получаем поинтер на SSystemGlobalEnvironment
Теперь у нас есть указатель на SSystemGlobalEnvironment
Указатель SSystemGlobalEnvironment 0х385BF490
Теперь необходимо найти смещение до Renderer, для этого мы будем использовать Reclass
На этот раз ищем строку Draw2DLine
И повторяем манипуляции выше
В итоге мы находим смещение от SSystemGlobalEnvironment до IRenderer (0x10)
В Reclass мы получаем вот такую картину
Указатель на SSGlobal + 0x10 (Renderer)
Теперь необходимо найти метод ProjectToScreen который есть в классе IRenderer
Ищем в IDA строку ProjectToScreen
Xref, pseudocode как и до этого
Остается только от указателя на рендер определить адрес метода ProjectToScreen (Renderer + 0x140)
В указателе Renderer лежит виртуальная таблица методов и на 0х140 необходимый нам, определяем его в Reclass
Берем адрес, в данном случае 0x19AD8608 и прибавляем к нему смещение до ProjectToScreen (0x19AD8748)
Теперь можно сгенерировать все реверснутые классы и использовать метод ProjectToScreen