熊猫烧香病毒分析(第一篇)
提取码:8189
一、病毒初始化
1、工具准备 IDA、OD、PEID
2、基本流程:
- 利用查壳工具检查病毒是否带壳
- 利用OD动态分析病毒
- 利用IDA静态分析病毒
二、PEID加壳检查
首先需要调用工具检查是否带壳,如果病毒还需要先进行脱壳操作。这次研究的“熊猫烧香”程序并没有加壳。首先打开PEiD工具人,然后将熊猫烧香病毒拖进去,会发现病毒的基本信息。
分析信息如下:
- 该程序并没有加壳,采用Delphi Borland Delphi 6.0-7.0编写
- 区别:Delphi在函数调用时参数的传递不完全用栈,主要用寄存器。而C++程序函数调用前会使用push语句将参数入栈,然后再进行call。Delphi一般将第一个参数放入eax寄存器,第二个参数放入edx,第三个参数放入ecx寄存器,其余参数按照与VC程序类似的方式压栈。总之,Delphi编译器默认以register方式传递函数参数。这一点与VC编译的程序完全不同。
- 提示:栈上给局部变量分配空间的时候,栈是向下增长的,而栈上的数组、字符串、结构体等却是向上增长的。理解这一点可以帮助识别栈上的变量。
三、IDA和OD的分析
(2)定位到0x0040CB7E位置
注意:某些病毒在IDA中会自动分析出字符串“感谢艾玛…”,并且是在调用sub_403C98函数之前,我们可以推测上面那个函数也传递了一个字符串。接着可以通过OD动态调试获取字符串对应的值。
但是,我目前的IDA并没有自动解析出字符串的值,只能通过经验进行分析或OD动态调试。我们发现EBP是堆栈基址,接近着两次调用sub_403C98函数,前面的mov赋值经过是参数传递的工作,从而猜测出它的功能是:参数传递给函数调用。
(3)sub_403C98函数分析
调用OD进行动态分析,查看sub_403C98函数调用前传递的参数。
打开OD如上图所示,我们需要定位到0x0040CB79位置。直接按F8执行代码(单步步过),当执行到0x0040CB79位置可以看到对应的值为“武汉男生感染下载者”。
当然某些OD不会显示该值,只会显示“0040CC40=setup.0040CC40”,此时需要我们进一步在数据窗口跟随。
数据窗口右键->转到->表达式
接着输入“40CC40”,查找传递参数对应的值。
显示结果如下图所示,可以看到“武汉男生感染下载者”,包括“艾玛…”,这就是病毒作者的信息。早些年病毒作者处于炫耀目的,都会加入一些自己的特征。同样,现在APT攻击溯源也会通过文件路径等获取病毒作者的信息。
(4)分析病毒程序利用00403C98函数做了什么
接着在这个位置(0x0040CB7E)按下F2增加断点,然后按F9执行过来,按下F7进入call函数,进入的函数如下图所示。
接着按F7执行,遇到call 00403D08继续按下F7进入,再进入call 00402520,继续进入。
- call 00403D08
- call 00402520
- call dword ptr ds:[0x40D030]
- call 00401860
当进入call 00401860函数后,我们分析这里的两个API函数,它是对互斥空间进行初始化。
- 00401876 . E8 39F9FFFF call 004011B4 ;InitializeCriticalSection
- 00401889 . E8 2EF9FFFF call 004011BC ;EnterCriticalSection
我们继续按下F8单步步过执行往下分析,发现在0x004018B3位置调用LocalAlloc函数,该函数用于内存分配。它会分配大小为FF8的空间,Flags为LMEM_FIXED表示分配一个固定的内存。该函数执行结果会返回一个指向新分配的内存对象的句柄。
- LocalAlloc
写到这里,基本就确定了这个call 00403D08的功能,即分配一定大小的内存空间。我们已经进入了好几层Call,那怎么返回的呢?接下来我们再回到IDA进行分析。