使用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
相关产品推荐
相关产品推荐

