首页
社区
课程
招聘
[原创]Hook原理
发表于: 2018-6-20 14:46 46743

[原创]Hook原理

2018-6-20 14:46
46743

对于会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.

  •          Hook原理
  •                  Hook API
  •                          1. Where.
  •                          2.Find.
  •                          3.Hook.
  •                  SSDT Hook.
  •                          1.Where
  •                          2.Find
  •                          3.Hook
  •                  SYSENTRY Hook
  •                          1.Where
  •                          2.Find
  •                          3.Hook
  •                  Object Hook
  •                          1.Where
  •                          2.Find
  •                          3.Hook
  •                  IDT Hook
  •                          1.Where
  •                          2.Find
  •                          3.Hook
  •          总结:
 
 
 
 
 
 
 

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 7
支持
分享
打赏 + 13.00雪花
打赏次数 3 雪花 + 13.00
 
赞赏  一位没有留下痕迹的看雪读者   +10.00 2021/10/22
赞赏  symofeng   +1.00 2018/06/26
赞赏  junkboy   +2.00 2018/06/20
最新回复 (36)
雪    币: 775
活跃值: (2292)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
2
感谢分析,最近在写  object  hook  时候发现每个系统的回调函数原型都会发生改变。。
只能对照WRK大致得到伪代码,不知兄台可有这方面的心得或者资料?
//Win7  x64
typedef  NTSTATUS(*OB_OPEN_METHOD)(
IN  PVOID  Unknown,
IN  OB_OPEN_REASON  OpenReason,
IN  PEPROCESS  Process  OPTIONAL,
IN  PVOID  Object,
IN  PACCESS_MASK  GrantedAccess
);
这个是大致得到的伪代码,虽然测试没问题但还是有点心灵洁癖,... 
2018-6-20 21:47
0
雪    币: 3738
活跃值: (3872)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
感谢分享!
2018-6-20 22:40
0
雪    币: 6818
活跃值: (153)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
2018-6-20 22:52
0
雪    币: 12628
活跃值: (3127)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
x64不能内嵌汇编了,有什么好办法?
2018-6-21 05:46
0
雪    币: 4139
活跃值: (2854)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
6
rongge x64不能内嵌汇编了,有什么好办法?
x64还是可以内联汇编的只是稍微麻烦一点.
https://bbs.pediy.com/thread-219221.htm 11楼
最后于 2018-6-21 07:54 被chpeagle编辑 ,原因:
2018-6-21 07:48
0
雪    币: 4139
活跃值: (2854)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
7
AperOdry 感谢分析,最近在写 object hook 时候发现每个系统的回调函数原型都会发生改变。。 只能对照WRK大致得到伪代码,不知兄台可有这方面的心得或者资料? //Win7 x64 typedef ...
据我所知,最最直接有效的方法就是逆向出函数原型.还有google
2018-6-21 07:49
0
雪    币: 171
活跃值: (519)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
额,,这个就是汇编,并非内联汇编。
如果想要内联,感觉只能换编译器了
2018-6-21 10:47
0
雪    币: 12352
活跃值: (5118)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9

多谢楼主分享,学习了
2018-6-21 10:50
0
雪    币: 6977
活跃值: (1786)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
10
inline  hook不好用,想用原函数的时候还要恢复,不如直接改IAT
2018-6-21 11:46
0
雪    币: 4139
活跃值: (2854)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
11

有时候确实是,不过内联可以使用"热补丁",

修改之后
图片描述

 

而且IAT 有个缺陷就是,动态加载的模块(通过LoadLibrary)是不会被写入IAT.
任务管理器的OpenProcess也不是放进常规模块中,而是放入:
.
这个模块在每个不同版本的Windows上可能不同的,也就不具备通用性了.

2018-6-21 13:50
0
雪    币: 9
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
非常详细,思路非常清晰,感觉可以收录到年度精华集,感谢分享!
2018-6-21 15:26
0
雪    币: 47
活跃值: (21)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
精彩的文章,瞬间明白好多
2018-6-21 15:31
0
雪    币: 1539
活跃值: (69)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
14
有两处小问题:
1. 这里的操作没上锁
    
2. 这里只锁了一个核
    
2018-6-21 18:33
0
雪    币: 4139
活跃值: (2854)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
15
呼噜 有两处小问题:1. 这里的操作没上锁&nbsp; &nbsp;&nbsp;2. 这里只锁了一个核&nbsp; &nbsp;&nbsp;
谢谢提醒,确实会存在这样的问题.
2018-6-21 20:15
0
雪    币: 995
活跃值: (69)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
thanks  for  sharing
2018-6-22 00:20
0
雪    币: 9198
活跃值: (1635)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
17
谢谢分享
2018-6-22 10:48
0
雪    币: 12848
活跃值: (9147)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
18
听说你想勾sysenter  /  idt  入口?
1、PatchGuard之类老生常谈的东西我就不提了
2、页表隔离了解一下?UserDirectoryTable不映射你代码你能怎么办
3、DeviceGuard了解一下?只要敢乱动msr  /  idtr寄存器,微软马上给你安排得明明白白的
总结就是四个字:加大力度  蓝屏就完事了
最后于 2018-6-22 14:37 被hzqst编辑 ,原因:
2018-6-22 14:37
0
雪    币: 181
活跃值: (621)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
x64不是有很多inline  Hook的帖子了吗,咋还在问  汇编的事情-  -
2018-6-22 21:21
0
雪    币: 26
活跃值: (256)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
W10 64   注入器Debug x64 DLL Debug x64 注入成功,任务管理闪退
2018-11-8 20:45
0
雪    币: 300
活跃值: (2477)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
mark
2018-11-9 17:25
0
雪    币: 44
活跃值: (32)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
远程注入的时候成功,为什么在调用自定义函数中的openprocess的时候返回0?以至于任务管理器中的某个函数调用这个返回值的时候发生读写错误奔溃
2018-11-17 13:10
0
雪    币: 3676
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
感谢老师的教程,涨芝士了
2018-11-29 19:14
0
雪    币: 854
活跃值: (69)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
24
为啥APIHOOK 你保护进程不被结束 hook的是OpenProcess?
2018-12-7 17:58
0
雪    币: 4139
活跃值: (2854)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
25
wx_clay 为啥APIHOOK 你保护进程不被结束 hook的是OpenProcess?
权限过滤
2018-12-10 17:10
0
游客
登录 | 注册 方可回帖
返回
//