Hook原理
时间:2020-02-15 09:15    来源:本站

  对于会Hook的人来说,Hook其实也就那么回事。对于没有Hook过的人来说,会感觉Hook很高大上(其实也没毛病)。

  当然了同一个类型的Hook所在的地方一般是一样的。但寻找到Hook的地方,和进行Hook却会有许多不同的方法。我们要抓住的是不变的地方。

  方式1:通过注入dll到目标进程进行,可以替换kernelbase.dll里面的OpenProcess的前面5个字节为jmp跳转到我们自己的地址,也可以修改目标进程的IAT。

  代码实例:F1+H1(Find的第二种方式,Hook的第一种方式,后面不再说明):

  把dll注入任务管理器,因为注入不是我们主题,所以这里我只是简单的贴出代码,直接拿来用就可以。

  刚才说了用户层的Hook,接下来我们再说一下内核层的Hook,其实还是3歩曲。WFH

  Windows 操作系统共有4个系统服务描述符。其中只用了两个,第一个是SSDT,第二个是ShadowSSDT。

  方式1:在Win7 32下,系统服务描述符表直接导出符号KeServiceDeorTable,可以直接获取其地址,然后通过其第一个ServiceTableBase就是SSDT的地址,接着找到第190号函数。

  方式2:获取找到的地方的函数指针,改变其代码跳转到自己的代码(其实就是inline Hook)

  我们知道以前windows系统是通过int2e中断进入系统内核的,但是现在是通过cpu提供的一个功能sysentry进入系统的(32位是sysentry,64位是syscall)。这是一个CPU指令,如果对该指令不知道的话,可以查看我另外一篇文章:

  每一个不同的内核对象,都对应着一个不同的类型索引:TypeIndex.通过该索引可以找到该内核对象的类型:OBJECT_TYPE

  根据找到的位置替换里面回调函数指针为我们自己写的函数即可,比如替换OpenProcedure。

  说明:idtr是一个48位寄存器,其中低16位保存中断描述符表长度,高32位是中断描述符表.的基地址。

  通过构造一个中断门或者陷阱门,其中中断门或陷阱门的偏移地址写自己的地址。然后把中断门或者陷阱门写入都相应的IDT表项中。

  从上面我们可以看到,其实Hook都是一样的,只是对应的地方不同,寻找的方法不同,替换(修改)的方法不同而已。

  有的人可能就要反问了,SetWindowsHookEx,就不要知道Hook的地方在哪了,也不需要寻找。确实,这两歩不需要我们自己做,但并不代表不需要,这只是操作系统为我们做了而已,我们只需要提供一个回调函数即可。

  所以下面我留下一个小测试:就是自己自己实现SetWindowsHookEx。