找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 31585|回复: 50

TP的学习笔记:利用Object Hook实现保护进线程

 火... [复制链接]

78

主题

190

回帖

9

精华

贵宾会员

积分
15605
发表于 2015-10-6 02:42:55 | 显示全部楼层 |阅读模式
本帖最后由 tangptr@126.com 于 2015-10-6 04:27 编辑

鉴于大批伸手党的存在,今日起TP的学习笔记中的代码需回帖方可见,附件需回帖方能下载。
用过PCHunter的朋友们应该都看到过“内核钩子”->“Object钩子”吧,但是却从来不知道这里面的函数如何挂钩。这些天里看了些对象相关的文章后,理解并开始自己尝试写代码。
首先我们要关注一下我们要关心什么对象,那就是进程和线程。进程对象类型是PsProcessType,线程对象类型是PsThreadType。这个是一个OBJECT_TYPE结构的地址。首先先用WinDbg查看其结构。

OBJECT_TYPE的结构

OBJECT_TYPE的结构

再看看OBJECT_TYPE_INITIALIZER结构体:

OBJECT_TYPE_INITIALIZER

OBJECT_TYPE_INITIALIZER

其中,我们只要修改掉SecurityProcedure就可以实现在打开进程的过程中经过自己的检查。而根据资料所写,原始的SecurityProcedure这个过程就是未导出函数SeDefaultObjectMethod。而SeDefaultObjectMethod这个函数,没有任何的文档描述过。根据资料所写的东西可知,这个函数返回值是NTSTATUS,调用约定是__stdcall,第一个参数是Object,剩余还有八个参数,均是未知的。因此可猜到该函数的原型是:
  1. typedef NTSTATUS(__stdcall *SEDEFAULTOBJECTMETHOD)
  2. (
  3. PVOID Object,
  4. ULONG SystemArgument1,
  5. ULONG SystemArgument2,
  6. ULONG SystemArgument3,
  7. ULONG SystemArgument4,
  8. ULONG SystemArgument5,
  9. ULONG SystemArgument6,
  10. ULONG SystemArgument7,
  11. ULONG SystemArgument8
  12. );
复制代码

游客,如果您要查看本帖隐藏内容请回复

于是我们挂钩的时候就这么写代码:
游客,如果您要查看本帖隐藏内容请回复

而处理用的伪过程就像普通Hook一样,不过我们只在意第一个参数Object,代码如下:
游客,如果您要查看本帖隐藏内容请回复

做一个杀进程杀线程的测试并用PCHunter v1.35检查Object Hook:
先测试一下杀进程,其中Ring3版的是直接ZwOpenProcess+ZwTerminateProcess,Ring0版的是ObOpenObjectByPointer+ZwTerminateProcess并用头五字节硬编码的方式恢复ObOpenObjectByPointer的头五个字节。

杀进程测试

杀进程测试

再测试一下杀线程,原理差不多,但不知为何,Ring0级杀正常线程的时候在NtTerminateThread这一层被驳回,返回了STATUS_ACCESS_DENIED这个值。知道原因的人帮忙回帖解答。

杀线程测试

杀线程测试

最后看看PCHunter的钩子状况

检测钩子的结果

检测钩子的结果

到这里,我们的Object Hook方式实现保护进线程貌似是可以到此为止了,不过这里还是有两点要说:
1.OBJECT_TYPE和OBJECT_TYPE_INITIALIZER两个结构体在各个系统中均不一样,本文提供了XP下可用的demo。故本文所使用的硬编码也是XP可用而其他系统不可用。其中win7的硬编码是0x28+0x44,2k3的硬编码是0x60+0x40。大家可以用WinDbg来查看。
2.由于这种方式可以阻止ObOpenObjectByPointer打开进程,故NtOpenProcess,NtGetNextProcess这两个函数打开进程的方式对此保护均无效,但复制句柄则可以。线程方面则同理。
游客,如果您要查看本帖隐藏内容请回复

p.s:杀进程用的东西无聊的加了个Call Hook PspTerminateThreadByPointer->KeInsertQueueApc的进程保护

0

主题

35

回帖

0

精华

铜牌会员

积分
158
发表于 2015-10-6 10:10:02 | 显示全部楼层
代码需回帖方可见,附件需回帖方能下载

8

主题

51

回帖

0

精华

铜牌会员

积分
291
发表于 2015-10-6 12:33:41 | 显示全部楼层
看看大牛的写法

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
发表于 2015-10-6 14:08:50 | 显示全部楼层
直接HOOK不流行了。。。
在NT6上,可以通过修改OBJECT.TypeInfo.SupportsObjectCallbacks来实现过滤指定类型的句柄。
但在WIN8X64以及之后的系统会触发PG。

评分

参与人数 1水晶币 +10 收起 理由
hapi + 10 很好!

查看全部评分

0

主题

19

回帖

0

精华

铜牌会员

积分
63
发表于 2015-10-25 14:03:08 | 显示全部楼层
支持

2

主题

165

回帖

0

精华

金牌会员

积分
944
发表于 2015-10-26 09:37:03 | 显示全部楼层
来看源码的

1

主题

29

回帖

0

精华

铜牌会员

