![]() |
Всем привет, в данном гайде расскажу как хукнуть рендер warface (directx9 version) с помощью re_virtualtable. Проект у вас уже должен быть готов (dll, x64). Берём классы(спасибо @atizoff) и закидываем в проект. Оффсеты в классах старые, поэтому нужно их обновить. На момент этого гайда (02.03.2021) валидные оффсеты:
C++: Код:
SSystemGlobalEnvironmentДалее нам понадобится заинклюдить классы, и библиотеку thread для создания потока. Теперь приступаем к коду! Первым делом создаём поток в точке входа: C++: Код:
classВ данном случае я использую класс в качестве точки входа. Конструктор класса вызовется при загрзуке модуля в игру, так как мы сразу же создаём объект класса после объявления его самого. Настало время re_virtualtable, качаем его из репозитория и инклюдим. Ну и наконец-то ебашим хук! Создаём экземпляр хука: C++: Код:
clVirtualTableПеред как ставить хук создадим функцию которая будет его обрабатывать: C++: Код:
HRESULT __stdcallНо это не будет работать правильно, если мы не вызовем оригинальную функцию, поэтому добавляем вызов оригинала в нашу функцию обработчик: C++: Код:
returnВ нашем созданном потоке ждём инициализации SSystemGlobalEnvironment и ставим хук: C++: Код:
ifСтоит учесть, что в классах @atizoff возвращаемое значение метода GetDirectDevice - DWORD64, поэтому в классах поменяем его на LPDIRECT3DDEVICE9. Поскольку там ебанутейший каст, просто оставлю вам это: C++: Код:
LPDIRECT3DDEVICE9Готово! Хук установлен и осталось только проверить его работоспособность, для этого мы рендерим квадрат с помощью данной функции (спасибо @CleanLegend): C++: Код:
voidИ всё прекрасно работает: https://forum.antichat.xyz/attachments/27682289/ |
Цитата:
Код:
ifи не надо потоки вызывать. а так конкретно этот класс на пустоту проверять бесполезно, он всегда наполнен. в такой проверке науждаются лишь IGameFramework, ICVar (SCVars) (из распрастраннёных), тем не менее отличный гайд! |
| Время: 03:48 |