20155326《网络对抗》免考项目——深入恶意代码之生成恶意代码的动静态结合分析

在前两篇博客中,我分别学习了利用静态分析工具和动态分析功具对恶意代码进行分析,在这篇博客中,我将之前学到的知识结合起来,对恶意代码示例进行更深层次的动静态分析。
并且,我学习了使用IDA PRO和OllyDbg对恶意代码进行进一步细化的动态分析,查看恶意代码中主要函数之间的关系以及函数之间的参数,以此来搞清楚恶意代码在运行后对计算机进行了哪些操作。

IDA Pro介绍

IDA Pro交互式反汇编器专业版(Interactive Disassembler Professional),人们常称其为IDA Pro,或简称为IDA。是目前最棒的一个静态反编译软件,为众多0day世界的成员和ShellCode安全分析人士不可缺少的利器!IDA Pro是一款交互式的,可编程的,可扩展的,多处理器的,交叉Windows或Linux WinCE MacOS平台主机来分析程序, 被公认为最好的花钱可以买到的逆向工程利器。他具有更好的反汇编、深层分析、可以看到跳到指定的位置的jmp的命令位置和保存静态汇编等优点,适用于恶意代码分析、漏洞研究、COTS验证、隐私保护、其他学术研究,IDA Pro已经成为事实上的分析敌意代码的标准并让其自身迅速成为攻击研究领域的重要工具。它支持数十种CPU指令集其中包括Intel x86,x64,MIPS,PowerPC,ARM,Z80,68000,c8051等等。

OllyDbg介绍

OLLYDBG是一个新的动态追踪工具,将IDA与SoftICE结合起来的思想,Ring 3级调试器,非常容易上手,己代替SoftICE成为当今最为流行的调试解密工具了。同时还支持插件扩展功能,是目前最强大的调试工具。

恶意代码示例在这里哦~~~

基于09-03.exe的静态分析

使用PE ID

首先,我使用静态分析工具PE ID查看09-03.exe的导入DLL文件。

另外,我们可以使用动态分析工具IDA PRO查看导入函数。在IDA PRO中,导入的DLL与函数LoadLibraryA有关,我们在import里面查看这个函数

在地址处使用Ctrl+X查看该地址的交叉引用

前两个p代表函数调用,查看这两个函数调用

因此,我们可以分析出一共导入了6个DLL,分别是KERNEL32.dll、NETAPI32.dll、DLL1.dll、DLL2.dll、DLL3.dll、USER32.dll

接下来我们再来探究一下DLL1.dll、DLL2.dll、DLL3.dll这三个dll要求的基地址是多少。

继续用PE ID查看dll文件的基地址。

可以看出来,三个DLL文件要求的基地址都是10000000。

使用OllyDbg

知道了三个dll文件要求的基地址,那么实际分配的基地址分别是多少呢?
带着这个问题,我用OllyDbg打开09-03.exe文件,然后点M查看,观察到DLL1实际分配的基地址是10000000,DLL2实际分配的基地址是003C0000,DLL3实际分配的基地址是00430000

那么当该程序调用DLL1.dll中的一个导入函数时,这个导入函数做了什么?
当该程序调用writefile函数时,文件名是什么?

用OD打开DLL1文件,分析DLL1Print函数。

通过参数可以分析出来,DLL1导入函数是输出打印“DLL 1 mystery data xx”

再分析10008030,打开交叉引用列表,能看到又调用了一个打印进程ID的函数。

因此,这个导入函数输出打印了当前进程的ID。打印的神秘数据也就是当前进程的ID啦

在参数中看到了一个网址,malwareanalysisbook.com。观察到WriteFile和DLL2returnJ有关,就进一步分析DLL2returnJ。用OD打开DLL2,查看DLL2returnJ。这个函数是把1000B070赋值给eax。

分析1000B070,查看交叉引用列表。看到它调用了CreatFileA函数,然后打开temp.txt。所以,文件名就是temp.txt

使用IDA PRO

下一个问题是当该程序调用NetScheduleJobADD创建一个job时,从哪里得到第二个参数数值呢?

NetScheduleJobADD调用DLL3.dll,然后分别调用其中的DLL3Print和DLL3GetStructure函数。我们用IDA分析一下DLL3.dll中的这两个函数。

首先是dll3print。可以看到它打印了一个神秘数据,这个数据是Widecharstr中的数据,用交叉引用看一下Widecharstr。

可以看到一个MultiByteToWideChar函数,这个函数是把多字节的形式转换成宽字符的形式。要转换的字符是lpMultiByteStr,就是"ping www.malwareanalysisbook.com"。然后保存到WideCharStr中输出。所以打印出的神秘数据是这段字符在内存中的地址。

然后再看一下DLL3GetStructure。

通过交叉引用,分析其中的1000B0A0数据。

可以看到这些就是第二个参数的结构体中的数据。

为了更直观的显示,我们在Structures中按INSERT,然后添加AT_INFO。

然后再查看1000B0A0,在Edit—>Struct var中选择刚刚添加的AT_INFO结构体。此时,结构体中的数据就规范成AT_INFO结构体了

想要知道该程序所打印的三块数据中,三个dll的数据分别是什么?
从之前的实验中可以看出,DLL1打印的数据是当前进程的ID,DLL2打印的是temp.txt的句柄,DLL3打印的是字符串ping www.malwareanalysisbook在内存中的地址。

如果我们想要将dll2.dll加载到IDA中,使其与OD中加载的地址匹配的话则进行以下操作:

打开DLL2.dll时,勾选manual load。

要求输入的基地址中填我们之前用OD查看到的DLL2的基地址3C0000。

因为头文件大小是1000,.text从3C1000开始

这样dll2.dll加载到IDA中,与OD中加载的地址就匹配啦~~~

总结

到这里对恶意代码的分析部分就结束啦~~~
。通过在爱春秋网站的学习,自己尝试用各种各样的工具对恶意代码进行分析,从静态到动态,再到综合分析,加深了我对恶意代码的了解和认识,了解到了恶意代码中的函数调用、参数设置等等。学会了从另一个角度了解恶意代码对我们计算机的操作以及其潜在危险的方法,分析完这些恶意代码后最大的感触其实是很多时候我们是发现不了这些恶意代码的,可能我的电脑里就有很多,只是他们可能并没有被检测出来或者是他们并没有发作而攻击我,所以我觉得还是得从自身做起,远离恶意代码,就像机要战士那样,不该看的别看,我们也应该不该点的别点~~~

这同时也是我免考项目的结束,回头看了看自己写的这么多篇博客,其实在实践的过程中学到了不少,且不说知识的掌握,防范意识已经上升了不止一个level了哈哈哈,其实我最喜欢的还是恶意代码的生成这一块,因为是我自己生成的,相比较于后面的分析,生成有趣多了好O(∩_∩)O哈哈~希望老师看在我辛勤劳动的份上给我一个高分嘻嘻