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的进程保护 代码需回帖方可见,附件需回帖方能下载 看看大牛的写法 直接HOOK不流行了。。。
在NT6上,可以通过修改OBJECT.TypeInfo.SupportsObjectCallbacks来实现过滤指定类型的句柄。
但在WIN8X64以及之后的系统会触发PG。 支持 来看源码的 试试看看!! 感谢楼主分享,顶贴支持~ 本帖最后由 hapi 于 2015-11-10 15:06 编辑
非常奇怪 hapi 发表于 2015-11-10 14:18
非常奇怪
不奇怪啊。。。返回值是0x8000000E就意味着打印机缺纸啊
如果要改成拒绝访问,那就设置返回值为0xC0000022 Thanks for sharing object hook 除了保护进程不被结束,还能怎么用呢?能保护内存么? SecurityProcedure这个过程就是未导出函数SeDefaultObjectMethod
查了下,参数是
SecurityProcedure)( Object,
QuerySecurityDescriptor,
&SecurityInformation,
*SecurityDescriptor,
&Length,
&ObjectHeader->SecurityDescriptor,
ObjectType->TypeInfo.PoolType,
&ObjectType->TypeInfo.GenericMapping );
除了Object有用外,谁告诉其它参数有什么用途? 感谢分享……学习提高自己!~~ 看看杀线程的方式 谢谢分享 谢谢 开始学习谢谢楼主分享知识 aaaaaaaaaaaaaaa 学习下 看能不能Hook窗口对象 看看大牛的写法
看看大牛的写法,看看跟网上流传的有没有改进学习一下 谢谢分享!! TP的学习笔记:利用Object Hook实现保护进线程,我得好好学习学习。 学习一下 学习一下 所以其实到底什么是对象钩子.. 好好学习一下!! 看看大牛是怎么实现的 学习学习 好东西,要学习 这个Hook会触发PG么 chaos4 发表于 2018-1-17 18:25
这个Hook会触发PG么
会
页:
[1]
2