积分
94
发表于 2015-10-26 17:44:20 | 显示全部楼层
试试看看!!

2

主题

30

回帖

0

精华

铜牌会员

积分
37
发表于 2015-10-26 20:22:22 | 显示全部楼层
感谢楼主分享,顶贴支持~

2

主题

45

回帖

0

精华

铜牌会员

积分
214
发表于 2015-11-10 14:18:15 | 显示全部楼层
本帖最后由 hapi 于 2015-11-10 15:06 编辑

非常奇怪
QQ图片20151110150520.png

78

主题

190

回帖

9

精华

贵宾会员

积分
15605
 楼主| 发表于 2015-11-10 15:26:02 | 显示全部楼层

不奇怪啊。。。返回值是0x8000000E就意味着打印机缺纸啊
如果要改成拒绝访问,那就设置返回值为0xC0000022

0

主题

25

回帖

0

精华

铜牌会员

积分
69
发表于 2015-11-14 10:23:41 | 显示全部楼层
Thanks for sharing

2

主题

45

回帖

0

精华

铜牌会员

积分
214
发表于 2015-11-15 09:39:30 | 显示全部楼层
object hook 除了保护进程不被结束,还能怎么用呢?能保护内存么?

2

主题

45

回帖

0

精华

铜牌会员

积分
214
发表于 2015-11-16 16:51:38 | 显示全部楼层
SecurityProcedure这个过程就是未导出函数SeDefaultObjectMethod

查了下,参数是
SecurityProcedure)( Object,
                                                        QuerySecurityDescriptor,
                                                        &SecurityInformation,
                                                        *SecurityDescriptor,
                                                        &Length,
                                                        &ObjectHeader->SecurityDescriptor,
                                                        ObjectType->TypeInfo.PoolType,
                                                        &ObjectType->TypeInfo.GenericMapping );

除了Object有用外,谁告诉其它参数有什么用途?

0

主题

34

回帖

0

精华

铜牌会员

积分
68
发表于 2017-2-11 19:30:16 | 显示全部楼层
感谢分享……学习提高自己!~~

0

主题

27

回帖

0

精华

铜牌会员

积分
169
发表于 2017-2-21 16:33:39 | 显示全部楼层
看看杀线程的方式

0

主题

111

回帖

0

精华

银牌会员

积分
340
发表于 2017-2-28 16:57:21 | 显示全部楼层
谢谢分享 谢谢

0

主题

26

回帖

0

精华

贵宾会员

积分
534
发表于 2017-3-11 12:53:37 | 显示全部楼层
开始学习  谢谢楼主分享知识

0

主题

18

回帖

0

精华

贵宾会员

积分
10032
发表于 2017-5-26 09:32:06 | 显示全部楼层
aaaaaaaaaaaaaaa

0

主题

11

回帖

0

精华

铜牌会员

积分
52
发表于 2017-6-5 00:33:56 | 显示全部楼层
学习下 看能不能Hook窗口对象

0

主题

24

回帖

0

精华

初来乍到

积分
4
发表于 2017-7-4 13:37:40 | 显示全部楼层
看看大牛的写法

0

主题

56

回帖

0

精华

铜牌会员

积分
222
发表于 2017-7-12 10:49:49 | 显示全部楼层

看看大牛的写法,看看跟网上流传的有没有改进学习一下

0

主题

45

回帖

0

精华

初来乍到

积分
29
发表于 2017-7-21 04:44:42 | 显示全部楼层
谢谢分享!!

0

主题

1

回帖

0

精华

初来乍到

积分
15
发表于 2017-9-2 22:42:52 | 显示全部楼层
TP的学习笔记:利用Object Hook实现保护进线程,我得好好学习学习。

0

主题

51

回帖

0

精华

铜牌会员

积分
90
发表于 2017-9-5 09:20:33 | 显示全部楼层
学习一下

0

主题

38

回帖

0

精华

初来乍到

积分
20
发表于 2017-9-10 17:24:33 | 显示全部楼层
学习一下

0

主题

2

回帖

0

精华

铜牌会员

积分
36
发表于 2017-10-21 16:21:48 | 显示全部楼层
所以其实到底什么是对象钩子..

0

主题

75

回帖

0

精华

铜牌会员

积分
95
发表于 2017-11-7 14:12:06 | 显示全部楼层
好好学习一下!!

0

主题

54

回帖

0

精华

铜牌会员

积分
51
发表于 2017-12-21 01:14:36 | 显示全部楼层
看看大牛是怎么实现的

0

主题

7

回帖

0

精华

铜牌会员

积分
33
发表于 2017-12-23 05:52:49 | 显示全部楼层
学习学习

0

主题

6

回帖

0

精华

初来乍到

积分
22
发表于 2017-12-31 17:04:42 | 显示全部楼层
好东西,要学习

0

主题

49

回帖

0

精华

铜牌会员

积分
61
发表于 2018-1-17 18:25:52 | 显示全部楼层
这个Hook会触发PG么

78

主题

190

回帖

9

精华

贵宾会员

积分
15605
 楼主| 发表于 2018-1-18 07:27:04 | 显示全部楼层
chaos4 发表于 2018-1-17 18:25
这个Hook会触发PG么

您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表