首先动静态结合分析程序

跑起来会发现调用了3个DLL,用IDA先来看看main

简单猜想DLL1Print()是调用了DLL1,DLL2Print()是调用了DLL2

这里的extrn:说明这个函数是由外部实现的,这里是直接的外部调用(extern)


调用DLL3Print()函数是采用的不同的姿势

先使用LoadLibrary来获取DLL的句柄,接着使用GetProcAddress得到函数入口

所以v9是DLL3Print,v7是DLL3GetStructure

然后出现了一个原来没玩过的API:NetScheduleJobAdd(A,B,C)

根据英文的拼写可以猜到是在当前机器上添加了一个网络的计划任务,上网搜搜怎么查看当前的计划任务

再Sleep了100s,就把IDA中的main框架分析完了


然后来看DLL1


第一想法:这里的10001038函数,就是printf!但是为啥每次运行值都不一样呢,就很奇怪


其他两个的数字值就是一样固定的

为啥DLL1里的是常数值,输出出来就是变化的值

反而打问号的地方,在程序里是个常数值


所以来查一下1000B078的引用,这个变量是全局变量,一定有个地方是赋值了的

FileName:temp.txt

这里所在文件夹的位置竟然是在Administrator,就很奇怪了,于是想到了,是不是因为“桌面”是汉字,所以被迫截断了,因为没有设置CreateFile的路径,所以默认应该是和exe同一个目录下


这里的DLL2调用后的整数值变成了44,可见是和程序运行的目录有关的

还有一个的奇怪现象:当直接双击运行exe时,DLL2的data值就是44;但是在cmd下拖入exe回车运行,就是2008。如图:


可能是因为:当前目录不一样吧,一个是在Administrator下,另一个就是当前文件夹下


再来分析DLL3,无论在哪个目录下运行,都是4108480这个常数值

看到了取地址符,就可以理解为啥是常数了,偏移是固定的~~~~

算一算,0x3B0C0 = 4108480~~~


问题1:Lab0903.exe调用了哪些DLL

DLL1.dll,DLL2.dll,DLL3.dll

其中前两个是直接用的函数,第三个是先用LoadLibrary,然后再用GetProcAddress


问题2:dll要求的基地址是多少

要求的基地址都是10001000


问题3:OD调试时,为dll分配的基地址是什么

在调试时,DLL1和DLL2是自动载入的,DLL3是用LoadLibrary,是动态加入的

DLL1:10000000

DLL2:00390000

DLL3:00420000


问题4:DLL1.dll的导入函数

函数名称为DLL1print,作用是输出全局变量dword_1008030的值

虽然这里一开始是个常数,但是在DllMain中,已经修改掉了这个值

这个值是:当前程序的进程ID


在Process Explorer - Options - Difference Highlight Duration...中,把值改大一点(默认是1s,修改成5s或者更大)在运行新进程的时候就可以很容易的找到了~~~



问题5:调用WriteFile函数时,写入的文件名是什么

temp.txt


问题6:NetScheduleJobAdd的参数

Servername:服务器名称,Buffer是存入的缓冲区,JobId:进程号

这个参数应该是个句柄,不知道怎么确认值


问题7:三块神秘数据

前面分析过了

第一个是程序的进程ID号,第二个是文件运行目录下的ID值,第三个是常数值(一个全局变量的偏移值)


问题8:如何加载DLL2.dll到IDA中,使得它与OD使用的加载地

址匹配?

不会

在自己调试分析的过程中,但是按照RVA的偏移来计算寻找的

针对其API函数的位置、名称和参数,OD和IDA来对应,动静态结合分析其过程