源代码见后文。
在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 //