关于看雪上那份inline hook代码的小问题

在debug版本中,inline hook代码遇到堆栈平衡检查失败的问题,原因是detour函数在检查前未保存前一栈帧的ESI。通过在函数开始时保存并结束时恢复ESI,可以避免__RTC_CheckEsp时的错误,从而解决debug版本中的堆栈平衡破坏bug。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

源代码见后文。

在debug版本中总是出现堆栈平衡检查通不过的情况~~单步跟了一下发现是在detour函数里检查堆栈平衡前没有保存前一栈帧的ESI,导致当前堆栈平衡检查完之后的ESI保存的是当前函数被调用前的ESP,和上一层调用者的ESP不一样,所以__RTC_CheckEsp的时候报错。

解决办法很简单,detour函数里调函数前保存一下ESI,完了之后再恢复,这样就不会在debug版本中报堆栈平衡被破坏的bug了:)

MyMessageBoxA函数里那两个条件编译~~


代码

#include <windows.h>
#include <iostream>
//using namespace std;

DWORD head;//保存API返回地址
int nRet;
BYTE orig_code[5] = {0x90, 0x90, 0x90, 0x90, 0x90};//存放原始的指令
BYTE hook_code[5] = {0xe9, 0, 0, 0, 0};//存放跳转到MyMessageBoxA的指令
BYTE jmp_org_code[5] = {0xe9, 0, 0, 0, 0};//存放跳转到原起始地址后5字节的指令

int MyMessageBoxA(
	HWND hWnd,          // handle to owner window
	LPCTSTR lpText,     // text in message box
	LPCTSTR lpCaption,  // message box title
	UINT uType          // 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值