首页
社区
课程
招聘
[原创]x64内核中的HOOK技术. 拦截进程,拦截线程,拦截模块(思路)
发表于: 2018-2-5 23:39 25120

[原创]x64内核中的HOOK技术. 拦截进程,拦截线程,拦截模块(思路)

2018-2-5 23:39
25120

在32系统下, 例如我们要HOOK SSDT表,那么直接讲CR0的内存保护属性去掉. 直接讲表的地址修改即可.

但是在64位系统下,不可以这样操作了.

第一是因为 SSDT表加密了.  

第二是 SSDT表你就算解密了. 那么你的API的地址也会放的很远. SSDT表放不下4G以外的地址. 所以也不能放.

而现在.试想一下, 杀毒软件也要在内核中做点手脚. 如果不能HOOK了,它们该怎么发展那?

所以到了win7 (64位)系统下, 微软被玩怕了. 直接告诉你. 你想HOOK那个API,我帮你做. 你不用动手做. 而且我的还稳定.不会蓝屏.

所以x64下的HOOK都是很简单的

比如 xxx杀毒软件要监视进程的创建. 那么微软就说.我给你API调用,你提供回调. 当创建的时候我就通知你. 返回值也是你说了算.

这样我们就可以使用它的API了.  线程. 模块都是这样的.

API:

  PsSetCreateProcessNotifyRoutineEx

函数原型

这个函数的作用就是 当进程创建的时候会通知你.

参数一回调函数原型

进程额外信息结构体

我们如果对返回状态进行操作. 那么如果你返回值给失败,那么进程就不会创建. 也就实现了我们阻止进程的创建了.

内核 代码实际操作 阻止calc计算器的创建.

initHook函数代码.

回调函数代码.

回调卸载函数.

代码图片:


其中UnInstallHook则是调用卸载回调的函数.

驱动入口点调用initHook即可.

拦截图片:

编译好我们的驱动.去x64加载. 打开计算机则会被拦截.


原理:

  如果想知道原理,那么就要看Wrk源码.而在Wrk中,并没有这个API,这个API是64位才有的.但是在32下有一个,有一个不带EX版本的.我们可以参考一下.

 


通过源码可以发现.是操作数组.且这个数组里面是我们填写的回调.操作系统会依次调用回调.

跟随数组查看.


跟随查看,发现是个定长数组.里面只有八项.但是在32位,没人会使用这个API.所以8项正好,但是在64位系统下,数组变为了64

也就是说.我们可以通过找到数组首地址,进行HOOK里面的回调.那么我们的就会执行.当然我们也可以自己注册.

线程拦截和进程拦截相似.但是在64位下,微软提供的HOOK函数没有这么强大.

并没有带有EX的.

所以我们只能用原来的.

线程监控API

  监控:    PsSetCreateThreadNotifyRoutine

  取消监控:  PsRemoveCreateThreadNotifyRoutine

监控原型:

卸载函数原型:


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

