首页
社区
课程
招聘
[原创]---注销 QQ 过滤驱动设置的事件通知 CALLBACK (完)-------
2018-7-2 14:16 7014

[原创]---注销 QQ 过滤驱动设置的事件通知 CALLBACK (完)-------

2018-7-2 14:16
7014

系列的最后一篇演示如何通过调试手段摘除 QQ 过滤驱动设置的事件通知 CallBack。

内核中有几个全局的数组用来存放这些事件通知 CallBack 的指针,第一个就是nt!PspCreateProcessNotifyRoutine,

当有进程被创建时,该数组中的函数指针就会依次被调用,与此类似,当有线程被创建时,nt!PspCreateThreadNotifyRoutine

数组中的函数指针就被调用;nt!PspLoadImageNotifyRoutine中的回调则是在有内核模块加载时被调用。

驱动程序通过向这些数组中加入 CallBack 指针,就能够监控相应的事件。

首先来看下哪些驱动程序正在监控系统范围的进程创建事件:

1 r @$t0=poi(nt!PspCreateProcessNotifyRoutineCount);
2 r @$t1=nt!PspCreateProcessNotifyRoutine;
3 .for(r @$t2=0; @$t2<@$t0; r @$t2=@$t2+1){dds (poi(@$t1+@$t2*4)^7)+4 l1;}

 

从上图您可以看到,QQFrmMgr.sys 中有一个例程正在监视着进程创建事件。除此之外的其它内核模块都是合法的,比如

“avkmgr”与“avdevprot”是安装德国小红伞反病毒软件时,附带安装的两个内核模式驱动程序,它们注册了各自的回调在

监控着进程创建事件,这是实现 Real-Time Protection 用到的系统底层机制之一;“tcpip”不用我说各位也知道,它是

Windows 内核网络栈的主要实现模块之一:

 

注意,系统最多支持注册 8 枚事件回调指针,nt!PspCreateProcessNotifyRoutineCount存储当前注册的回调指针数量,如下图,

这个全局变量的值与第一张图片中的事件回调指针枚数一致:

 

现在,我们尝试从中摘除 QQFrmMgr.sys 的监控例程:


 


使用类似的手段,检查 QQFrmMgr.sys 有没有监控线程创建与内核模块加载事件:

 1 r @$t0=poi(nt!PspCreateThreadNotifyRoutineCount);
 2 r @$t1=nt!PspCreateThreadNotifyRoutine;
 3 .for(r @$t2=0; @$t2<@$t0; r @$t2=@$t2+1){dds (poi(@$t1+@$t2*4)^7)+4 l1;}
 4 
 5 
 6 
 7 
 8 r @$t0=poi(nt!PspLoadImageNotifyRoutineCount);
 9 r @$t1=nt!PspLoadImageNotifyRoutine;
10 .for(r @$t2=0; @$t2<@$t0; r @$t2=@$t2+1){dds (poi(@$t1+@$t2*4)^7)+4 l1;}


您看,这家伙监控的地方还真不少,为的就是保护它自己免受其它恶意软件攻击!或许你会好奇:图中的“XLGuard”是啥东

东?

它就是在安装“迅雷”(一种基于 BitTorrent 协议的 P2P 下载/分享软件)时,一并安装的内核模式驱动程序之一,如下图:


从名称中的“Guard”来看,应该也是用来保护迅雷自身组件的——现在的软件都比女性还懂得怎么保护自己呢!

你可以使用前述的方法来阻止 QQFrmMgr.sys 监控线程创建与内核模块加载事件——就布置成家庭作业吧!

———————————————————————————————————————————————————

写到这里,本系列算是大致功德圆满了。。。。还记得上一篇我抱怨说“!chkimg”调试器扩展命令不能用吗?

折腾的这几天总算找出问题所在了——从 MSDN 网站下载的 Windows 7零售版符号包中的 ntoskrnl.exe 版本问题——我听信

该站点的建议下载了 Windows 7 Service Pack 1 x86 零售符号,结果其中的 ntoskrnl.exe 内核映像版本被最新版的

WinDbg 排斥,所以我换用了 Windows 8.1 x86 32 位零售符号,以便双机物理调试环境中检查目标机器上的 Windows 8.1

内核工作情况,也证实了 QQ 驱动没有采取反虚拟机技术,它的行为模式与在真实机器上的表现一致(至少在写作本文的时间点上

是如此,以后就难说了,搞不好也会引入反调试技术。。。),如下图:


最后贴上在 32 位 Windows 8.1 上利用“!chkimg”自动检查并恢复 SSDT 的过程,以飨读者:

 

 

NND,为啥前面手工检查 SSDT 能够发现的 QQ hooks,通过“!chkimg”自动检查却探测不到,只识别了 inline hook ?

阅读一下该扩展命令的官方文档,原来是需要指定一个特殊的选项:


正如图中红框部分所讲的那样:Hal.dll 与 Ntoskrnl.exe 中的某些特定地址不会被检查,因为当这些部分被载入时,会发生某些改变。

包含-nospec选项则可以检查这些地址。事实上,这就是我在前一篇谈到的——每次系统启动时都随机创建 SSDT 的基址,所以

“!chkimg”就忽略了这些“随机”的部分,偏偏给 QQ 驱动留下了可乘之机。。。。添加 -nospec 选项后,我们成功地

