hook技术可以对程序的运行流程进行监控、拦截,是安全研究者的必备技能。
Hook概述
Hook的关键是通过一定的手段埋下钩子,钩住我们关心的重要流程,然后根据需要对执行过程进行干预。
采用Hook,会导致程序执行流程发生改变。通过在执行真正的目标函数之前执行事先插入的代码,获得了程序执行过程的决定权。
Hook的分类
Hook分为两类,一类通过修改数据进行Hook,另一类通过修改函数内的指令进行Hook。
Address Hook
一些函数的地址,他们通常存放在各类表或结构中,或者某个指定的地址处,抑或特殊的寄存器中。他们某个时刻会成为程序执行过程中的eip。只要将这类地址替换,就可以拿到程序的控制权了。
- 各类表中的地址:PE的IAT,EAT、user32.dll的回调函数表、IDT、SSDT和Shadow SSDT、C++类的虚函数表、COM接口的功能函数表
- 处理例程地址:DRIVER_OBJECT的MajorFunction及Fastlo派遣例程地址、Startlo等特殊例程的地址、OBJECT_TYPE中_OBJECT_TYPE_INITIALIZER包含的各种处理过程
- 特殊寄存器中的地址
- 特定的函数指针
Inline Hook
Inline Hook是直接修改指令的Hook,采用jmp、call、retn之类的转移指令。
基于异常处理的Hook
程序发生异常时,在没有内核调试器存在且异常程序没有被调试的情况下,系统把异常处理过程转交给用户态的异常处理过程,以查找系统中是否安装了异常处理程序(VEH、SEH等),通过自己安装异常处理程序插入自己想要运行的代码
Hook位置挑选
在程序执行中,越向底层执行流越大,越向上层,特征数据越多越好识别,因此选择一个合适的