15.4 “熊猫烧香”的自我保护分析

首先运行“熊猫烧香”病毒程序,如果有其他程序的图标变成了“熊猫头”即表明该文件被感染。使用OllyDBG载入调试文件,被感染程序的前半部分是病毒程序,因此可以在被感染程序中找到代码清单15-8中的代码信息。先查看被感染程序中的标记信息,如图15-6所示。

图 15-6 标记对比信息

图15-6的前5个字节数据是固定内容“WhBoy”,这个字符串用于病毒程序判断文件是原始病毒程序,还是被感染的程序。在图15-6中,从地址0x00AD5265开始,到地址0x00AD5272结束,其中存储的是被感染文件原来名称的ASCII编码。在0x02至0x01之间的这些数据表示文件未被感染前的大小值,这个数值是一个字符串,表示原始文件在十进制下的大小,如图15-7所示。

图 15-7 原始文件的大小值

有了这些信息,接下来对地址标号loc_4085D3处进行分析,如代码清单15-9所示。

代码清单15-9 函数CreateAndRunPanda的代码片段7—IDA分析


loc_4085D3:

004085D3 lea eax,[ebp+var_14]

004085D6 push eax

004085D7 mov edx,[ebp+var_8];获取标记对比信息

004085DA mov eax, offset dword_408934;数值标记1

004085DF call FindSignPos

004085E4 mov ecx, eax;获取标记所在位置

004085E6 dec ecx;对所在位置减1

004085E7 mov edx,1

004085EC mov eax,[ebp+var_8];获取文件在内存中的首地址

;复制字符串到内存中,重命名为CypStrMem

004085EF call sub_40412C;将标记对比信息复制到[ebp+var_14]中

004085F4 lea eax,[ebp+var_14]

004085F7 mov ecx,5

004085FC mov edx,1

;将[ebp+var_14]中保存的对比信息的前5字节删除,ecx中保存删除字符个数

00408601 call DelStrBuff

00408606 lea eax,[ebp+var_C]

00408609 push eax

0040860A mov edx,[ebp+var_14]

0040860D mov eax, offset dword_408940;标记数值0x02

00408612 call FindSignPos

00408617 mov ecx, eax;获取标记位置

00408619 dec ecx

0040861A mov edx,1

0040861F mov eax,[ebp+var_14]

00408622 call CypStrMem;获取原始文件名的首地址,保存到[ebp+var_C]中

00408627 mov edx,[ebp+var_14]

0040862A mov eax, offset dword_408940;标记数值0x02

0040862F call FindSignPos

00408634 mov ecx, eax;获取标记位置并保存到ecx中

00408636 lea eax,[ebp+var_14]

00408639 mov edx,1

0040863E call DelStrBuff;获取原始文件大小

00408643 mov eax,[ebp+var_14]

;将保存文件大小信息的字符转换为整型,结果保存到eax中

00408646 call sub_405870;重命名为StrToInt

0040864B mov[ebp+var_18],eax;原始文件大小保存到[ebp+var_18]中

0040864E xor eax, eax

00408650 push ebp

00408651 push offset loc_4086D6

00408656 push dword ptr fs:[eax]

00408659 mov fs:[eax],esp

0040865C mov edx,[ebp+var_C];创建文件名称字符串的首地址

0040865F lea eax,[ebp+var_1E4]

;此函数根据原文件的名称创建出新文件

00408665 call sub_402AD8;重命名为CreateNewFile

0040866A mov eax, ds:off_40E2BC

0040866F mov byte ptr[eax],2

00408672 lea eax,[ebp+var_1E4];文件指针

;以文本方式打开文件

00408678 call sub_402868;打开文件,重命名为OpenFile

0040867D call sub_402614;重命名为_IOTest

00408682 lea eax,[ebp+var_404]

;保存复制文件后的首地址

00408688 push eax

00408689 mov eax,[ebp+var_4];获取当前文件信息的首地址

0040868C call GetFileLen;获取自身文件大小

00408691 mov edx, eax

00408693 sub edx,[ebp+var_18];获取病毒部分文件大小

00408696 mov ecx,[ebp+var_18];获取源程序文件大小

00408699 mov eax,[ebp+var_4];获取当前文件信息的首地址

;复制当前文件未感染前的文件内容

0040869C call CypStrMem

;[ebp+var_404]中保存了原始程序文件在内存中的首地址

004086A1 mov edx,[ebp+var_404]

004086A7 lea eax,[ebp+var_1E4];获取文件指针

;向文件写入数据,将原始程序文件写入CreateNewFile所创建的文件中

004086AD call sub_404260;重命名为WirteFileInfo

004086B2 call sub_402B88;提交缓冲区,重命名为Flush

004086B7 call_IOTest

004086BC lea eax,[ebp+var_1E4]

004086C2 call sub_402C48;关闭文件,重命名为CloseFile

;其余代码分析略

004086D4 jmp short loc_4086E0;原始文件已经创建完毕,进入loc_4086E0流程


代码清单15-9的主要功能是将被感染的文件进行分离,提取出原始文件信息。由于感染文件时预留了相关的标记信息,根据这些信息即可得到原始文件。以图15-7中的文件为例,被感染后的文件可分为三部分,如图15-8所示。

图 15-8 被感染文件的组成

代码清单15-9被执行后,会在程序所在目录下释放出一个原始文件,紧接着代码流程进入到地址标号loc_4086E0处,如代码清单15-10所示。

代码清单15-10 函数CreateAndRunPanda的代码片段8—IDA分析


loc_4086E0:;地址标号

;此函数完成批处理文件的创建与运行过程,批处理文件将生成如下目录:

;C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\17$$.bat,批处理文件信息见图15-9

004086E0 call sub_407C74;重命名为CreateRunBat

004086E5 mov offset aSpcolsv_exe;"spcolsv.exe"

;此函数检查进程中是否存在"spcolsv.exe"

004086EA call sub_405568

004086EF test al, al

;根据sub_405568的返回结果,若存在"spcolsv.exe",则跳至程序退出流程

004086F1 jnz loc_408896

004086F7 push 80h

;若进程中不存在"spcolsv.exe",则从病毒文件中分离出病毒程序,重新执行

;类似代码清单15-6中的代码,在系统目录下创建"spcolsv.exe"病毒程序

;其余代码分析略

loc_408896:;地址标号

00408896 push 0;uExitCode

00408898 call ExitProcess_0


图 15-9 批处理文件信息

通过代码清单15-10的分析,可以得知被感染文件的主要工作是维护进程中伪造的病毒程序“spcolsv.exe”。如果这个病毒程序被处理掉,则会由被感染的程序再次生成。这样病毒的生命力就会变得异常顽强,只有修复了所有被感染的病毒程序才有可能将其彻底杀死。