HOOK API 是指截获特定进程或系统对某个 API 函数的调用,使得 API 的执行流程转向指
定的代码。Windows 下的应用程序都建立在 API 函数至上,所以截获 API 是一项相当有
用的技术,它使得用户有机会干预其它应用程序的程序流程。
最常用的一种挂钩 API 的方法是改变目标进程中调用 API 函数的代码,使得它们对 API 的
调用变为对用户自定义函数的调用。
HOOK API 和 HOOK 技术完全不同。尽管它们都是钩子。HOOK 钩的是消息,它在系统将
消息传递给应用程序之前截获它,然后进行操作、或修改消息、或停止消息的传递;而 HOOK
API 截获的是应用程序对系统 API 的调用,它在应用程序对系统 API 的调用之前截获此调
用动作,让其转而调用我们所定义的函数(内容可能是进行一些操作后再调用原系统
API)。
关于 HOOK 技术,微软为我们提供了现成的 API,有固定的使用步骤。
而对于 HOOK API 技术,微软并没有向我们提供类似的 API,没有那么简洁的步骤可供我
们参考,也许是因为微软并不希望我们用这样的手段编程,所以相对要麻烦一些。
以下为《windows 核心编程》学习笔记:
windows 编程中,有些时候必须要打破进程的界限。访问另一个进程的地址空间。这些情
况包括:
1.当你想要为另一个进程创建的窗口建立子类时,即为此窗口指定新的窗口过程函数。
2.当你需要调试帮助时。
3.当你想要挂接其它进程时(HOOK API?)。
一旦你的 DLL 插入到另一个进程的地址空间,就可以对另一个进程为所欲为。
一、为另一个进程创建的窗口建立一个子类。
建立子类就能改变窗口的行为特性。若要建立子类,只需要调用 SetWindowLongPtr 函数,
改变窗口的内存块中的窗口过程地址,指向一个新的(你自己的)WndProc。
当调用下面所示的 SetWindowLongPtr 函数,建立一个窗口的子类时,你告诉系统,发送
到或者显示在 hwnd 设定的窗口中的所有消息都应该送往 MySubclassProc,而不是送往
窗口正常的窗口过程:
SetWindowLongPtr(hwnd,GWLP_WNDPROC,MySubclassProc);
换句话说,当系统需要将消息发送到指定窗口的 WndProc 时,要查看它的地址,然后直接
调用 WndProc。在这里,系统发现 MySubclassProc 函数的地址与窗口相关联,因此就
直接调用 MySubclassProc 函数。
窗口函数被调用的过程是这样的:如,进程 A 正在运行,并且已经创建了一个窗口。文件
User32.dll 被映射到进程 A 的地址空间中。对 User32.dll 文件的映射是为了接收和发送
在进程 A 中运行的任何线程创建的任何窗口中发送和显示的消息(USER32.DLL 里含有
DispatchMessage 函数,函数为:
LONG DispatchMessage (CONST MSG *msg){
LONG lResult;
WNDPROC lpfnWndProc =
(WNDPROC)GetWindowLongPtr(msg.hwnd, GWLP_WNDPROC);
lResult = lpfnWndProc(msg.hwnd, msg.message, msg.wParam, msg.lParam);
return (lResult);
}
)。