教程参考自《恶意代码分析实战》
程序来自:http://www.nostarch.com/malware.htm
使用上两话静态特征分析和动态行为分析的方法只能从宏观的角度分析样本,但由于无法得到源代码,所以我们无法确凿地判定这些样本就是恶意的。本着格物致知的宗旨,我们现在学习使用静态逆向分析的方法,从反汇编的角度来分析一个样本。
PS:由于静态逆向分析过程冗杂,所以本话使用问答的方式进行讲解。
呈上Lab05-01.dll。
PSLIST导出函数做了什么?
我们先在导出函数表双击PSLIST,即可查看PSLIST的函数结构,主要功能集中在三个红框中的call,sub_100036C3决定了第一个跳转,先来看看这个函数在做什么判断。
我们直接F5反汇编sub_100036C3,函数很短,就是做了一个判断,判断主机操作系统是否Win2000以上的,若不是,则退出函数(感觉这判断好无聊。。)。
OK,只要用户不是用Windows95,都会走中间的流程,有两个分支,分别调用sub_10006518和sub_1000664C,跳转的依据是[esp+Str]长度是否为0,至于要知道这个字符串的信息,只能通过之后的动态调试技术才能获取,我们现在先不管了。
sub_10006518一眼望去就能知道它大致在干嘛了,它在获取主机的所有进程信息!但它获取这些信息来干什么呢?这就要分析函数sub_1000620C了。
在这里教大家一个技巧,在图形模式下观察参数和字符串更方便。如下图,可以一眼就看出来fopen的参数是“xinstall.dll”和“a”,同样的可以分析出记录进程信息的格式是“ProcID-ExePath-ThreadNum”。
sub_1000664C函数功能差不多,不同的是它多了个send操作,这里就不浪费篇幅分析了,教给大家一个小妙招,在函数处点击鼠标右键选中Xrefs graph from就可以看到该函数的所有调用链,调用的函数跟sub1000620C差不多。
至此,PSLIST分析完毕,做的恶意操作就是获取主机进程信息并记录或通过网络传输出去。
使用图模式了绘制出对sub_10004E79的交叉引用图。当进入这个函数时,哪个API函数可能被调用?仅仅基于这些API函数,你会如何重命名这个函数?
找上面的方法在函数右键Xrefs graph from查看调用链,引起我们注意的是两个函数:GetSystemDefaultLangID和send,这一信息告诉我们,该函数可能通过socket发送语言标志,因此,右击函数名,给它一个更有意义的名字,例如send_languageID。
DllMain直接调用了多少个Windows API?多少个在深度为2时被调用
先选中DllMain,然后选择View->Graphs->Xrefs From打开下图的对话框。其中,开始和结束地址应该都填DllMain的起始地址,想要查看多少深度的函数调用链只需设置红框中的Recursion depth(递归深度)就行。
在0x10001358处,有一个对Sleep(一个使用一个包含要睡眠的毫秒数的参数的API函数)的调用。顺着代码向后看,如果这段代码执行,这个程序会睡眠多久?
在0x10001358处按下F5,可以看到Sleep的参数是1000*v17,而v17又从off_10019020[0]计算而来。
off_10019020[0]存放的是字符串“[This is CTI]30”,加上13的偏移刚好就是“30”,然后atoi将字符串转换为数字,所以最后睡眠的时间就是1000*30=30000毫秒(30秒)。
在0x10001701处是一个对socket的调用。它的3个参数是什么?
三个参数是6、1、2。
使用MSDN页面的socket和IDA Pro中的命名符号常量,你能使参数更加有意义吗?在你应用了修改以后,参数是什么?
右键单击这三个数,选择Use Symbolic Constant,会弹出一个对话框,会列举出IDA Pro为这个特定值找到所有的对应常量,在这个例子中,值2指的是AF_INET,用于设置一个IPv4 socket;值1指的是SOCK_STREAM;值6指的是IPPROTO_TCP,这个socket会被配置为基于IPv4的TCP连接。
搜索in指令(opcode0xED)的使用。这个指令和一个魔术字符串VMXh用来进行VMware检测。这在这个恶意代码中被使用了吗?使用对执行in指令函数的交叉引用,能发现进一步检测VMware的证据吗?
选择Search->Sequence of Bytes,然后搜索in指令的opcode,也就是ED。
只有一个地方使用了in指令,直接双击定位到那里。
eax的值是564D5868,相当于ASCII字符串VMXh,这也就确认了这段代码是恶意代码采用的反虚拟机技巧。
然后在调用了该in指令的函数sub_10006196处检查交叉引用,发现该函数执行后有一个字符串“Found Virtual Machine,Install Cancel”,那就可以确认sub_10006196的功能是检查当前是否在虚拟机环境。
将你的光标跳转到0x1001D988处,你发现了什么?
发现了一堆随机的数据字节。
如果你安装了IDA Python插件(包括IDA Pro的商业版本的插件),运行Lab05-01.py,一个本书中随恶意代码提供的IDA Pro Python脚本,(确定光标是在0x1001D988处。)在你运行这个脚本后发生了什么?
在IDA中左上角File->Script file,选中Lab05-01.py,便可运行脚本。(PS:我的XP虚拟机不知道为何加载不成功,这里只能用Win7代替了。。)
将光标放在同一个位置,你如何将这个数据转成一个单一的ASCII字符串?
选中1001D988,然后按下按键“a”,便可以将这些转换成一个单一的ASCII字符串。
使用一个文本编辑器打开这个脚本。它是如何工作的?
该很简单,只作教学用途,没多大意义,就是将每个字符和0x55进行或运算。
一开始逆向分析函数时别急着F5反编译,应该先在图形模式看下该函数的整体结构,若还是太复杂则可以打开交叉引用图观察函数的调用链,以更容易地了解函数主要在干嘛。
了解完架构后就可以反编译细看函数的原理,但是在反编译模式下观看API的参数比较不方便,必要时可以使用图形模式观看API的参数。
若已经分析完了一个函数(sub_xxxxxx),可以将其重命名为更直观的函数名,这样更方便后面的逆向分析。
若一个数字/字符串的交叉引用有很多时,应该先搞清楚你要查看的引用类型(r/w/p),比如你要查看是哪一段代码对该数组进行了写操作,那就应该只观察w类型的交叉引用。