逆向分析在电子数据取证中的应用——以“QQ密码大划拉”为例

2011-01-16 00:22罗文华
中国司法鉴定 2011年6期
关键词:脱壳断点木马

罗文华

(中国刑事警察学院 计算机犯罪侦查系,辽宁 沈阳110854)

1 引言

目前,针对恶意程序的取证分析已经发展成为计算机法庭科学领域的重要组成部分。例如,进行电脑安全事件调查时,极有可能会遇到黑客所部署的恶意程序,此时就有必要鉴别出这些文件,并对其进行分析。常规方法主要是通过激活恶意程序样本,抓取分析其网络传输信息,获知被窃取的信息内容以及信息传输的目的地址;或是通过架设系统监控工具,收集恶意程序引发的相关应用程序及其环境变化的信息,从而判断其对操作系统所造成的影响。但在实践中发现,多数情况下由于运行条件已不满足或是其内部所设置的运行有效期限已经过期,恶意程序样本往往无法被激活,或是改变自身行为,掩盖恶意程序特征,应用上述方法往往无法发现有价值的信息。此种情况下,便有必要针对恶意程序进行逆向分析鉴定,从而发现相关证据或线索。

针对恶意程序进行逆向分析,是指将可执行恶意程序反汇编,通过反汇编代码来理解其代码功能,如各接口的数据结构等,逆向分析原程序思路,全面或重点掌握恶意程序行为,从中分析出其他方法无法发现的证据或线索。本文在介绍逆向分析相关概念、方法与工具的基础上,结合用于偷盗QQ账号和密码的木马生成器 “QQ密码大划拉”及其生成的木马QQ_DYP,详细说明查壳、脱壳、断点设置、程序跟踪、关键信息获取等常用逆向分析方法,并力争对一般性规律予以归纳和总结,希望能够对恶意程序取证领域的研究起到抛砖引玉的作用。

2 软件逆向

2.1 概念与用途

对于程序软件而言,逆向工程归结起来就是针对一个既没有源代码又没有准确文献资料的现成程序,尝试恢复出它的设计和实现细节。至1990年起,逆向工程已发展成为了解程序软件“所作所为”的一套最重要的技术和工具,在现代软件分析中有着广泛的用途:

2.1.1 查找恶意代码

许多病毒和恶意代码的探测技术使用逆向工程来理解那些繁琐的代码是怎样构成和运作的。通过逆向找出可用作特征码的可识别模式,用于驱动商业探测器和代码扫描器。

2.1.2 发现意想不到的缺陷和错误

即使是设计最完美的系统也可能存在漏洞,这是由于使用的“前向工程”开发技术所固有的特点导致的。逆向工程可以帮助我们在发生致命的软件失效前识别缺陷和错误。

2.1.3 查找是否使用了其他人所写的代码

搞清楚在应用程序的哪里使用了受保护的代码和技术。这对于保护知识产权不被滥用是很重要的。逆向工程可用于检测应用程序是否包含所关心的软件单元。

2.2 分析方法

2.2.1 静态分析

静态分析指的是使用反汇编器或反编译器将二进制可执行程序转换为电子数据取证人员可以阅读的表示形式。逆向工作通过人工阅读和分析进行。由于电子数据取证人员无法看到程序所处理的数据以及数据的流动。静态分析对电子数据取证人员要求较高,需要其能够更好的理解代码,对于程序加壳的情况,需要先执行脱壳操作,或结合动态分析才能完成逆向工作。

2.2.2 动态分析

动态分析是指将代码转换成易于理解的形式同时,能够在调试器中运行代码,并观察其在运行现场的行为,而不需要单纯的依靠静态的阅读转化好的代码。该方法可以观察程序的内部数据以及数据对代码流的影响,能够提供更多的有价值信息。本文所介绍的针对恶意程序的逆向分析方法主要是基于动态分析的。

2.3 逆向工具[1]

