首页
社区
课程
招聘
[原创]---驱动调试——挫败 QQ.EXE 的内核模式保护机制(part I)---
发表于: 2018-5-3 20:37 19493

[原创]---驱动调试——挫败 QQ.EXE 的内核模式保护机制(part I)---

2018-5-3 20:37
19493

Q 是一款热门的即时通信(IM)类工具,在安装时刻会向系统分区的 \..\windows\system32\drivers 路径下生成两个驱动程序文件:

QQProtect.sys 与 QQFrmMgr.sys ,前者是 QQProtect.exe(QQ 安全防护进程,又称 Q 盾)的内核模式组件;后者是一种过滤型驱动。

同时还会向注册表位置 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\ 创建对应名称的键,其中有重要的两个子键控制这两个驱动的加载方式:“type” 与 “start” ——对于 QQProtect.sys ,其键值分别为 1 和 2,这意味着由 services.exe(服务控制管理器)自动将 QQProtect.sys 载入内核空间;对于 QQFrmMgr.sys,其键值分别为 1 和 1,这意味着在内核初始化期间,由 ntoskrnl.exe 将 QQFrmMgr.sys 载入内核空间,就加载的顺序而言,QQFrmMgr.sys 早于 QQProtect.sys ,如下图所示:


尽管这两个驱动并非 Rootkit 或者恶意软件,但它们确实会 hook 系统服务调度表/Shadow、在System 进程中注入内核线程、注

册一些通知回调。。。。

所以也算是更改了系统的一些关键数据结构来进行非正当活动。

本文探讨如何使用内核调试器 WinDbg.exe 来检查诸如此类为保护 QQ 进程而采取的内核空间手段,然后把系统还原至 “干净” 状态。

测试环境是两台真实的计算机(双机物理调试)——运行 Windows 7 的 宿主机(调试机),以及运行 Windows 8.1 的目标机(被调试机,已安装了 QQ)

两者通过以太网线连接进行调试。

注意,通过以太网线执行双机物理调试时,对调试机的网卡无特殊要求;但是被调试机的网卡必须被 Debugging Tools for Windows 所支持(亦即 Kd.exe 与 WinDbg.exe),而且被调试机上的操作系统版本需要是 windows 8 或者更后面的版本;调试机上的操作系统需要是 windows xp 或更后面的版本。

使用以太网调试的一大好处就是,通信介质获取方便——相较于老旧的串口线(RS-232)以及主板上基本被淘汰的 COM 模块而言,Cat5 标准以上的网络线随便在电脑城就能买到,而且主板上绝不可能没有网络接口卡使用的 RJ-45 端口。。。。想必以太网调试一定会成为日后的标准!

另一方面,我也实施了物理-虚拟机调试,虚拟机作为被调试机,其上运行 Windows 7,这样不但能够对比出,QQ 驱动针对不同内核版本(Windows 7 是内核版本 6.1 ;Windows 8.1 是内核版本 6.3)所表现出来的逻辑差异,还能够明确 QQ 驱动是否采取了 “反虚拟机” 技术,并且揭示它在真实机器上的行为!

因此下面的调试过程中,所有与真实机器上不同的结果我都会另行说明。在开始之前,来过目一下我配置的双机物理调试参数:


其中,

❶ 我将 Windows Kits 驱动开发工具包安装到了  “d:\Windows Kits”  目录下;

❷ 输出调试信息到指定的日志文件;

❸ 指定微软的符号服务器 URL,这样调试器就可以通过 HTTP GET 请求,按需从服务器下载并解析特定内核模块中的函数符号;

❹ 以及预先存储在本地的符号文件(可以从 MSDN 站点下载,整个 MSI 封装的符号包大小约为五、六百 MB)所在路径;

 (注意,宿主机上内核版本的不同导致需要分别下载对应的符号文件,并指定为调试参数)

❺ 指定通过以太网调试(net),宿主机上开启调试端口为 UDP 的 60111;

❻ 最后的 key 可以任意指定,但其中的 4 个子域之间需要用点号分隔开。

关于目标机上的对应配置,请各位参见 MSDN 文档,这里就不再赘述。

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

首先在 Windows 8.1 目标机上通过 Process Explorer 浏览到 System 进程中的系统线程,其中有一个 QQ 内核线程是由

QQFrmMgr.sys 创建的,该线程的启动地址距离所属模块被载入基址的偏移量为 0x5e34 :

我们的目标是结束该线程的执行,通常的做法是用系统内置的APC(异步过程调用)机制来实现。APC 就是运行在特定线程上下文

中的例程。

从编程角度来讲,调用 KeInitializeApc() 初始化一个 nt!_KAPC 结构,并将其关联到该 QQ 内核线程的nt!_KTHREAD结构,设定

该 APC 例程回调为 PspExitThread();然后利用 KeInsertQueueApc() 通过这个 nt!_KTHREAD 结构来排入该 QQ 内核线程的