最后于 2019-2-1 17:09 被admin编辑 ,原因:
收藏
免费 2
支持
分享
最新回复 (49)
雪    币: 881
活跃值: (9856)
能力值: ( LV13,RANK:385 )
在线值:
发帖
回帖
粉丝
2
大佬给点评论. 
2018-2-5 23:44
0
雪    币: 881
活跃值: (9856)
能力值: ( LV13,RANK:385 )
在线值:
发帖
回帖
粉丝
3
那里写的不对,请告诉我.分享技术.是乐趣.  别人学到了.自己也在总结的过程中学到了.  谢谢大家.
2018-2-5 23:52
0
雪    币: 23080
活跃值: (3432)
能力值: (RANK:648 )
在线值:
发帖
回帖
粉丝
4
64位内核资料网上比较少,感谢楼主的分享。HOOK是很常见的对抗手法,0环的HOOK乃兵家必争之地。64位内核提供了HOOK的API但也有了局限性,第一个HOOK的就是老大啊。楼主有空带我们分析分析这些API的实现原理,找到保存HOOK的函数指针表的位置。
2018-2-6 00:06
0
雪    币: 524
活跃值: (48)
能力值: ( LV6,RANK:140 )
在线值:
发帖
回帖
粉丝
5
x64下Hook  SSDT可以通过KeBugCheckEx中转实现的
2018-2-6 00:18
0
雪    币: 881
活跃值: (9856)
能力值: ( LV13,RANK:385 )
在线值:
发帖
回帖
粉丝
6
JieLiuHouZi x64下Hook SSDT可以通过KeBugCheckEx中转实现的[em_2]
在寄存器msr  中,在64位下,通过查看cpu  文档可以得知地址是在c0000082  中,使用汇编指令  rdmsr  c0000082  可以得出地址,对它u下就能得到  中专api  了,但是对他加密了
2018-2-6 00:31
0
雪    币: 7
活跃值: (333)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
7
还是认真逆向下win  defender吧。
2018-2-6 06:33
0
雪    币: 81
活跃值: (40)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
8
原理不难,难的是业务.
2018-2-6 09:30
0
雪    币: 12848
活跃值: (9147)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
9
拦截线程和拦截模块呢?
2018-2-6 10:08
0
雪    币: 5039
活跃值: (2626)
能力值: ( LV12,RANK:290 )
在线值:
发帖
回帖
粉丝
10
我只看到了拦截进程创建,后面两个被吃了?
2018-2-6 10:11
0
雪    币: 300
活跃值: (2477)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
mark
2018-2-6 10:32
0
雪    币: 881
活跃值: (9856)
能力值: ( LV13,RANK:385 )
在线值:
发帖
回帖
粉丝
12
叁毛 还是认真逆向下win defender吧。
谢谢提醒.
2018-2-6 14:16
0
雪    币: 881
活跃值: (9856)
能力值: ( LV13,RANK:385 )
在线值:
发帖
回帖
粉丝
13
FaEry 我只看到了拦截进程创建,后面两个被吃了?
后面一个被吃了,  前面两个没被吃    后面一个是思路.
2018-2-6 14:17
0
雪    币: 881
活跃值: (9856)
能力值: ( LV13,RANK:385 )
在线值:
发帖
回帖
粉丝
14
hzqst 拦截线程和拦截模块呢?
有写,  模块没有写,模块提供了思路
2018-2-6 14:17
0
雪    币: 2291
活跃值: (938)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
15
好久没搞这些,依稀记得64位的SSDT表不是加密吧
2018-2-6 15:22
0
雪    币: 881
活跃值: (9856)
能力值: ( LV13,RANK:385 )
在线值:
发帖
回帖
粉丝
16
轩辕之风 好久没搞这些,依稀记得64位的SSDT表不是加密吧
右边移动4位. 
2018-2-6 15:25
0
雪    币: 2291
活跃值: (938)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
17
张新琪 轩辕之风 好久没搞这些,依稀记得64位的SSDT表不是加密吧 右边移动4位. 
好像是这样,不过这也不是加密啊
2018-2-6 16:39
0
雪    币: 38
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Bho
18
我就知道是科锐的
2018-2-6 17:31
0
雪    币: 881
活跃值: (9856)
能力值: ( LV13,RANK:385 )
在线值:
发帖
回帖
粉丝
19
Bho [em_19]我就知道是科锐的
咋,
2018-2-6 17:53
0
雪    币: 881
活跃值: (9856)
能力值: ( LV13,RANK:385 )
在线值:
发帖
回帖
粉丝
20
轩辕之风 好像是这样,不过这也不是加密啊[em_13]
是吧,谢谢哈.
2018-2-6 17:54
0
雪    币: 1736
活跃值: (45)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
试一下你就会发现拦截模块修改OEP  并没有卵用!
2018-2-6 18:02
0
雪    币: 1602
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
感谢知识分享
2018-2-7 07:39
0
雪    币: 1176
活跃值: (1264)
能力值: ( LV12,RANK:380 )
在线值:
发帖
回帖
粉丝
23
回调这也算啊  ,,,, 
CmRegisterCallback
CmRegisterCallbackEx
ExRegisterCallback
ObRegisterCallbacks
PsSetCreateProcessNotifyRoutine
PsSetCreateProcessNotifyRoutineEx
PsSetCreateProcessNotifyRoutineEx2
PsSetCreateThreadNotifyRoutine
PsSetCreateThreadNotifyRoutineEx
PsSetLoadImageNotifyRoutine
2018-2-7 10:12
0
雪    币: 965
活跃值: (89)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
感谢知识分享
2018-2-7 17:20
0
雪    币: 515
活跃值: (3272)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wem
25
谢谢分享
2018-2-8 16:34
0
游客
登录 | 注册 方可回帖
返回
//