API Hook基本原理和实现
http://tech.ddvip.com 2008年01月10日 社区交流
内容摘要:将网络上几篇有代表性的api hook文章的精华进行了浓缩和适当简化,写成这篇介绍性文章。另外也希望初学者能够认真思考本文采用的循序渐进的分析思路,如何解决了一个未知的问题。文中借鉴的文献资料列于文末附录一节。
dll基本文件:Hook.h,Hook.cpp,HookDll.def
client验证方基本文件:HookTest.h,HookTest.cpp,ApiHookTest.cpp

6、 实现的功能
对记事本的MessageBoxW函数进行了hook,先执行自定义的
int WINAPI MyMessageBoxW(HWND hWnd, LPCWSTR M1, LPCWSTR M2, UINT M3)
{
return oldMessageBoxW(hWnd, M1, L"my api hook", M3);
}
从这里可以看到,由于目标进程空间中的执行线程并不知道你已经改变了api函数的实际入口地址,它在调用时仍旧将参数一成不变的压入堆栈(这个说法是汇编代码时看到的等价情形),事实上你已经提前接收到了函数调用的所有参数。这里就是篇首帖子的回复了。
hook之前
hook以后
示例代码
1、client验证方的代码非常简单。建立一个Application工程,在窗体上放一个memo(提示信息),两个button(一个SetHook,另一个RemoveHook)。
void __fastcall TForm1::Button1Click(TObject *Sender)
{
DWORD dwProcessId, dwThreadID;
HWND hWnd = FindWindow("Notepad", NULL);
if (!hWnd)
{
Memo1->Lines->Add("Nodepad is not found");
}
else
{
dwThreadID = GetWindowThreadProcessId(hWnd, &dwProcessId);
Memo1->Lines->Add(dwThreadID);
SetHook(dwThreadID);
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
RemoveHook();
}
//---------------------------------------------------------------------------
2、api hook dll稍微复杂些,建立一个dll工程之后,修改之。代码中有一些函数并未用上,ReplaceApiAddress是核心函数,文章开始处有示例代码下载。
来源:www.ccrun.com 作者:wskjuf 责编:豆豆技术应用