APC 队列,如此一来,当该 APC 被交付时,就会在该 QQ 内核线程的执行上下文中调用 PspExitThread(),从而终止掉该 QQ 内

核线程。

而在调试环境下,没有对应的内核 API 可用,所以我们必须手工构造 APC、指定回调函数、关联线程、以及排入队列,如下步骤所

示:

第一步:查询 System 进程的 nt!_EPROCESS 结构地址;

第二步:定位到其中的线程双向链表头部,然后开始遍历这个链表中的每一个 nt!_ETHREAD 结构,找出那些启动地址位于

QQFrmMgr.sys 模块空间内的线程:

 

相应的 WinDbg 命令如下:



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

收藏
免费 2
支持
分享
最新回复 (34)
雪    币: 376
活跃值: (92)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
mark
期待后续
2018-5-3 23:20
0
雪    币: 102
活跃值: (462)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
期待后续
2018-5-4 07:09
0
雪    币: 375
活跃值: (201)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
大赞一个,期待后续
2018-5-4 09:36
0
雪    币: 3265
活跃值: (1931)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
赞  期待二
2018-5-4 09:43
0
雪    币: 405
活跃值: (2355)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
PCHUNTER能解决的事,没必要那么麻烦。而且简单的说别人可以把ETHREAD里的线程入口点指向任何模块,导致你根本找不到线程入口点。还可以把线程提升到DPC级别里,然后通过WORKITEM来执行低IRQL的操作,导致所有基于APC的操作全无效,无论你是终止还是暂停线程都没用。而这些技术早已被广泛应用于各种木马线程中了。QQ人家保护是基于R3的,有能力写点R3直接干他的,也让大家学习下。
2018-5-4 09:58
0
雪    币: 2396
活跃值: (3174)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
..你**在逗我
最后于 2018-5-4 12:35 被KevinsBobo编辑 ,原因: 请注意用词
2018-5-4 11:27
0
雪    币: 3785
活跃值: (3947)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
感谢分享!  期待后续!
2018-5-4 13:53
0
雪    币: 4
活跃值: (346)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
为什么我的机器上没有QQFrmMgr这个驱动呢,难道是因为我装了QQ电脑管家?
2018-5-4 15:39
0
雪    币: 244
活跃值: (189)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
ZwTrojan 为什么我的机器上没有QQFrmMgr这个驱动呢,难道是因为我装了QQ电脑管家?
我的电脑连QQProtect.sys    这个都没有呢
2018-5-4 16:40
0
雪    币: 1485
活跃值: (1135)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
qq是电脑管家提供保护
2018-5-4 19:05
0
雪    币: 300
活跃值: (2532)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
感谢分享
2018-5-4 19:09
0
雪    币: 1839
活跃值: (295)
能力值: ( LV9,RANK:370 )
在线值:
发帖
回帖
粉丝
13
膜拜
2018-5-4 19:16
0
雪    币: 1604
活跃值: (640)
能力值: ( LV13,RANK:460 )
在线值:
发帖
回帖
粉丝
14
airbus 我的电脑连QQProtect.sys 这个都没有呢
全新安装一次应该就有,我用最新版测试过的
2018-5-4 22:52
0
雪    币: 6818
活跃值: (153)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
2018-5-5 01:50
0
雪    币: 7939
活跃值: (2350)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
不错,很详细。
2018-5-5 09:42
0
雪    币: 12
活跃值: (423)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
驱动级对抗没啥意义.同意大肉鸡.r3干才有意思
2018-5-5 10:12
0
雪    币: 8260
活跃值: (1321)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
感谢分享   
2018-5-5 15:13
0
雪    币: 4
活跃值: (346)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
airbus 我的电脑连QQProtect.sys 这个都没有呢
QQProtect.exe倒是有的
2018-5-5 20:16
0
雪    币: 576
活跃值: (2035)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
mark 
2018-5-5 23:45
0
雪    币: 1129
活跃值: (2906)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
21
腻害,详细,加油
2018-5-6 18:58
0
雪    币: 328
活跃值: (39)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
22
厉害,加油
2018-5-8 12:28
0
雪    币: 8
活跃值: (88)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
请问下你说的查询  QQFrmMgr.sys  模块内部的  section  信息,具体用的什么方法,谢谢
2018-5-31 17:42
0
雪    币: 1604
活跃值: (640)
能力值: ( LV13,RANK:460 )
在线值:
发帖
回帖
粉丝
24
wx_me_364648 请问下你说的查询 QQFrmMgr.sys 模块内部的 section 信息,具体用的什么方法,谢谢
!dh -s
后面接上该模块被载入到的内核空间基地址即可
2018-6-1 22:23
0
雪    币: 21
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
学习一下
2018-6-10 11:40
0
游客
登录 | 注册 方可回帖
返回
//