《Windows核心编程》中介绍了两种API Hooking的方法 —— “Overwritting Code”(代码覆盖)和“API Hooking by Manipulating a Module's Import Section”(修改导入段)。本文在以学习这两种API Hooking为目的,介绍相关的内容,包括:API Hooking的作用、导入段的获取和修改、detours库、使用WM_COPYDATA进行进程间通信、UIPI等知识。
一、What is API Hooking
先来看Stack Overflow上对这个问题的答案:http://stackoverflow.com/questions/10562055/what-is-subclassing-and-api-hooking
它的大意就是:API Hooking与Subclassing类似,都是通过拦截Windows固有的流程,添加自定义代码,来扩展新特性。Subclassing主要是拦截window message,扩展WndProcedure的特性;API Hooking主要是拦截应用程序对Windows API的调用,从而改变(扩展)Windows API的原有行为。广义来说,API Hooking不但可以拦截Windows API,也可以用于拦截一些第三方DLL库的API。
API Hooking有什么用?
Jeffrey从他遇到的一个客户需求——数据库扩展DLL卸载时的资源清理问题,引入API Hooking技术,控制“ExitProcess”系统函数的行为,让它先调用客户DLL的某个资源清理函数,待客户DLL清理完毕后,再执行原始的“ExitProcess”,卸载进程的各个DLL模块(顺序不可控)。
除此之外,我还想到一个修改第三方DLL