之前用了六篇文章的篇幅,分别从手动查杀、行为分析、专杀工具的编写以及逆向分析等方面,对“熊猫烧香”病毒的查杀方式做了讨论。相信大家已经从中获取了自己想要的知识,希望大家在阅读完这几篇文章后,能够有一种“病毒也不过如此”的感觉,更希望这些文章能够为有志于在未来参与到反病毒工作的朋友,打下坚实的理论基础。以下就是我在这几篇文章的分析中所总结出来的一些知识点,分为静态分析与动态分析两个方面进行讨论,并加入了一些延伸知识,为大家查漏补缺。
静态分析技术通常是研究恶意代码的第一步。静态分析指的是分析程序指令与结构来确定目标程序的功能的过程。在这个时候,病毒本身并不在运行状态。我们一般采用以下几种方式进行静态分析:
如果尚不确定目标程序是否为病毒程序,我们可以首先采用多个不同的反病毒软件来扫描一下这个文件,看是否有哪个引擎能够识别它。比如在www.virscan.org上对病毒样本检测的部分结果如下:
图1 “熊猫烧香”在线查毒结果(部分)
从结果中可以知道,这个网站中有88%的杀软认为样本存在问题。当然杀软也存在着误报的可能性,但如果说多款杀软都认为目标程序有问题,那么这个程序十有八九就是一个恶意程序了。
图2 “熊猫烧香”的基本信息
哈希运算的结果在病毒大规模爆发时可以快速响应,成为检测病毒的一种方式。我在《病毒木马查杀第004篇:熊猫烧香之专杀工具的编写》那篇文章中就采用了CRC32算法来验证目标程序是否为病毒程序。
C:\ >Strings setup.exe
得到的部分结果如下:
图3 利用Strings获取程序中的字符信息(部分)
由结果可见,并不是所有的字符串都是有意义的,但是利用这个结果,也能够给我们的静态分析带来很大的便利了。比如“URLDownloadToFile”这个API函数就经常被恶意程序用来执行文件的下载操作,该函数需要URLMON.DLL动态链接库的支持,在上述截图中也有所体现。
病毒木马编写者经常会使用加壳技术来让他们的恶意程序难以被检测或分析。正常的程序总是会包含很多字符串。而加了壳的恶意代码通过分析所得到的可打印字符串就会很少。如果使用Strings程序来检测一个程序,发现它的字符串很少时,那么这个程序就很有可能是加了壳的。此时往往就需要使用其它方法来进一步检测它们的行为。
对于这次的研究对象“熊猫烧香”来说,我在《病毒木马查杀第005篇:熊猫烧香之逆向分析(上)》中使用了PEiD这一款静态分析工具,用于检测目标程序是否有壳以及由什么软件编写的。因为如果病毒样本有壳,那么就一定要先脱壳才可以进行分析。而弄清楚了病毒是由什么软件编写的,我们就能够确定其函数调用方式以及栈的分配方式等特点,从而更好地进行分析。比如我的“熊猫烧香”样本是由Delphi编写的,如果我们不懂Delphi编译器的特性,依旧以C++的眼光来看待它,那么很可能会给接下来的分析工作带来困扰。
图4 使用Dependency Walker查看DLL
可见Dependency Walker很清晰地指出了“熊猫烧香”使用了URLMON.DLL中的“URLDownloadToFile”这个API函数。有经验的反病毒工程师,利用这款软件往往就能将恶意代码的大概功能基本分析完全了。
对于目标程序PE结构的分析,往往可以使我们获取更多的信息。常用的工具有PEview和Resource Hacker等。由于PE的分析较为复杂,所以这里不再详述。有兴趣的读者可以参考相应的PE类资料。
图5 在IDA Pro中以图形模式查看
可见,图形模式会给我们的分析工作带来更加直观化的体验。当然这款软件还有很多十分强大的功能,我会在未来的分析中,给大家一一展示。
所谓动态分析就是在运行恶意代码之后进行检查的过程,它能够让你观察到恶意代码的真实功能。虽然动态分析技术非常强大,但是它们还是应该在静态分析之后进行,并且应该在虚拟的环境中进行。一般有以下几种方式:
图6 “火眼”检测结果(部分)
可见“火眼”已经较为全面地揭示了病毒样本的行为,这对我们下一步的分析很有帮助。不过,沙箱也存在着很多缺点,比如,如果我们分析的是一个后门程序,需要等待一条控制指令才会启动特定的行为,那么在沙箱中这个后门程序就无法被彻底分析了。而且沙箱也不能记录所有事件,因为如果恶意代码将自己设置为等待一天甚至更长的时间才去执行自己的行为,那么沙箱往往就无能为力了。诸如此类的缺点还有很多,但不管怎样,沙箱都是我们在反病毒工作中不可或缺的利器。
Process Monitor可以说是在反病毒领域最为常用的软件了。我在《病毒木马查杀第003篇:熊猫烧香之行为分析》中所使用的就是它,而且在以后的分析中,还会经常使用。Process Monitor一旦开始运行,它就会监控所有能够捕获的系统调用,但并不是所有的数据都能捕获。所以往往也需要多款软件的同时使用,才能够获取恶意程序的完整行为。比如我们经常使用Process Explorer来查看进程,使用Regshot来比较注册表在病毒运行前后所发生的变化,利用Netcat进行网络监视等。每款软件都有各自的优点,我们在实际分析中要善于利用。
使用调试器对病毒进行分析在反病毒工作中扮演着十分重要的角色。调试器允许你查看任意内存地址的内容、寄存器的内容以及每个函数的参数。调试器也允许你在任意时刻改变关于程序执行的任何东西。比如你可以在任意时刻改变一个变量的值——前提是你需要获得关于这个变量足够的信息,包括在内存中的位置。在实际的动态调试过程中,我们最常用的是OllyDBG和WinDbg,前者是病毒分析人员使用最多的调试器,缺点是不支持内核调试,如果想调试内核,WinDbg基本上就是唯一的选择了。虽然IDA Pro也能够进行动态调试,但是它远远不如OD方便。因此在实际分析的过程中,往往是将二者结合使用的。因为如果用IDA Pro在静态分析中遇到了十分抽象的函数,那么用OD动态地执行一下,该函数的功能往往就能一目了然了。
我们在病毒分析的过程中,不要过于陷入细节。大多数病毒木马程序是庞大而复杂的,你不可能也没有必要去了解每一个细节。真正需要关注的是恶意程序最关键最主要的功能。在实际分析过程中,当遇到了一些困难和复杂的代码段后,应当在进入到细节之前有一个概要性的了解。另外,在面对不同的工作任务中,应当善于使用不同的工具和方法。不存在通吃的做法。如果在一个点上被卡住了,不要花太长的时间在这个问题上,尝试转移到其他问题,尝试从不同的角度进行分析。最后,病毒的分析工作就如同猫捉老鼠的游戏,正所谓道高一尺魔高一丈,恶意代码分析技术与恶意代码编写技术是对立统一的,二者都在不断地相互促进并发展着。所以我们应当能够认识、理解和战胜这些不断涌现的新技术,并能够快速适应这个领域中的新的变化。也就只有这样,才能够在这个领域有所成就。