Rootkit和Bootkit:现代恶意软件逆向分析和下一代威胁
上QQ阅读APP看书,第一时间看更新

1.2 感染例程

一旦TDL3感染者通过其分销渠道被下载到用户的系统上,它就开始了感染过程。为了在系统重新启动时幸存下来,TDL3通过在驱动程序的二进制文件中注入恶意代码来感染加载操作系统所必需的一个引导启动驱动程序。在操作系统初始化过程的早期阶段,这些引导启动驱动程序与内核映象一起加载。因此,当被感染的机器启动时,修改的驱动程序被加载,恶意代码控制了启动过程。

因此,当在内核模式地址空间中运行时,感染例程搜索支持核心操作系统组件的引导启动驱动程序列表,并随机选择一个作为感染目标。列表中的每个条目都由未文档化的KLDR_DATA_TABLE_ENTRY结构描述,如代码清单1-1所示,由DRIVER_OBJECT结构中的DriverSection字段引用。每个加载的内核模式驱动程序都有一个相应的DRIVER_OBJECT结构。

代码清单1-1 DriverSection字段引用的KLDR_DATA_TABLE_ENTRY结构的布局

0

一旦选择了一个目标驱动程序,TDL3感染程序就会用一个恶意加载程序覆盖它的资源部分.rsrc的前几百个字节,从而修改驱动程序在内存中的映像。这个加载程序非常简单:它只是在启动时从硬盘上加载它需要的其余恶意软件代码。

被覆盖的.rsrc部分的原始字节—这仍然是驱动程序正确运行所需要的—被存储在一个名为rsrc.dat的文件中,该文件位于由恶意软件维护的隐藏文件系统中。(注意,感染不会改变被感染的驱动程序文件的大小。)一旦完成了这个修改,TDL3就会改变驱动程序的可移植可执行文件(PE)头中的入口点字段,使其指向恶意加载程序。因此,被TDL3感染的驱动程序的入口点地址指向资源部分,在正常情况下,这是不合法的。图1-1显示了感染之前和感染之后的引导启动驱动程序,演示了驱动程序映像是如何被感染的,其中Header标签指的是PE头以及节表(section table)。

0

图1-1 系统感染时内核模式的引导启动驱动程序的修改

这种感染PE格式的可执行文件(Windows可执行文件和动态链接库的主要二进制格式)的模式是典型的病毒感染者,但在Rootkit中并不常见。PE头和节表对任何PE文件来说都是必不可少的。PE头包含关于代码和数据的位置、系统元数据、栈大小等的关键信息,而节表包含关于可执行文件的各个部分及其位置的信息。

为了完成感染过程,恶意软件将PE头的.NET元数据目录条目覆盖为安全数据目录条目中包含的相同值。这个步骤可能被设计用来阻止对受感染的映像进行静态分析,因为它可能在通过常见的恶意软件分析工具解析PE头文件时导致错误。事实上,试图加载这些映像导致了IDA Pro 5.6版本的崩溃—这个错误已经被纠正了。根据微软的PE/COFF规范,.NET元数据目录包含公共语言运行时(CLR),用于加载和运行.NET应用程序的数据。但是,这个目录条目与内核模式引导驱动程序无关,因为它们都是本地二进制文件,不包含系统管理的代码。基于这个原因,操作系统加载程序不会检查此目录条目,从而使受感染的驱动程序在内容无效时也能成功加载。

注意,这种TDL3感染技术的作用范围是有限的:由于微软的内核模式代码签名策略强制64位系统进行代码完整性检查,它只能在32位平台上工作。由于驱动程序的内容在系统被感染时发生了变化,它的数字签名不再有效,从而阻止操作系统在64位系统上加载驱动程序。恶意软件的开发者进而开发了TDL4。我们将在第6章详细讨论TDL4的策略及规避措施。