恶意代码分析实战:Lab09-03

1、问题

首先用PEID查看恶意程序的导入表,可以发现,导入表中有四个dll被导入。
wwkTPI.jpg
再用IDA载入恶意程序,发现导入函数中存在对LoadLibraryA的调用,对其交叉引用,可以发现有两处地方调用了这个函数。
wwA0Qf.jpg

wwARWq.jpg

wwAJdH.jpg
可以发现,LoadLibraryA导入了DLL3.dll以及user32.dll这两个dll。

1、Lab09-03.exe导入了哪些DLL?

kernel32.dll、netapi32.dll、user32.dll、DLL1.dll、DLL2.dll、DLL3.dll

2、DLL1.dll、DLL2.dll、DLL3.dll要求的基地址是多少?

用PEID分别载入三个dll,可以发现他们要求的基地址都是0x10000000。

3、当使用OllDbg调试Lab09-03.exe时,为DLL1.dll、DLL2.dll、DLL3.dll分配的基址是什么?

wwVt2t.jpg
可以看到DLL1.dll的基地址是0x00390000,DLL2.dll的基地址是0x003A0000,DLL3.dll的基地址为0x00400000。

4、Lab09-03.exe调用DLL1.dll中的一个导入函数时,这个导入函数都做了什么?

在Lab09-03.exe中我们可以看到,main函数调用了DLL1.dll中的DLL1Print这个函数。用IDA载入DLL1.dll,来到DLL1Print这个函数的位置。
wwmYG9.jpg
可以发现这里有一个函数调用sub_10001038,它一共是有两个参数,第一个参数是一个字符串“DLL 1 mystery data %d\n”。可以认为sub_10001038是一个printf函数。
对第二个参数进行交叉引用,可以发现,在dllmain中对其进行了写的操作,可以发现,dword_10008030所保存的就是GetCurrentProcessId的返回值,说明它所保存的就是当前进程的id值。那么也就知道了,DLL1Print函数的功能就是打印出当前进程的id值。
wwmzoF.jpg

5、当Lab09-03.exe使用WriteFile函数时,它写入的文件名是什么?

ecx的值是由hObject决定的,而hObject是DLL2ReturnJ的返回值,那么我们这里就应当分析一下DLL2.dll这个文件。
wwulh4.jpg
用IDA载入DLL2.dll。找到DLL2ReturnJ这个函数,可以看到,这个函数仅仅是将dword_1000B078这个参数传递给eax然后返回。对dword_1000B078进行交叉引用。
wwuogs.jpg
可以发现,函数调用了CreateFileA,返回值赋给了dword_1000B078。这样我们就知道了,WriteFile的写入对象,其实就是temp.exe。

6、当Lab09-03.exe使用NetScheduleJobAdd创建一个job时,从哪里获取第二个参数的数据?

wwKib6.jpg
NetScheduleJobAdd这个函数的作用就在于制定一个工作任务,并且在未来的一个特定的时间来执行。这个函数的第二个参数Buffer,是一个指向AT_INFO结构的指针,该结构用于描述我们所提交的任务。程序首先调用了LoadLibrary来加载DLL3.dll,接着利用GetProcAddress获取了DLL3Print以及DLL3GetStructure这两个函数的地址。
wwMQSJ.jpg
可以看到,DLL3所打印的神秘数据是WideCharStr的内容,通过交叉引用可以发现,这个变量在DllMain中出现过。
wwMJw6.jpg
可以发现,这里调用了MultiByteToWideChar,这个函数用于将多字节转换成宽字符的形式。在这里,它会将lpWideCharStr参数的内容进行转换,保存在WideCharStr中。而lpWideCharStr中的内容就是“ping www.malwareanalysisbook.com”这段字符串在内存中的地址。DLL3的神秘数据就是该字符串在内存中的地址。
我们知道,NetScheduleJobAdd的第二个参数是一个AT_INFO结构,那么其实dword_1000B0A0中的内容就是一个结构体。为了显示出这个结构体,我们可以来到Structures窗口按下键盘上的Insert键,选择“添加标准的结构体”,添加AT_INFO结构。然后来到dword_1000B0A0在内存中的位置,选择菜单中的Edit下面的Struct Var,单击AT_INFO,就转换成功了:
wwQdEV.jpg

7、在运行或调试Lab09-03.exe时,你会看到Lab09-03.exe打印出三块神秘数据。DLL1、DLL2、DLL3、的神秘数据分别是什么?

DLL1的神秘数据就是当前进程的id值。DLL2的神秘数据是打开temp.txt文件的句柄。DLL3的神秘数据是字符串“ping www.malwareanalysisbook.com”在内存中的地址。

8、如何将DLL2.dll加载到IDA Pro中,使得它与OllyDbg使用的加载地址匹配?

我们在IDA中载入DLL2.dll时,选择“Manual load”,再输入OD中相应的加载地址即可。