对于会Hook的人来说,Hook其实也就那么回事.对于没有Hook过的人来说,会感觉Hook很高大上(其实也没毛病).
那么今天我们就来探讨一些Hook的原理是什么.
我认为任何Hook都可以分为以下三步(简称WFH ):
当然了同一个类型的Hook所在的地方一般是一样的.但寻找到Hook的地方,和进行Hook却会有许多不同的方法.我们要抓住的是不变的地方.
根据这3点我们举例来验证一下.
第一个我尽量说得详细一些.
举例子:Hook API:OpenProcess 让win10 64位的任务管理器关闭不了任何程序.
Hook API:OpenProcess. 在kernelbase.dll里面.
方式 1:
方式2: 编程直接引用OpenProcess 的地址,因为在Windows下3大模块user32.dll,kernelbase.dll,ntdll.dll的加载基地址在每个应用程序中都是一样的.
方式3: 通过寻找目标的IAT找到OpenProcess
方式1: 通过注入dll到目标进程进行,可以替换kernelbase.dll里面的OpenProcess 的前面5个字节为jmp跳转到我们自己的地址,也可以修改目标进程的IAT.
方式2: 通过WriteProcessMemory写入代码,修改目标进程的OpenProcess 跳转到我们的代码.
代码实例:F1+H1(Find的第二种方式,Hook的第一种方式,后面不再说明):
在dll文件里面写如下代码
如果你的win10是64位的就编译64位的,32位就编译32位的
把dll注入任务管理器,因为注入不是我们主题,所以这里我只是简单的贴出代码,直接拿来用就可以
```
#include <windows.h>
注入之后看效果
)
其实还有很多方式,剩下的方式你就可以自己慢慢尝试了.
刚才说了用户层的Hook,接下来我们再说一下内核层的Hook,其实还是3歩曲.WFH
实现相似的功能,让所有程序关闭不了自己的程序.
Windows 操作系统共有4个系统服务描述符.其中只用了两个,第一个是SSDT,第二个是ShadowSSDT
系统描述符结构如下:
SSDT Hook:NtOpenProcess,在ntkrnlpa.exe内核模块中的系统服务描述符表中的SSDT表中的第190号.
使用PCHunter32查看
方式1: 在Win7 32下,系统服务描述符表直接导出符号KeServiceDescriptorTable ,可以直接获取其地址,然后通过其第一个ServiceTableBase 就是SSDT 的地址,接着找到第190 号函数.
方式2: 可以通过PsGetCurrentThread 获取ETHREAD结构,该结构的第一个字段KTHREAD有一个字段ServiceTable保存着系统描述符表的地址KeServiceDescriptorTable .通过其第一个ServiceTableBase 就是SSDT 的地址,接着找到第190 号函数.
方式1: 替换找到的地方,换成我们自己的函数
方式2: 获取找到的地方的函数指针,改变其代码跳转到自己的代码(其实就是inline Hook).
例子:F2H1
新建一个驱动程序:
2.代码如下:
)
4.查看效果
这里我再说一些Hook,也是3歩曲WFH .但是我不再提供具体实现.
每一个不同的内核对象,都对应着一个不同的类型索引:TypeIndex.通过该索引可以找到该内核对象的类型:OBJECT_TYPE
在内核对象的TypeInfo中.
通过ObGetObjectType 内核函数获取内核对象类型(OBJECT_TYPE)的OBJECT_TYPE中有一个字段TypeInfo(类型_OBJECT_TYPE_INITIALIZER),其中保存着,在创建内核对象,销毁内核对象的一系列构造函数.
对应结构:
根据找到的位置替换里面回调函数指针为我们自己写的函数即可.比如替换OpenProcedure.
在中断描述符表(IDT)中.
idtr 寄存器指向中断描述符表.通过idtr找到.
说明:idtr是一个48位寄存器,其中低16位保存中断描述符表长度.高32位是中断描述符表.的基地址.
通过构造一个中断门或者陷阱门,其中中断门或陷阱门的偏移地址写自己的地址.然后把中断门或者陷阱门写入都相应的IDT表项中.
从上面我们可以看到,其实Hook都是一样的,只是对应的地方不同 ,寻找的方法不同 ,替换(修改)的方法不同 而已.
有的人可能就要反问了,SetWindowsHookEx,就不要知道Hook的地方在哪了,也不需要寻找.确实,这两歩不需要我们自己做,但并不代表不需要,这只是操作系统为我们做了而已,我们只需要提供一个回调函数即可.
所以下面我留下一个小测试:就是自己自己实现SetWindowsHookEx.
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)