分析出 SSDT 中的所有 hooks,下面我仅截取了输出的前三个 hooks,它们对应于前面有一张“dps”命令解析图中的三个 hooks:


 以上图中的黄框部分为例,第一个 hook 是从 8151b3a8 到 8151b3aa 的三个字节修改;冒号左边是磁盘文件中的原始字节

序列,冒号右边是内存映像中的已修改字节序列,该项 hook 距离 nt!KiServiceTable 起始地址的偏移量为 0xC。

让我们看看前三个 hook 的受害例程(原始系统服务)是什么?


原来 QQFrmMgr.sys hook 了 NtWriteVirtualMemory()(写入任意进程的虚拟内存)、NtUnmapViewOfSection()(取消

映射 section 的视图;Windows 内存管理器中用来实现共享内存和映射文件的底层原语就叫做 "section 对象";合法的驱动

程序程序应该仅使用 ZwOpenSection(),ZwMapViewOfSection(),以及 ZwUnmapViewOfSection() 等函数操纵 section

对象;于是 hook 该系统服务的用意在于监视映射文件与查看其中部分内容的请求)、

以及 NtTerminateProcess()(终止进程),这与我前一篇的手工分析一致。

 最后,让我们用“!chkimg”的“-f”开关,自动修正内存映像中的错误:


 

 

————————————————————————————————————————————————————————
小结:本篇讨论了摘除恶意事件通知回调函数的相关技巧,并演示自动修复关键系统设施的方法,文中介绍的调试技术只是

内核攻防中的冰山一角,而且这些方法随着内核与恶意软件的不断进化也正面临着挑战!

持续研究与探索不同内核驱动/rootkit 的行为模式仍旧是必要的!
————————————————————————————————————————————————————————


[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

最后于 2018-7-2 17:34 被shayi编辑 ,原因:
收藏
点赞2
打赏
分享
最新回复 (12)
雪    币: 940
活跃值: (1053)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
红金龙e晓楼 2018-7-2 14:31
2
0
没有一张图幸存,全军覆没
雪    币: 22979
活跃值: (3337)
能力值: (RANK:648 )
在线值:
发帖
回帖
粉丝
KevinsBobo 8 2018-7-2 14:48
3
0
感谢分享!麻烦楼主重新上传下图片
最后于 2018-7-2 14:48 被KevinsBobo编辑 ,原因:
雪    币: 1604
活跃值: (640)
能力值: ( LV13,RANK:460 )
在线值:
发帖
回帖
粉丝
shayi 9 2018-7-2 17:37
4
0
KevinsBobo 感谢分享!麻烦楼主重新上传下图片
所有图片已重传,现在能看到了么
最后于 2018-7-2 17:37 被shayi编辑 ,原因:
雪    币: 310
活跃值: (1917)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
niuzuoquan 2018-7-2 17:54
5
0
mark
雪    币: 22979
活跃值: (3337)
能力值: (RANK:648 )
在线值:
发帖
回帖
粉丝
KevinsBobo 8 2018-7-2 18:14
6
0
shayi KevinsBobo 感谢分享!麻烦楼主重新上传下图片 所有图片已重传,现在能看到了么
可以了
雪    币: 6
活跃值: (1464)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zjjhszs 2018-7-3 13:19
7
1
这一系列  是WINDBG 微操的详解篇之一,希望能出更多的系列文章,文章很精彩,实在是用心写的杰作,比某牛出烂书圈钱高尚的不知道那里去了唉!
雪    币: 914
活跃值: (2188)
能力值: ( LV5,RANK:68 )
在线值:
发帖
回帖
粉丝
万剑归宗 1 2018-7-3 14:32
8
0
中秋等着收腾讯的月饼吧
雪    币: 12837
活跃值: (8998)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
hzqst 3 2018-7-3 16:42
9
0

注意,系统最多支持注册 8 枚事件回调指针,nt!PspCreateProcessNotifyRoutineCount存储当前注册的回调指针数量,如下图,

这是哪个年代的文章了?vista开始都支持64个回调了
雪    币: 1604
活跃值: (640)
能力值: ( LV13,RANK:460 )
在线值:
发帖
回帖
粉丝
shayi 9 2018-7-4 02:04
10
0
hzqst 注意,系统最多支持注册 8 枚事件回调指针,nt!PspCreateProcessNotifyRoutineCount存储当前注册的回调指针数量,如下图,这是哪个年代的文章了?vista开始都支持64 ...
关于这点我不是很清楚,不过还是感谢指正文中的错误
雪    币: 1604
活跃值: (640)
能力值: ( LV13,RANK:460 )
在线值:
发帖
回帖
粉丝
shayi 9 2018-7-4 02:06
11
0
还有企鹅
最后于 2018-7-4 02:07 被shayi编辑 ,原因:
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
范qixiang 2018-8-10 08:20
12
0
大佬教我写驱动
雪    币: 1604
活跃值: (640)
能力值: ( LV13,RANK:460 )
在线值:
发帖
回帖
粉丝
shayi 9 2018-8-10 21:49
13
0
我只会最简单的 DriverEntry() 和 DispatchIRP() 
游客
登录 | 注册 方可回帖
返回