源代码见后文。
在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 // message box style
);
int MyMessageBoxAA(
HWND hWnd, // handle to owner window
LPCTS

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

被折叠的 条评论
为什么被折叠?



