You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C++中正确Hook __thiscall函数?pThis参数识别异常求助

解决__thiscall函数Hook时pThis参数识别错误的问题

问题根源分析

从你提供的IDA反汇编和伪代码来看:

  • 原函数是**__thiscall**调用约定:this指针通过ECX寄存器传递,剩余9个参数全部通过栈传递(反汇编里的retn 24h可验证,24h=36字节,对应9个4字节参数)。
  • 当前的__fastcall签名存在两个核心问题:
    1. 参数类型不匹配:原函数第四个参数(arg_C)是byte类型,你错误定义成了int。
    2. 参数传递逻辑错误:调用原函数时传入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 01:09:29