如何在C++中正确Hook __thiscall函数?pThis参数识别异常求助
解决__thiscall函数Hook时pThis参数识别错误的问题
问题根源分析
从你提供的IDA反汇编和伪代码来看:
- 原函数是**__thiscall**调用约定:
this指针通过ECX寄存器传递,剩余9个参数全部通过栈传递(反汇编里的retn 24h可验证,24h=36字节,对应9个4字节参数)。 - 当前的
__fastcall签名存在两个核心问题:- 参数类型不匹配:原函数第四个参数(
arg_C)是byte类型,你错误定义成了int。 - 参数传递逻辑错误:调用原函数时传入
EDX参数,导致栈参数整体偏移,最终pThis和后续参数全部乱码。
- 参数类型不匹配:原函数第四个参数(
修正后的Hook代码实现
1. 修正函数指针类型定义
// 用__fastcall适配__thiscall:ECX对应pThis,EDX仅作占位(原函数不使用EDX) typedef void(__fastcall *HookFileWolfram)(void* pThis, void* _EDX, int a2, int a3, char a4, int a5, int a6, float a7, float a8, float a9, int a10); // 全局存储原函数指针(Hook前初始化) HookFileWolfram originalFunction = nullptr;
2. 修正Hook函数实现
void __fastcall HookWeaponFileSubWolfram(void* pThis, void* _EDX, int a2, int a3, char a4, int a5, int a6, float a7, float a8, float a9, int a10) { // 正确打印pThis的地址(而非指向的内容,避免乱码) char logBuf[256]; sprintf(logBuf, "Print values: pThis: 0x%p, a2: %d", pThis, a2); LF::Log_Update(logBuf); // 调用原函数时,_EDX传任意值即可(原函数不读取EDX) originalFunction(pThis, nullptr, a2, a3, a4, a5, a6, a7, a8, a9, a10); }
3. 确保Detours Hook的正确初始化
// 示例初始化代码(需在进程加载完成后调用) void InitHook() { // AddressOfHookSoundFunction是你获取的原函数地址 originalFunction = (HookFileWolfram)AddressOfHookSoundFunction; DetourTransactionBegin(); DetourUpdateThread(GetCurrentThread()); DetourAttach(&(PVOID&)originalFunction, HookWeaponFileSubWolfram); DetourTransactionCommit(); }
关键注意事项
- 不要直接打印pThis指向的内容:
pThis是对象指针,指向的内存不一定是字符串,直接转换会导致乱码,应打印指针的十六进制地址。 - EDX参数仅作占位:原函数是纯
__thiscall(仅ECX传this,其余栈传),所以__fastcall里的EDX参数不会被原函数使用,调用时传nullptr或任意值均可。 - 严格匹配参数类型:原函数的
arg_C是byte类型,必须用char对应,否则会导致栈对齐错误,参数传递错位。
内容的提问来源于stack exchange,提问作者user3449922
相关产品推荐
相关产品推荐