2.3.1 系统监控工具

逆向需要各种各样的工具来寻找、监控、研究以及剖析被逆向的程序。大多数工具都用来显示操作系统收集到的有关应用程序及其环境的信息。由于程序与外部世界的所有联系都需要经过操作系统,所以使用操作系统来提取这些信息。系统监控工具可以监控网络活动、文件访问、注册表访问等,常用的系统监控工具主要有API Monitor、FileMon、RegMon等。

2.3.2 反汇编器

反汇编器是以程序的可执行二进制代码作为输入,生成包含整个或部分程序的汇编语言代码的程序。因为汇编语言代码是目标语言代码简单的文本映射,所以这个转化过程比较简单,常用的反汇编工具主要有IDA Pro、W32DASM。其中IDA Pro是一款功能非常强大的反汇编器,能够提供非常详细的反汇编代码,并可以为给定的函数生成流程图,实现了逆向工作中的许多附加特性,但其价格并不便宜。

2.3.3 调试器

调试器是一种程序,它允许相关人员在程序运行的同时观察程序。调试器的两个最基本的特征是:设置断点能力和代码跟踪能力。断点允许用户选择程序中任何位置的函数或代码行,一旦程序运行到这一行,它就指示调试器暂停程序的运行。这时可以释放调试器,继续运行程序,或者开始跟踪程序。它是逆向工程中的一个非常重要的工具,常用的调试工具主要有OllyDBG、SoftICE。值得一提的是OllyDBG,其除了具有完备的调试功能外,还内置有良好的反汇编功能,是软件逆向中的一个重要法宝。

2.3.4 反编译器

反编译器比反汇编器更近了一步。反编译器接受可执行的二进制文件,并试图从中生成可读性好的高级语言代码。其思想是尝试逆向编译过程,以获取最初的源代码文件或接近于最初源代码的文件。对于大多数平台而言,真正恢复初始源代码是不现实的。多数高级语言的重要元素在编译过程中被省略掉了,且不可恢复。常用的反编译工具主要有DeDe、DJ Decompiler。

3 鉴定实践

3.1 案例背景

目前,由于QQ账号所涉及的Q币与游戏装备等虚拟财产可以转化为现实世界中的货币,因此偷盗QQ账号及密码的现象日益猖獗,情节严重者甚至触犯了相关法律。“QQ密码大划拉”即是一款用于偷盗QQ账号及密码的恶意程序,该软件属于木马生成器范畴,能够根据使用者的设置(如收信邮箱、发信邮箱、发信邮箱密码等)生成相应木马(配置界面如图1所示),使用者可以利用生成的木马来盗取他人QQ账号和密码。但该生成器本身就是一款能够偷盗QQ账号及密码的木马,使用者在生成自己盗号木马的同时,其自身的账号与密码也极可能被该生成器窃取。本节即以木马生成器“QQ密码大划拉”及其默认生成的木马QQ_DYP为例,说明逆向分析在电子数据取证中的实际应用。

图1 “QQ密码大划拉”木马生成器配置界面

3.2 针对木马生成器“QQ密码大划拉”的分析

3.2.1 查壳与脱壳

首先用PEiD对木马生成器 “QQ密码大划拉”查壳,如图2所示。查壳结果表明该软件未加壳,是由Visual C++语言编写的;接着使用OllyDBG加载该软件,但却提示该软件为self-extracting或self-modifying文件,其启动函数中也未表现出Visual C++编写程序的典型特征,由此怀疑该软件使用了伪装的壳。

图2 PEiD对QQ密码大划拉的查壳结果

利用PEiD的“Deep Scan”功能查出该恶意程序系使用UPX加的壳。接下来直接利用PEiD自带的插件“PEiD Generic Unpacker”对其进行脱壳。针对脱壳后的程序再执行查壳操作,“Deep Scan”结果显示该程序由“Borland Delphi 6.0-7.0”编写,其启动函数中call语句与mov语句间隔出现[2](如图3所示),满足Delphi程序启动函数的典型特征,从而验证了查壳结果的正确。

