非常严肃的问题:关于Jeffrey Richter的HOOKAPI之后,堆栈平衡问题!弄明白,你们将终身受用!
今日有点时间弄了一下 HOOKAPI,发现有个还有个缺陷。
我把Jeffrey Richter的HOOKAPI 移植到MFC下,出现问题。
我写了一个 HookAPI.exe[一个MFC对话框] 和 HookAPI.dll[MFC常规DLL], 首先 HookAPI.exe 启动时,动态加载HookAPI.dll,然后获取HookAPI.dll导出的My_MessageBox 的函数地址。
再次:HookAPI.exe本身会自己加载user32.dll,然后我就利用Jeffrey Richter的HOOKAPI原理挂接"MessageBoxA",把user32.dll的MessageBoxA的地址改写为HookAPI.dll的My_MessageBox的函数地址。这样挂接完成。
为了测试效果,我创建一个按钮,代码如下:
void CTestRemoteInjectDlg::OnButton_Messagebox()
{
AfxMessageBox(_T("AAAAAAAAAA")) ;
}
此时,单击该按钮,达到了预期效果,而且很完美,堆栈平衡。
但是把 AfxMessageBox(_T("AAAAAAAAAA")) 换成下面形式
void CTestRemoteInjectDlg::OnButton_Messagebox()
{
::MessageBox(NULL, "HOOKAPI SUCCESS", "HOOKAPI", MB_OK) ; // API形式
}
结果,出现堆栈异常,我跟踪发现是堆栈没有平衡,汇编跟踪时,的确少了0x10ch那么多长度,恰好是MessageBox的4个参数堆栈。
但是我个人能力有限,到底如何 平衡此堆栈呢?
AfxMessageBox 为什么有能自动帮你平衡堆栈呢?
我需要学习,像你们大虾请教!