urmem hook

legendabrn

Известный
Автор темы
Проверенный
122
172
крашит когда вызывается функция, в чем проблема?
Код:
urmem::hook hooks;
int sub_48C8D0(char* Format, char ArgList)
{
    return hooks.call<urmem::calling_convention::cdeclcall, int>(Format, ArgList);
}


hooks.install(0x48C8D0, urmem::get_func_addr(sub_48C8D0), urmem::hook::type::call, 5);
1614607900205.png
 
Решение
C++:
urmem::hook hk;

int __cdecl sub_48C8D0(char *format, char argList)
{
    return urmem::call_function<urmem::calling_convention::cdeclcall, int, char *, char>(hk.get_original_addr(), format, argList);
}

hk.install(0x48C8D0, urmem::get_func_addr(&sub_48C8D0), urmem::hook::type::jmp, 5);
вроде так, если это конечно не функция какого-то модуля, если это так, то надо брать от него оффсет (reinterpret_cast<DWORD>(GetModuleHandleA("имя модуля")) + 0x48C8D0)

sc6ut

неизвестный
Модератор
382
1,074
thiscall, но на минхуке использовал fastcall
покажу на примере функции гташки CWeapon::Fire bool CWeapon::Fire(CEntity *, CVector *, CVector *, CEntity *, CVector *, CVector *)
я не проверял, так как не могу сейчас, но вроде как вот так:
C++:
urmem::hook hkCWeapon_Fire;

bool __stdcall HOOK_CWeapon_Fire(void *firingEntity, void *origin, void *muzzlePosn, void *targetEntity, void *target, void *originForDriveBy) {
    // берем указатель на класс из регистра ecx
    void *dis;
    __asm mov dis, ecx
    // вызываем оригинальную функцию
    return urmem::call_function<urmem::calling_convention::thiscall, bool, void *, void *, void *, void *, void *, void *, void *>(hkCWeapon_Fire.get_original_addr(), dis, firingEntity, origin, muzzlePosn, targetEntity, target, originForDriveBy);
}

hkCWeapon_Fire.install(0x742300, urmem::get_func_addr(&HOOK_CWeapon_Fire), urmem::hook::type::jmp, 5);
 
Последнее редактирование:
  • Нравится
Реакции: legendabrn

kin4stat

mq-team
Всефорумный модератор
2,731
4,693
покажу на примере функции гташки CWeapon::Fire CWeapon::Fire(CEntity *, CVector *, CVector *, CEntity *, CVector *, CVector *)
я не проверял, так как не могу сейчас, но вроде как вот так:
C++:
urmem::hook hkCWeapon_Fire;

bool __stdcall HOOK_CWeapon_Fire(void *firingEntity, void *origin, void *muzzlePosn, void *targetEntity, void *target, void *originForDriveBy) {
    // берем указатель на класс из регистра ecx
    void *dis;
    __asm mov dis, ecx
    // вызываем оригинальную функцию
    return urmem::call_function<urmem::calling_convention::thiscall, int, void *, void *, void *, void *, void *, void *, void *>(hkCWeapon_Fire.get_original_addr(), firingEntity, origin, muzzlePosn, targetEntity, target, originForDriveBy);
}

hkCWeaponFire.install(0x742300, urmem::get_func_addr(&HOOK_CWeapon_Fire), urmem::hook::type::jmp, 5);
не проще фастколл и EDX? да и stdcall вроде только через стек передает если это не функция класса явно объявленная как stdcall
 

sc6ut

неизвестный
Модератор
382
1,074
не проще фастколл и EDX? да и stdcall вроде только через стек передает если это не функция класса явно объявленная как stdcall
а какая разница как реализовать? через аргументы получил все что идёт в стеке, а потом достал указатель на класс вручную.
 

kin4stat

mq-team
Всефорумный модератор
2,731
4,693
а какая разница как реализовать? через аргументы получил все что идёт в стеке, а потом достал указатель на класс вручную.
inline asm ломает оптимизатор компилятора
 
  • Нравится
Реакции: legendabrn

sc6ut

неизвестный
Модератор
382
1,074
inline asm ломает оптимизатор компилятора
а, понял, ну тогда действительно лучше так:
C++:
urmem::hook hkCWeapon_Fire;

bool __fastcall HOOK_CWeapon_Fire(void *dis, void *EDX, void *firingEntity, void *origin, void *muzzlePosn, void *targetEntity, void *target, void *originForDriveBy) {
    // вызываем оригинальную функцию
    return urmem::call_function<urmem::calling_convention::thiscall, bool, void *, void *, void *, void *, void *, void *, void *>(hkCWeapon_Fire.get_original_addr(), dis, firingEntity, origin, muzzlePosn, targetEntity, target, originForDriveBy);
}

hkCWeapon_Fire.install(0x742300, urmem::get_func_addr(&HOOK_CWeapon_Fire), urmem::hook::type::jmp, 5);
 
Последнее редактирование:
  • Нравится
Реакции: legendabrn и kin4stat