图3 脱壳后QQ密码大划拉的启动函数反汇编代码

3.2.2 通过逆向分析发现隐秘的网页地址

脱壳成功后,使用OllyDBG载入,对恶意程序进行逆向分析。在OllyDBG中运行该程序,主程序窗口出现后,点击“生成木马”按钮,程序会弹出保存窗口以供选择生成木马的存放位置;此时不要点击保存窗口的“保存”按钮,而是点击OllyDBG工具栏上的“暂停”按钮,然后执行ALT+K操作打开函数窗口,查询得到保存窗口对应的 API函数 DialogBoxIndirect-ParamW(图4),可在此处设置断点,以追踪被窃信息的发送地址;另外,由于该恶意程序要执行生成木马操作,便可设想在CreateFileA函数上设置断点,在OllyDBG的command窗口中执行 “bp CreateFileA”命令,然后运行程序,中断后便可继续分析。

图4 函数窗口中保存窗口对应的API函数

除了可以跟踪API函数,在关键字符串信息上设置断点,也可以达到调查取证的目的。载入恶意程序后,点击“插件”→“Ultra字符串参考”→“查找 ASCII”,得到如图5所示的字符串信息。从字符串信息中可以发现有“QQ2009_Hooker_Head”字样出现,其实际为该生成器设计者编制的实现窃取功能的函数名称,故可在此设置断点。

图5 字符串信息中出现有“QQ2009_Hooker_Head”字样

设置好断点后,OllyDBG中运行该恶意程序,在弹出的配置界面中随意设置 “收信邮箱”、“发信邮箱”、“发信邮箱密码”等信息;然后点击“生成木马”按钮,在弹出的保存窗口中选择好木马存放位置,然后点击“保存”按钮;由于事先设置了断点,木马并未生成,而是自动中断在了“QQ2009_Hooker_Head”的位置上(图6)。

图6 恶意程序自动中断在事先设置的断点上

恶意程序在红色断点处(0045E310)中断,点击F8键单步运行以分析程序。当到达地址0045E339时,堆栈窗口中出现“SS:[0012F620]=009D3724,(ASCII" http://www.XXX.com/QQ456/XXX.asp")”字样(图7),此即该生成器窃取QQ账号及密码后发往的网页地址。电子数据取证人员获得该隐秘地址后,可以通过调查相关网站获取犯罪分子用来访问的IP地址,进而找到其真实的藏身之所。

图7 堆栈窗口中出现被窃信息发往的网页地址

3.3 针对生成木马QQ_DYP的逆向分析

3.3.1 查壳和脱壳

使用PEiD检查QQ_DYP,显示其是由Visual C++编写的。OllyDBG却依然提示this software is a self-extracting or self-modifying file。使用OllyDBG加载QQ_DYP(如图8所示),发现其启动函数与“QQ密码大划拉”颇为类似,难怪PEiD做出同样的误判。

图8 脱壳前的“QQ_DYP”启动函数指令序列

距离起始地址不远处,出现有 “jmp QQ_DYP. 00413EF0”字样,判断该指令是一个大跳转,因此执行该指令来到地址00413EF0处(如图9所示)。该地址存放有指令“pushad”,因此考虑使用ESP定律法进行脱壳。

图9 地址00413EF0处的指令序列

执行pushad指令后,寄存器窗口显示ESP值为0012FFA4,选择数据窗口跟随,并在数据窗口设置硬件访问断点(Word),接下来按Shift+F9运行该程序,即可来到另一个大跳转——地址0041403F处(如图10)。

图10 地址0041403F处出现大跳转语句

执行地址 0041403F处的 “jmp QQ_DYP.0040 5380”指令,便来到程序真正的OEP(如图11)。其启动函数满足Borland Delphi启动函数特征。脱壳修复后,PEiD也判断其由Borland Delphi 6.0-7.0编写,从而验证了查壳结果的正确。

