HOOK技术是当前用于Windows API拦截的主要技术,许多应用程序的功能都以HOOK技术为基础核心技术进行扩展实现。
以屏幕取词为例,通过安装鼠标钩子,拦截TextOut()、ExtTextOut()等函数,当应用程序收到WM_PAINT消息后,正常系统函数被拦截,跳转至钩子函数完成取词翻译等工作。
Intel的CPU制定Ring0、Ring1、Ring2、Ring3四个特权级别,Windows只在Ring0、Ring3级别上进行工作。我们把Ring0级别进行的HOOK操作称为内核级HOOK,Ring3级别进行的HOOK操作称为用户级HOOK。
内核级HOOK技术安全级别高,隐蔽性好,拦截范围广,但实现复杂,涉及众多内核操作、且由于Microsoft对操作系统内核采取的商业保护,导致缺乏完整的技术文档支持,开发难度大,极易造成系统瘫痪。
与内核级HOOK相比,用户级HOOK易于实现、且有完善的文档支持。虽然其安全级别低于内核级HOOK,且拦截范围较小,但恶意行为检测有别于制作木马病毒,并不需要较高的隐蔽性。除此之外,经过实际测试,用户级HOOK完全可以支持与检测相关的Windows API拦截。故检测技术涉及到的API拦截均在用户级别进行。
HOOK API技术通俗的说就是API函数的重定向操作。常见的用户级HOOK有Debugger HOOK、Inline HOOK和IAT HOOK。Debugger HOOK可行性低、操作性差,在此不做深入探讨。Inline HOOK通过内嵌汇编代码,替换函数头5个字节长度的机器码以实现函数跳转。该方法对CPU有严重的依赖性,各CPU的跳转指令各不相同,利用该技术实现的API 拦截基本不具备系统移植能力。
前文提到IAT(Import Address Table)是PE文件的导入地址表,其中包含了PE文件导入的所有系统API信息。PE文件载入内存后,动态载入导入模块及调用函数,IAT表记录导入函数的实际地址。API HOOK将IAT表中原函数地址保存并替换成相应钩子函数的实际地址,当应用程序尝试调用被拦截函数时,将跳转至我们自定义的钩子函数,钩子函数执行结束后返回继续执行原函数工作,至此完成一次HOOK工作。真正的HOOK要求被拦截API在钩子函数执行后仍能恢复原函数功能。