20145319 《计算机病毒》动静态分析(实践十)
实验内容
该程序导入了哪些dll文件
- 使用
PE exploer
打开该文件,查看其导入表,可以看到,这个文件导入了Kernel32.dll
,netapi32.dll
,dll1.dll
以及dll2.dll
相应三个dll要求的基地址是多少?实际分配的基地址是多少?
-
仍旧使用
PE exploer
,打开相应dll文件,查看映像基地址(以下以dll1.dll
为例),结果dll1.dll
,dll2.dll
,dll3.dll
映像基地址都为10000000h -
实际分配的基地址和理论上有所不同,使用ollydbg加载恶意程序,打开
memory map
查看细节信息,可见dll文件所对应的基地址,dll1--10000000
,dll2--003c0000
,dll3--00430000
当该程序调用dll1.dll中的一个导出函数,这个导出函数做了什么
-
使用
pe explore
打开dll1.dll
的导出表,可见其中只有一个函数dll1print -
使用ida打开恶意程序,细致分析此函数
-
首先我们看到上述函数中使用到了一个字符串,以及一个函数sub_10001038,我们逐一分析,字符串入栈,应该就是作为
函数sub_10001038
的参数,所以我们先分析该函数,该函数中又调用了函数stbuf
和函数ftbuf
有兴趣的同学可以查询一下printf函数的实现,这里这个函数sub_10001038所实现的就是printf函数
的功能 -
下一步我们就需要弄清楚这个字符串到底代表了什么含义,查看该字符串的交叉引用,发现这个字符串共两处被使用,其中一个为写另外一个为读,我们着重观察写的部分,可以清楚的判断出,这个字符串其实就是当前进程的进程id
-
那么
函数dll1printf
的功能就是获取当前进程的进程id并将其输出
程序调用writefile函数时,文件名是什么
-
首先在函数列表中找到
函数writefile
的位置,在improts列表中,找到函数,点击并使用交叉引用,找到函数的具体位置 -
从之前入栈的参数来看,这个要写入的内容应该就是上方那一串网址,但是写入的目标则与ecx中的hfile值有关,再往上翻,就会发现该寄存器中存储的是
dll2returnJ函数
或者是dll2print函数
的返回值 -
使用ida打开dll2.dll,查看相应函数,使用与之前相同的方法,找到字符串是在何处被写入的,这里可以清楚的看到,这个字符串代表了就是一个文件名
temp.txt
当该程序调用NetScheduleJpbAdd创建一个Job时,从哪里得到第二个参数值
-
首先我们找到这个函数在程序中的位置,其参数需要从
函数dll3getStructure
当中获得,我们打开文件dll3.dll,查看其中细节 -
查看其中的字符串,通过交叉引用找到其在何处被写入
该程序所打印的三块数据中,三个dll的数据分别是什么
- dll1:当前进程的PID
- dll2:temp.txt文件的句柄
- dll3:
ping www.malwareanalysisbook.com
在内存中的地址
如何将dll2.dll加载到IDA中,使其与OD中加载的地址匹配
-
使用ida打开dll2.dll,其中在加载界面时勾选
manual load
,输入地址003c0000(与之前的结果相符)