恶意代码分析实战lab09_03
经过实践完成了lab09_03的分析,记录一下并分享,也加深自己的学习和理解。
本次实验用的工具有PEeditor,OllyICE,IDA pro,和样本文件包,有需要的可以评论留言我可以网盘分享。
实验目的:熟悉IDA调试与静态分析
本次实验内容围绕解决如下问题:
1.样本导入了哪些 DLL?
2.DLL1.dll、DLL2.dll、 DLL3.dll要求的基地址分被是多少?
3. DLL3.dll导入方式和前面2个DLL有何不同?
4.1当使用OllyDbg调试样本时,为DLL1.dll、DLL2.dll、 DLL3.dll 分配的基地址是什么?是否符合第2步DLL声明的基地址相同?为什么出现这种情况?
4.2、样本调用DLL1.dll中的一个导入函数,该函数名称是什么?
5、分析该函数功能。DLL1打印的数据是什么?
6.1样本调用了WriteFile函数,分析WriteFile函数功能及其参数。
6.2当样本调用WriteFile函数时,它写入的文件名是什么,写入该文件的内容是什么?DLL2打印的数据是什么?
7.1当样本使用NetScheduleJobAdd创建一个job时,从哪里获取第二个参数的数据?从这里获取什么信息?
7.2 DLL3打印的数据是什么?
分析样本导入了那些DLL
用PEeditor打开Lab09-03.exe,选择目录->输入表,可以看到在加载样本程序时就已经导入的dll有四个。

2.DLL1.dll、DLL2.dll、 DLL3.dll要求的基地址分被是多少?
用PEeditor分别打开DLL1.dll、DLL2.dll、 DLL3.dll,查看要求的镜像基址。
Dll1要求的基址为10000000

Dll2要求的基址为10000000

Dll3要求的基址为10000000

3. DLL3.dll导入方式和前面2个DLL有何不同?
从PEeditor可以看到导入表里有DLL1和DLL2就是在程序加载时就已经导入了,但是DLL三是在程序运行的过程中导入的,由LoadLibrary进行加载DLL3。如何找到在运行时加载的DLL呢,用IDA进行分析,首先载入exe,然后查看import窗口。

就能看到所有的导入函数,与加载dll库有关的函数就是loadlbrary,找到该函数。

双击进入,然后选中函数命ctrl+x查看交叉引用。

交叉引用有两个主要分类:1.代码交叉引用(例如引用函数)2.数据交叉引用(例如字符串地址,变量值引用)
代码交叉引用类型:
o 普通流 ,表示一条指令到另一条指令的顺序流
p 调用流,表示控制权被转交给目标函数,如BL等命令
j 跳转流,表示分支操作,常见于if等操作
数据交叉引用类型:
r 读取交叉引用,表示访问的是某个内存位置的内容
w 写入交叉引用,指出了修改变量内容的程序位置
o 偏移量交叉引用,表示引用的是某个位置的地址(而非内容)
关注到LoadLibraryA的交叉引用列表,我们先分析第一个调用(p,图指错了,但是好像双击第一个问题也不大)该函数的指令:

这里就是调用了LoadLibraryA的代码部分:

可以看到在call LoadLibraryA之前压了一个参数,Libfilename,而这里的name是DLL3.dll。然后执行了call以后,就加载了DLL3.
然后再双击 LoadLibraryA函数,再查看一次交叉引用,这次看第二个引用函数的代码。发现还加载了user32.dll。所以第一题是不是加载了6个dll呢。

4.1当使用OllyDbg调试样本时,为DLL1.dll、DLL2.dll、 DLL3.dll 分配的基地址是什么?是否符合第2步DLL声明的基地址相同?为什么出现这种情况?
由于DLL1和DLL2是在载入程序时一起导入的,所以查看,内存(快捷键ctrl+m)可以查看到分配的地址。
Dll1的分配的基址为10000000(符合);

Dll2的分配的基址为(00010000不符合);

DLL3不能直接看,要通过设置断点,在载入DLL3使程序停下,然后查看内存。
下图圈出的位置就是加载dll3的汇编代码,我们在如图位置下断点,点左侧地址栏->右键->断点->切换,也可通过f2快捷键下断点。

查看内存(alt+m)如下,可以看到加载dll3的初始位置为00580000:

5.分析该函数功能。DLL1打印的数据是什么?
Od打开找到call dll1print的函数的位置,右键跟随进入函数查看


看到要输出dll1(call 10001038)

用ida打开dll1.dll查看dll1print

看到call了sub_10001038这个函数,双击进入,看到函数调用两个参数,1038处可以理解为调用的输出,两个参数分别为eax中的(8030处获得),和字符串。

再看看dword_10008030,双击该数据

Ctrl+x查看交叉引用,可以看到一个是w一个是r,我们看看这个值是从哪来的,所以查看一下w,所以双击查看第一个。

可以看到这里是把eax的值mov到8030,而eax的值是上面call语句返回的结果,是当前进程的id。

6.1样本调用了WriteFile函数,分析WriteFile函数功能及其参数。
回到exe文件进行分析,dll2同样是打印,发现writefile函数压了两个参数,一个是字符串,另一个是ecx寄存器的内容,往上分析,ecx的内容是来自[ebp+hFile],而[ebp+hFile]的内容是来自eax寄存器,那寄存器中的值又是哪来的,是调用了DLL2ReturnJ返回的值。所以writefile两个参数一个是字符串,一个是DLL2ReturnJ返回的值,是创建的文件的句柄。

Ida载入dll2,找到DLL2ReturnJ,可以看到eax中的内容是B078的内容,选中dword_1000B078双击进入

然后ctrl+x查看交叉引用

然后看到有三个地方是交叉引用的,看类型有w和r分别表示写和读,也有引用的汇编指令,可以看到第一条是把eax值mov给dword_1000B078,所以我们双击进去看看。
可以看到调用了CreateFileA,因此eax中值是call CreateFileA后的返回值,而在调用call CreateFileA之前push了一个参数,是temp.txt,合理推测为创建的文件名,可以推测返回值为文件句柄。

双击进入看看,应该是返回的创建文件的句柄(handle),文件名称为字符串temp.txt:

6.2当样本调用WriteFile函数时,它写入的文件名是什么,写入该文件的内容是什么?
写入的内容是这个

7.1当样本使用NetScheduleJobAdd创建一个job时,从哪里获取第二个参数的数据?从这里获取什么信息?
在样本exe中,当调用了DLL3print后,就调用了NetScheduleJobAdd,调用函数前入栈的两个参数一个是job id一个是ecx,buffer其实就是一个局部变量。
也就是说在调用dll3strcture时其参数就是局部变量的地址,Lab09-03.exe 从DLL3GetStructure中获取NetScheduleJobAdd调用的缓冲区,它动态地解析获得第二个参数的数据。
再对dll3进行分析,这里其实我还没分析懂。先把博客写了,后面有空了再继续分析。

7.2 DLL3打印的数据是什么
数据3是字符串ping www. malwareanalysisbook. com在内存中的位置。
分析一下DLL3GetStruture

AT_info结构体

这里的结构体要添加结构体才会解析。
待补()
课本上的标准答案如下:

有想要电子档课本的也可以留言!!!
本次实验记录到此结束,感谢阅读~
可以看到这里是把eax的值mov到8030,而eax的值是上面call语句返回的结果,是当前进程的id。
数据3是字符串ping www. malwareanalysisbook. com在内存中的位置。
分析一下DLL3GetStruture

浙公网安备 33010602011771号