病毒分析教程第三话--静态逆向分析(下)

静态逆向分析(下)


教程参考自《恶意代码分析实战》
程序来自:http://www.nostarch.com/malware.htmweb


使用上两话静态特征分析和动态行为分析的方法只能从宏观的角度分析样本,但因为没法获得源代码,因此咱们没法确凿地断定这些样本就是恶意的。本着格物致知的宗旨,咱们如今学习使用静态逆向分析的方法,从反汇编的角度来分析一个样本。数组


PS:因为静态逆向分析过程冗杂,因此本话使用问答的方式进行讲解。网络

Lab 5-1

呈上Lab05-01.dll。架构

PSLIST导出函数作了什么?
咱们先在导出函数表双击PSLIST,便可查看PSLIST的函数结构,主要功能集中在三个红框中的call,sub_100036C3决定了第一个跳转,先来看看这个函数在作什么判断。
PSLISTsocket

咱们直接F5反汇编sub_100036C3,函数很短,就是作了一个判断,判断主机操做系统是否Win2000以上的,若不是,则退出函数(感受这判断好无聊。。)。
36C3编辑器

OK,只要用户不是用Windows95,都会走中间的流程,有两个分支,分别调用sub_10006518和sub_1000664C,跳转的依据是[esp+Str]长度是否为0,至于要知道这个字符串的信息,只能经过以后的动态调试技术才能获取,咱们如今先无论了。
PSLISTsvg

sub_10006518一眼望去就能知道它大体在干吗了,它在获取主机的全部进程信息!但它获取这些信息来干什么呢?这就要分析函数sub_1000620C了。
6518函数

一言以蔽之,该函数就是将进程信息记录到一个文件中。
620C学习

在这里教你们一个技巧,在图形模式下观察参数和字符串更方便。以下图,能够一眼就看出来fopen的参数是“xinstall.dll”和“a”,一样的能够分析出记录进程信息的格式是“ProcID-ExePath-ThreadNum”。
620C操作系统

sub_1000664C函数功能差很少,不一样的是它多了个send操做,这里就不浪费篇幅分析了,教给你们一个小妙招,在函数处点击鼠标右键选中Xrefs graph from就能够看到该函数的全部调用链,调用的函数跟sub1000620C差很少。
664C
至此,PSLIST分析完毕,作的恶意操做就是获取主机进程信息并记录或经过网络传输出去。

使用图模式了绘制出对sub_10004E79的交叉引用图。当进入这个函数时,哪一个API函数可能被调用?仅仅基于这些API函数,你会如何重命名这个函数?
找上面的方法在函数右键Xrefs graph from查看调用链,引发咱们注意的是两个函数:GetSystemDefaultLangID和send,这一信息告诉咱们,该函数可能经过socket发送语言标志,所以,右击函数名,给它一个更有意义的名字,例如send_languageID。
4E79

DllMain直接调用了多少个Windows API?多少个在深度为2时被调用
先选中DllMain,而后选择View->Graphs->Xrefs From打开下图的对话框。其中,开始和结束地址应该都填DllMain的起始地址,想要查看多少深度的函数调用链只需设置红框中的Recursion depth(递归深度)就行。
DllMain

DllMain

在0x10001358处,有一个对Sleep(一个使用一个包含要睡眠的毫秒数的参数的API函数)的调用。顺着代码向后看,若是这段代码执行,这个程序会睡眠多久?
在0x10001358处按下F5,能够看到Sleep的参数是1000*v17,而v17又从off_10019020[0]计算而来。
Sleep

off_10019020[0]存放的是字符串“[This is CTI]30”,加上13的偏移恰好就是“30”,而后atoi将字符串转换为数字,因此最后睡眠的时间就是1000*30=30000毫秒(30秒)。
Sleep

在0x10001701处是一个对socket的调用。它的3个参数是什么?
三个参数是六、一、2。
Socket

使用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
只有一个地方使用了in指令,直接双击定位到那里。
in

eax的值是564D5868,至关于ASCII字符串VMXh,这也就确认了这段代码是恶意代码采用的反虚拟机技巧。
eax

而后在调用了该in指令的函数sub_10006196处检查交叉引用,发现该函数执行后有一个字符串“Found Virtual Machine,Install Cancel”,那就能够确认sub_10006196的功能是检查当前是否在虚拟机环境。
Xrefs

将你的光标跳转到0x1001D988处,你发现了什么?
发现了一堆随机的数据字节。
1D988

若是你安装了IDA Python插件(包括IDA Pro的商业版本的插件),运行Lab05-01.py,一个本书中随恶意代码提供的IDA Pro Python脚本,(肯定光标是在0x1001D988处。)在你运行这个脚本后发生了什么?
在IDA中左上角File->Script file,选中Lab05-01.py,即可运行脚本。(PS:个人XP虚拟机不知道为什么加载不成功,这里只能用Win7代替了。。)
Scripts

经脚本解密后的字符串变成明文了。
Decode

将光标放在同一个位置,你如何将这个数据转成一个单一的ASCII字符串?
选中1001D988,而后按下按键“a”,即可以将这些转换成一个单一的ASCII字符串。
Transfer

使用一个文本编辑器打开这个脚本。它是如何工做的?
该很简单,只做教学用途,没多大意义,就是将每一个字符和0x55进行或运算。
Scripts


总结

  1. 一开始逆向分析函数时别急着F5反编译,应该先在图形模式看下该函数的总体结构,若仍是太复杂则能够打开交叉引用图观察函数的调用链,以更容易地了解函数主要在干吗。

  2. 了解完架构后就能够反编译细看函数的原理,可是在反编译模式下观看API的参数比较不方便,必要时可使用图形模式观看API的参数。

  3. 若已经分析完了一个函数(sub_xxxxxx),能够将其重命名为更直观的函数名,这样更方便后面的逆向分析。

  4. 若一个数字/字符串的交叉引用有不少时,应该先搞清楚你要查看的引用类型(r/w/p),好比你要查看是哪一段代码对该数组进行了写操做,那就应该只观察w类型的交叉引用。