我在上一章里面给大家展示的是我之前作为病毒分析师时候,每天大部分时间是如何分析样本的。当时我们只需要对样本的黑白做判断就好,一般来说并不需要了解样本的详细功能,因此只要找到目标样本的不正常的地方,然后直接拉黑就好。但实际上,如果我们想要写病毒分析报告,或者我们的客户需要我们深入研究样本进而写出病毒清除方案的话,那么上一章所介绍的技术就不能使用了,因为那仅仅是表层化的判断工作,我们一定要使用更加专业的工具,利用动静结合技术进行分析,才可以将恶意程序的所作所为展现出来。而我们现在的进阶篇的内容,就主要讨论如何对恶意程序进行详细的分析。在整个进阶篇里面,我们主要依靠的是IDA Pro与OllyDbg。
在给大家介绍IDA与OD的使用方法之前,我想先教给大家一种简单的技术,用于了解目标样本的行为,也就是利用“火绒剑”这款软件,在虚拟机里面监控目标样本究竟做了哪些事情。我们可以首先把这次课程的样本sample.exe复制到虚拟机里面,打开“火绒剑”,选择“过滤”->“进程过滤”->“添加”,在新弹出的窗口中输入文件名称,也就是sample.exe,然后确定。之后再开启监控,并且在虚拟机里面运行这次的样本。于是可以得到以下监控结果:
由监控结果可以清晰地看到,这个样本在启动文件夹里面创建了一个名为wsample01b.exe的程序,这样每当系统启动的时候,这个wsample01b.exe就会自动运行起来了。那么有理由认为,这个恶意程序很可能是将自身拷贝到了启动文件夹,以达到隐藏执行的目的。
如果大家不理解“动作”下面的一系列字符是什么意思的话,那么可以选择“过滤”->“动作过滤”,展开对应的加号,就可以查看字符对应的动作的意义了:
一般来说,我们比较关注的是文件、注册表与网络这三方面的行为,比如创建了什么文件,删除了什么文件,对注册表做了哪些修改等等。因为这三方面与我们的系统最为息息相关。
使用“火绒剑”可以监测到目标样本的行为,可是对于我们分析师来说,我们希望更进一步地去探究目标样本的原理,因此往往需要使用更加专业的工具来实现逆向分析的目的。对于静态分析来说,我们最常用的就是IDA Pro了。
这里我们使用IDA Pro来试着分析一下我们这次的样本,将样本文件拖入IDA,我个人的习惯,是要将代码的地址也调出来,以方便分析。可以在菜单栏选择“Options”->“General”,在新弹出的窗口中选择“Line prefixes”,然后点击OK:
这样我们的反汇编代码的前面就会出现地址信息了:
一般来说,IDA在载入一个PE文件的时候,会为我们停留在main函数的位置,所以我们从这里开始分析就好。比如对于这个程序来说,它首先是利用call命令调用了sub_401000这个函数,接下来又调用了GetActiveWindow函数用于获取活动窗口的窗口句柄,并将这个句柄自动地保存在eax寄存器里面,作为接下来的MessageBox函数的第一个参数。随后再利用MessageBox函数弹出一个对话框,对话框的标题是“MESSAGE”,内容是“Copied!”。最后程序也就直接返回了。
不过这个程序很明显并不是仅仅弹出一个对话框那么简单,由刚才的“火绒剑”的监控结果可以看到,这个程序还有文件复制一类的操作。那么有理由怀疑说,它的这些操作应该就是由sub_401000这个函数实现的。那么我们不妨双击进入这个函数来实际看一下:
其实我们分析恶意程序,大部分情况下只要分析它所调用的函数序列就好,通过这些函数序列,我们就可以很轻易地弄清楚这个程序的行为了。而说到API函数,那么我建议大家在遇到不认识的函数的时候,一定要善于利用微软的MSDN,因为MSDN对函数的讲解才是最为权威的,也是最为详细的,不过MSDN是英文的,因此我也建议大家一定要提高自己的英文水平,其实只要你有英语四级的水平,那么MSDN的单词应该也基本没什么问题的,常出现的单词也就那么几个,还是很容易掌握的。毕竟很多先进的技术与优秀的资料,都是以英文文档的形式呈现的,如果你的英文水平不过关的话,对于你的计算机技术的学习,确实会有所阻碍。
回到我们的样本,首先它调用了GetModuleFileName用于获取自身完整的路径名称,这个路径里面是带有这个文件自己的名字的。接下来调用SHGetFolderPath来调用特殊文件夹的路径,由它的第二个参数“7”可以知道,它获取的是启动文件夹的路径。我之所以知道7代表的含义,是因为我查了MSDN。之后使用lstrcat函数将刚才获取的启动文件夹的路径与字符"wsample01b.exe"进行连接,最后再使用CopyFile将自身复制到启动文件里面,启动文件夹中的文件名称就是wsample01b.exe。
至此,我们就已经使用IDA完整地分析出了这个样本的原理。其实我们也可以利用F5键,将这段反汇编代码翻译成C语言的形式,会更加有利于我们的分析工作:
使用OD可以动态地跟踪目标程序运行到每一步的情况。举个例子,比如我们不清楚GetModuleFileName究竟获取了什么结果,那么完全可以利用OD来动态调试到这一步,从而看到它的结果。我们可以先在IDA里面找到这个函数的被调用的地址,也就是0x00401025,这也是为什么我要在一开始调出地址的原因。然后在OD里面,在反汇编代码区,利用快捷键Ctrl+G,输入401025,就可以直接来到函数的调用位置,此时按下F4,就可以直接执行到这里。接下来我们可以按下F8单步执行,看一下结果:
可见,这里已经完整显示出了所获取的路径信息,就是当前文件的完整路径,并且包含文件名,这就是动态调试带给我们的便利。
这次我给大家讲解了一个最简单的动静结合的调试例子,希望大家能自己亲手去尝试一下,一定会有很多的收获。