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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 r @$t0=poi(nt!PspCreateThreadNotifyRoutineCount);
r @$t1=nt!PspCreateThreadNotifyRoutine;
.for(r @$t2=; @$t2<@$t0; r @$t2=@$t2+){dds (poi(@$t1+@$t2*)^)+ l1;} r @$t0=poi(nt!PspLoadImageNotifyRoutineCount);
r @$t1=nt!PspLoadImageNotifyRoutine;
.for(r @$t2=; @$t2<@$t0; r @$t2=@$t2+){dds (poi(@$t1+@$t2*)^)+ 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 的行为模式仍旧是必要的!
————————————————————————————————————————————————————————

------- 软件调试——注销 QQ 过滤驱动设置的事件通知 CallBack (完)-------的更多相关文章

  1. ------- 软件调试——还原 QQ 过滤驱动对关键内核设施所做的修改 -------

    -------------------------------------------------------------------------------- 在前一篇博文中,我们已经处理完最棘手的 ...

  2. ------- 软件调试——挫败 QQ.exe 的内核模式保护机制 -------

    ------------------------------------------------------------------------ QQ 是一款热门的即时通信(IM)类工具,在安装时刻会 ...

  3. (转)支持 PS/2 与 USB 的键盘过滤驱动(可卸载)

    Author:  sinisterEmail:   sinister@whitecell.orgHomepage:http://www.whitecell.org Date:    2007-02-2 ...

  4. Windbg对过滤驱动DriverEntry函数下断点技巧

    方法1: 1> 先用DeviceTree.exe查看指定的过滤驱动的Load Address(加载地址) 2> 再用LordPE.EXE查看指定过滤驱动文件的入口点地址 3> 计算过 ...

  5. File System Minifilter Drivers(文件系统微型过滤驱动)入门

    问题: 公司之前有一套文件过滤驱动,但是在实施过程中经常出现问题,现在交由我维护.于是在边看代码的过程中,一边查看官方资料,进行整理. 这套文件过滤驱动的目的只要是根据应用层下发的策略来控制对某些特定 ...

  6. <读书笔记>软件调试之道 :从大局看调试-发现代码存在问题

    声明:本文档的内容主要来源于书籍<软件调试修炼之道>作者Paul Butcher,属于读书笔记.欢迎转载! ---------------------------------------- ...

  7. <读书笔记>软件调试之道 :问题的核心-如何修复缺陷

    声明:本文档的内容主要来源于书籍<软件调试修炼之道>作者Paul Butcher,属于读书笔记.欢迎转载! 修复缺陷 对于一个好的修复来说,不仅仅是让软件运行正确,还需要为将来奠定基础.一 ...

  8. 软件调试之INT 3讲解

    第4章断点和单步执行 断点和单步执行是两个经常使用的调试功能,也是调试器的核心功能.本章我们将介绍IA-32 CPU是如何支持断点和单步执行功能的.前两节将分别介绍软件断点和硬件断点,第4.3节介绍用 ...

  9. 文件过滤驱动实现目录重定向(一)good

    文件过滤驱动拦截的IRP主要包括以下几个:IRP_MJ_CREATE,文件创建操作,文件的任何操作,都是从这里开始的.IRP_MJ_CLEANUP,文件的HANDLE句柄全部关闭会触发这个消息IRP_ ...

随机推荐

  1. 基于ARM的车牌识别技术研究与实现

    在云盘里包含了我本科毕业设计的全部资料和代码.主要涉及下面摘要中的几个部分.虽然系统无法实用,但是适合机器视觉和嵌入式方向的入门.希望能对有志从事相关方向的朋友有所帮助.本人现在在深圳从事机器视觉算法 ...

  2. 《你不知道的JavaScript上卷》知识点笔记

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px "PingFang SC" } p.p2 { margin: 0.0px ...

  3. Actor-ES框架:Ray

    并发 1. 并发和并行 并发:两个或多个任务在同一时间段内运行.关注点在任务分割. 并行:两个或多个任务在同一时刻同时运行.关注点在同时执行. 本文大多数情况下不会严格区分这两个概念,默认并发就是指并 ...

  4. TypeScript笔记 3--基础类型

    强类型是TypeScript值得称赞的特性,对于很多后端开发者来说是绝对的福利,加上静态检查使得我们可以在开发态就可以发现很多问题. TypeScript中的类型和JavaScript差不多,下面我们 ...

  5. 炫酷线条动画--svg

    我们经常可以在一些页面看到看起来很酷的线条动画,有些可以用css实现,有些css就无能为力了,今天来研究另一种实现方式,svg 如果对svg是什么还不了解的话,可以先去看看svg的基础教程: 一般对于 ...

  6. html dl dt dd标签元素语法结构与使用

    dl dt dd认识及dl dt dd使用方法 标签用于定义列表类型标签. dl dt dd目录 dl dt dd介绍 结构语法 dl dt dd案例 dl dt dd总结 一.dl dt dd认识 ...

  7. php常用数据结构

    # 常用数据结构--------------------------------------------------------------------------------## 树(Tree)- ...

  8. java.lang.NoClassDefFoundError: javax/mail/Authenticator

    摘录自:http://stackoverflow.com/questions/1630002/java-lang-noclassdeffounderror-javax-mail-authenticat ...

  9. AF_INET 和PF_INET区别;AF_LOCAL PF_LOCAL 区别.

    从字面理解: AF_INET = Address Format, Internet = IP Addresses PF_INET = Packet Format, Internet = IP, TCP ...

  10. 在单体应用的一些DDD实践经验

    阅读此文需要一定的DDD基础,如果你是第一次接触DDD读者,建议先去阅读一些DDD相关的书籍或者文章之后再来阅读本文. 背景 自从我在团队中推行DDD以来,我们团队经历了一系列的磨难--先是把核心项目 ...