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

使用Minhook挂钩函数返回时程序崩溃问题求助

解决Minhook挂钩SendPacket后崩溃的问题

你的崩溃问题根源在于调用约定、参数类型、返回值三者完全不匹配,导致栈帧破坏和非法内存访问,以下是具体问题分析和修正方案:

核心问题点

  • 调用约定不匹配:反编译器给出的目标函数是__fastcall,但你定义的原函数指针用了__thiscall——两种调用约定的寄存器使用、参数传递规则完全不同,直接导致参数传递混乱。
  • 参数类型不匹配:目标函数的a2是_QWORD*,你却定义成long double*,类型语义不兼容会引发内存访问异常。
  • 返回值不匹配:目标函数返回__int64,但你的原函数指针和挂钩函数都定义为void,导致原函数返回的8字节值未被正确处理,栈指针失衡。

修正后的代码

原函数指针定义(必须与目标函数完全一致)

// 严格匹配目标函数的调用约定、参数类型、返回值
__int64(__fastcall* Original_SendPacket)(int, _QWORD*, __int64);

挂钩函数实现

__int64 __fastcall Hooked_SendPacket(int eNetMessageType, _QWORD* a2, __int64 _ENetPeer) {
    std::cout << "[SendPacketLog]\nType: " << eNetMessageType << "\nUnknown: " << a2 << "\nENetPeer: " << _ENetPeer << "\n\n";
    // 调用原函数并返回其结果,保证栈帧和返回值处理正确
    return Original_SendPacket(eNetMessageType, a2, _ENetPeer);
}

额外注意事项

  • 使用Minhook挂钩时,必须确保MH_CreateHook中传入的原函数指针、挂钩函数的签名与目标函数完全一致,包括调用约定、参数数量/类型、返回值类型。
  • 调试时若仍有崩溃,可检查栈帧是否平衡,或用反汇编确认原函数的实际调用约定(部分反编译器可能存在识别误差)。

内容的提问来源于stack exchange,提问作者user20759105

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 19:20:20