图11 脱壳后的“QQ_DYP”启动函数指令序列

3.3.2 QQ_DYP的主要恶意行为

QQ_DYP对进程explorer进行注入,然后通过被注入的explorer进程修改注册表项为HKLMSOFTWAREMicrosoftWindowsCurrentVersionExplorer ShellExecuteHooks{08315C1A-9BA9-4B7C-A432-26885F78DF28},达到监视系统的目的,并通过注册SHELL扩展组键,使木马能够伴随系统进程启动(如图12所示)。同时使用SetWindowsHookExA函数,通过将消息处理类型设置为WH_KEYBOARD和WH_MOUSE以截获键盘和鼠标消息。

QQ_DYP还会释放DLL文件于Program Files Common FilesMicrosoft SharedMSINFO目录下(如图13所示),该DLL文件会判断加载自身的进程名,如果是QQ安全检查主程序则结束该进程,如果为QQ. exe则删除QQ安装目录下的npkcrypt.sys(QQ键盘锁保护文件,部分版本的QQ拥有此文件),使QQ的键盘安全锁失效。同时释放名为“_xr.bat”的批处理文件,内容为“:try del"D:digital investigationQQ_DYP(unpack)QQ_DYP脱壳后 _.exe"if exist"D:digital investigationQQ_DYP (unpack)QQ_DYP脱壳后 _. exe"goto try”,达到删除自身的目的。

调试QQ_DYP时,我们发现该恶意程序会将字符串或解密信息输出至009D0000开始的内存地址空间中,因此在该内存地址空间设置写入断点,并且在调试选项设置时不要忽略内存访问异常,这样经过跟踪调试,009D009C处会出现如图14所示的解密信息。从图中可以看出,QQ_DYP不仅会将QQ账号与密码信息发送至用户配置的邮箱信息中,还会像“QQ密码大划拉”一样,将信息发送至事先内置的ASP网页地址。

4 结语

恶意程序编写者一般具有较高的专业知识水平,他们会千方百计的模糊恶意程序行为,隐藏其真实意图。这就对电子数据取证人员提出了更高的要求,需要对反汇编代码进行更深入的分析[3]。本文即是针对一特定的恶意程序,描述其逆向分析全过程,并对一般性方法进行归纳总结。需要指出的是,恶意程序千变万化,本文所描述的方法还具有相当的局限性。比如在脱壳方面,该生成器及其生成的木马使用的都是比较简单的压缩壳,脱壳相对简单,而对于更为复杂的加密壳的破解研究,本身就是一个十分深入的领域,本文对此并未涉及;关键信息获取方面,虽然介绍了一些典型断点的设置方法,但实际上整个恶意程序的分析花费了作者大量的时间与精力在繁杂的反汇编代码中摸索穿行,因此针对快速定位关键信息的研究依然有很长的路要走;另外,如何将逆向分析方法与其他分析方法更好的结合,更加全面彻底的揭示恶意程序隐藏的秘密,也将是作者未来的主要研究方向之一。

[1]Eldad Eilam.逆向工程揭秘[M].北京:电子工业出版社,2007:4-16.

[2]段钢.加密与解密[M].北京:电子工业出版社,2008:71-99.

[3]金波,黄道丽,夏荣.电子数据鉴定标准体系研究[J].中国司法鉴定,2011,(1):49-52.

猜你喜欢
脱壳断点木马
小木马
骑木马
顶管接收端脱壳及混凝土浇筑关键技术
河蟹脱壳期间注意事项
辊筒式花生脱壳机脱壳部件优化设计与试验
砂泥互层断点组合类型及其合理性分析
——以大庆长垣萨尔图油田为例
小木马
用Eclipse调试Python
一类无限可能问题的解法
智慧农业助上安村“脱壳”