恶意代码分析实战 第九章课后实验 Lab09-03

恶意代码分析实战 第九章课后实验 Lab09-03

问题1:

首先用peid查看导入表:

恶意代码分析实战 第九章课后实验 Lab09-03

这里发现了四个,分别是kernel32.dll  netapi32.dll  DLL1.dll  DLL2.dll 。还有些.dll是在程序运行时加载的,用ida打开Lab09-03.exe。如果想要在程序运行时动态加载.dll文件一般要调用LoadLibrary这个函数,点开Imports,找到LoadLibrary:

恶意代码分析实战 第九章课后实验 Lab09-03

双击查看,然后在地址查查看交叉引用窗口,快捷键Ctrl+x;

 

重点看一下前两个调用:

恶意代码分析实战 第九章课后实验 Lab09-03

恶意代码分析实战 第九章课后实验 Lab09-03

看到这两个调用也分别出现了.dll文件,分别是DLL3.dll  user32.dll。所以呢,一共导入了六个.dll。

问题2:

基地址利用peid查看发现三个.dll的基地址都是10000000。

问题3:

使用OD载入Lab09-03.exe,点击M。

恶意代码分析实战 第九章课后实验 Lab09-03

看到了DLL1与DLL2的基地址分别是003C0000与10000000。这个和第二个问题查看的结果是不同的,这是可能存在的。还有不同的系统也有可能造成不同的结果。

DLL3.dll是在程序中动态加载的,首先用ida查看一下LoadLibrary的地址:

恶意代码分析实战 第九章课后实验 Lab09-03

然后用OD跳转的这个地址:

在下一行设置一个断点,然后运行

恶意代码分析实战 第九章课后实验 Lab09-03

这样就能加载DLL3.dll了,点击M查看:

恶意代码分析实战 第九章课后实验 Lab09-03

DLL3.dll的基地址是00430000。

问题4:

在ida开始的地方,看到调用了DLL1Print,这个函数是保存在DLL1.dll中的。

恶意代码分析实战 第九章课后实验 Lab09-03

用ida打开DLL1.dll,然后找到DLLPrint的位置,如下:

恶意代码分析实战 第九章课后实验 Lab09-03

这里调用了sub_10001038,一共有两个参数,第一个是"DLL 1 mystery data %d\n",这个参数里出现了%d\n,就说明这是一个printf函数。第二个参数的内容就是dword_10008030的内容,双击之后对其进行交叉引用:

恶意代码分析实战 第九章课后实验 Lab09-03

双击查看写入的操作:

恶意代码分析实战 第九章课后实验 Lab09-03

可以看到dword_10008030这里保存的是GetCurrentProcess的返回值,也就是当前进程的ID值,也是DLL1的神秘数据(问题7 的第一小问)。

问题5:

查看WriteFile,

恶意代码分析实战 第九章课后实验 Lab09-03

WriteFile里的一个参数保存了一个句柄,hFile是DLL2ReturnJ的返回值,所以用ida打开DLL2.dll。

同时分析一下DLL2Print。

恶意代码分析实战 第九章课后实验 Lab09-03

在这里再一次的看到了神秘数据,这个神秘数据想要打印的内容保存在了dword_1000B078里,双击之后交叉引用查看:

恶意代码分析实战 第九章课后实验 Lab09-03

CreateFileA的返回值是dword_1000B078,也就说明了,第二处神秘数据所打印的就是temp.txt这个文件的句柄(问题7的第二小问)。

下面分析DLL2ReturnJ

恶意代码分析实战 第九章课后实验 Lab09-03

这段程序很简单,就是将dword_1000B078给eax,然后也就返回了。经过上面的分析指导dword_1000B078这个就是temp.txt的句柄。所以呢,WriteFile的写入对象,也就是temp.exe

问题6:

 

恶意代码分析实战 第九章课后实验 Lab09-03

使用MSDN查询可知,NetScheduleJobAdd这个函数的作用就在于制定一个任务,并且在未来的一个特定的时间来执行。这个函数的第二个参数Buffer,是一个指向AT_INFO结构的指针,该结构用于描述我们所提交的任务。   在上图的反汇编代码中,程序首先调用了LoadLibrary来加载DLL3.dll,接着利用GetProcAddress获取了DLL3Print以及DLL3GetStructure这两个函数的地址。

 

使用ida来打开DLL3.dll,首先分析一下DLL3Print这个函数:

恶意代码分析实战 第九章课后实验 Lab09-03

在这里在一次的看到了神秘数据,这次的神秘数据指的是WideCharStr里的内容,双击然后交叉引用查看一下:

恶意代码分析实战 第九章课后实验 Lab09-03

这里发现了DLLMain函数,双击:

恶意代码分析实战 第九章课后实验 Lab09-03

这里调用了MultiByteToWideChar函数,通过MSDN查询知道这个函数用于将多字节转换成宽字符的形式。它会将lpWideCharStr参数的内容进行转换,保存在WideCharStr中。而lpWideCharStr中的内容就是“ping www.malwareanalysisbook.com”这段字符串在内存中的地址。那也就知道了神秘地址就是在内存中的地址(问题7的第三小问)。

看一下DLL3GetStructure

恶意代码分析实战 第九章课后实验 Lab09-03

将dword_1000B0A0的地址赋给以eax的值为地址的内存空间中,双击dword_1000B0A0利用交叉引用查看一下

恶意代码分析实战 第九章课后实验 Lab09-03

双击DLLMain:

恶意代码分析实战 第九章课后实验 Lab09-03

这是一系列的赋值操作,而最终这个区域的地址,会成为NetScheduleJobAdd这个函数的第二个参数。其实,它的第二个参数是一个AT_INFO结构,而dword_1000B0A0中的内容就是一个结构体。我们找到Structures窗口按下键盘上的Fn+Insert键(或者insert,这个应该是版本不同造成的),选择“Add standard structure”,添加AT_INFO结构从而将这个结构体显示出来。然后来到dword_1000B0A0在内存中的位置,选择菜单中的Edit下面的Struct Var,单击AT_INFO,就转换成功了:

恶意代码分析实战 第九章课后实验 Lab09-03

恶意代码分析实战 第九章课后实验 Lab09-03

问题7:

这个在前面都已经提到过了,就不在说了。

问题8:

首先用ida加载DLL2.dll,在load a new file页面选择Manuai load也就手动加载,然后点击OK。然后要求再输入基地址

恶意代码分析实战 第九章课后实验 Lab09-03

然后查看OD中的DLL2的地址是003C0000,将地址输入后连续点击几个yes,

恶意代码分析实战 第九章课后实验 Lab09-03

选择就可以看到地址是003C1000。

为什么不是003C0000呢?

因为当前属于代码的区段,看一下OD

恶意代码分析实战 第九章课后实验 Lab09-03

代码的区段也是从003C1000开始的,这就说明了OD与ida加载的地址匹配了。