tangptr@126.com 发表于 2015-10-6 02:42:55

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

本帖最后由 tangptr@126.com 于 2015-10-6 04:27 编辑

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

再看看OBJECT_TYPE_INITIALIZER结构体:

其中,我们只要修改掉SecurityProcedure就可以实现在打开进程的过程中经过自己的检查。而根据资料所写,原始的SecurityProcedure这个过程就是未导出函数SeDefaultObjectMethod。而SeDefaultObjectMethod这个函数,没有任何的文档描述过。根据资料所写的东西可知,这个函数返回值是NTSTATUS,调用约定是__stdcall,第一个参数是Object,剩余还有八个参数,均是未知的。因此可猜到该函数的原型是:
typedef NTSTATUS(__stdcall *SEDEFAULTOBJECTMETHOD)
(
PVOID Object,
ULONG SystemArgument1,
ULONG SystemArgument2,
ULONG SystemArgument3,
ULONG SystemArgument4,
ULONG SystemArgument5,
ULONG SystemArgument6,
ULONG SystemArgument7,
ULONG SystemArgument8
);
**** Hidden Message *****
于是我们挂钩的时候就这么写代码:
**** Hidden Message *****
而处理用的伪过程就像普通Hook一样,不过我们只在意第一个参数Object,代码如下:
**** Hidden Message *****
做一个杀进程杀线程的测试并用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这两个函数打开进程的方式对此保护均无效,但复制句柄则可以。线程方面则同理。
**** Hidden Message *****
p.s:杀进程用的东西无聊的加了个Call Hook PspTerminateThreadByPointer->KeInsertQueueApc的进程保护

laomaotx 发表于 2015-10-6 10:10:02

代码需回帖方可见,附件需回帖方能下载

huangchao209 发表于 2015-10-6 12:33:41

看看大牛的写法

Tesla.Angela 发表于 2015-10-6 14:08:50

直接HOOK不流行了。。。
在NT6上,可以通过修改OBJECT.TypeInfo.SupportsObjectCallbacks来实现过滤指定类型的句柄。
但在WIN8X64以及之后的系统会触发PG。

a504032670 发表于 2015-10-25 14:03:08

支持

284406022 发表于 2015-10-26 09:37:03

来看源码的

惊雷 发表于 2015-10-26 17:44:20

试试看看!!

link2006 发表于 2015-10-26 20:22:22

感谢楼主分享,顶贴支持~

hapi 发表于 2015-11-10 14:18:15

本帖最后由 hapi 于 2015-11-10 15:06 编辑

非常奇怪

tangptr@126.com 发表于 2015-11-10 15:26:02

hapi 发表于 2015-11-10 14:18
非常奇怪

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

Bluesky0702 发表于 2015-11-14 10:23:41

Thanks for sharing

hapi 发表于 2015-11-15 09:39:30

object hook 除了保护进程不被结束,还能怎么用呢?能保护内存么?

hapi 发表于 2015-11-16 16:51:38

SecurityProcedure这个过程就是未导出函数SeDefaultObjectMethod
查了下,参数是
SecurityProcedure)( Object,
                                                      QuerySecurityDescriptor,
                                                      &SecurityInformation,
                                                      *SecurityDescriptor,
                                                      &Length,
                                                      &ObjectHeader->SecurityDescriptor,
                                                      ObjectType->TypeInfo.PoolType,
                                                      &ObjectType->TypeInfo.GenericMapping );

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

46785131 发表于 2017-2-11 19:30:16

感谢分享……学习提高自己!~~

GGbbe 发表于 2017-2-21 16:33:39

看看杀线程的方式

CleanLove 发表于 2017-2-28 16:57:21

谢谢分享 谢谢

550832467 发表于 2017-3-11 12:53:37

开始学习谢谢楼主分享知识

hzmnue 发表于 2017-5-26 09:32:06

aaaaaaaaaaaaaaa

yyss258147 发表于 2017-6-5 00:33:56

学习下 看能不能Hook窗口对象

louk78 发表于 2017-7-4 13:37:40

看看大牛的写法

as3852711 发表于 2017-7-12 10:49:49


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

c3358 发表于 2017-7-21 04:44:42

谢谢分享!!

Goobo 发表于 2017-9-2 22:42:52

TP的学习笔记:利用Object Hook实现保护进线程,我得好好学习学习。

zt8152070 发表于 2017-9-5 09:20:33

学习一下

zouxiaofei 发表于 2017-9-10 17:24:33

学习一下

timothy78 发表于 2017-10-21 16:21:48

所以其实到底什么是对象钩子..

daniellee 发表于 2017-11-7 14:12:06

好好学习一下!!

aki447 发表于 2017-12-21 01:14:36

看看大牛是怎么实现的

x5417123 发表于 2017-12-23 05:52:49

学习学习

stylezhou1 发表于 2017-12-31 17:04:42

好东西,要学习

chaos4 发表于 2018-1-17 18:25:52

这个Hook会触发PG么

tangptr@126.com 发表于 2018-1-18 07:27:04

chaos4 发表于 2018-1-17 18:25
这个Hook会触发PG么

页: [1] 2
查看完整版本: TP的学习笔记:利用Object Hook实现保护进线程