目录

安全攻防进阶篇-十.熊猫烧香病毒机理IDA和OD逆向分析-病毒释放过程中

[安全攻防进阶篇] 十.熊猫烧香病毒机理IDA和OD逆向分析–病毒释放过程(中)

如果你想成为一名逆向分析或恶意代码检测工程师,或者对系统安全非常感兴趣,就必须要认真分析一些恶意样本。熊猫烧香病毒就是一款非常具有代表性的病毒,当年造成了非常大的影响,并且也有一定技术手段。本文将详细讲解熊猫烧香的行为机理,并通过软件对其功能行为进行分析,这将有助于我们学习逆向分析和反病毒工作。后续作者还将对其进行逆向调试,以及WannaCry勒索蠕虫、各种恶意样本及木马的分析。基础性文章,希望您喜欢!

IDA和OD作为逆向分析的“倚天剑和“屠龙刀”,学好它们的基本用法至关重要。本文重点分析熊猫烧香病毒的功能函数,大家掌握这些技巧后才能更好地分析更多的代码。同时,本文部分实验参考姜晔老师的视频分析,真的非常佩服和值得去学习的一位老师。技术路上哪有享乐,为了提升安全能力,别抱怨,干就对了~

https://i-blog.csdnimg.cn/blog_migrate/5e22d3c8219b766b711eb3021c8fc3d6.png#pic_center

上一篇文章讲解了“熊猫烧香”病毒样本的反汇编代码入口处的分析,接下来我们分析病毒的核心部,其分析思路基本一致,同时越深入核心部分会遇到越多的API函数。我们将利用OD和IDA工具结合调用函数的参数进行分析,它将有助于我们更好地理解病毒行为。同时,将分析出的每一个CALL函数,改为我们能够理解的名字,这往往也有助于对后续程序的理解。作者结合两篇文章绘制了一张分析图,希望加深大家对熊猫烧香的了解。这系列文章写得不容易,希望大家给点个赞和收藏,也欢迎评论和交流。

https://i-blog.csdnimg.cn/blog_migrate/b66dded551c40e5b2e64aa16faad8f50.png#pic_center

从2019年7月开始,我来到了一个陌生的专业——网络空间安全。初入安全领域,是非常痛苦和难受的,要学的东西太多、涉及面太广,但好在自己通过分享100篇“网络安全自学”系列文章,艰难前行着。感恩这一年相识、相知、相趣的安全大佬和朋友们,如果写得不好或不足之处,还请大家海涵!

接下来我将开启新的安全系列,叫“安全攻防进阶篇”,也是免费的100篇文章,作者将更加深入的去研究恶意样本分析、逆向分析、内网渗透、网络攻防实战等,也将通过在线笔记和实践操作的形式分享与博友们学习,希望能与您一起进步,加油~

  • 推荐前文:

文章目录


一.实验背景

对病毒进行逆向分析,可以彻底弄清楚病毒的行为,从而采取更有效的针对手段。为了节省篇幅,在这里我不打算将“熊猫烧香”进行彻底的分析,只会讲解一些比较重要的部分,大家只要掌握了这些思想,那么就可以处理很多的恶意程序了。

这里主要使用的工具包括:

  • PEiD:病毒加壳、脱壳基础性分析
  • IDA Pro:静态分析
  • OllyDbg:动态分析

实验文件:

  • setup.exe:熊猫烧香病毒

基本流程:

  • 利用查壳工具检查病毒是否带壳
  • 利用OD动态分析病毒
  • 利用IDA静态分析病毒

注意:由于OD工具会将程序运行起来,所以我们在进行恶意代码分析时尽量在搭建好的虚拟机中操作。如果病毒传播性较强如WannaCry,建议断开网络和断开共享分析。

https://i-blog.csdnimg.cn/blog_migrate/c0bf30826b957f5ccbb7c72ef2a85010.png#pic_center

实验思路:

  • 1.利用OD分析每一个CALL的功能
  • 2.使用IDA Pro在宏观上把握程序的功能并及时对函数进行重命名操作

上篇回顾:

  • 0x0040CB7E call sub_403C98

    – 重命名为:AllocStackAndCopyString

    – sub_403D08:分配内存空间

    – sub_402650:字符串拷贝功能

  • 0x0040CB9F call sub_00405360

    – 重命名为:DecodeString

    – 0x004053CC:循环入口点

    – 0x004053E8:获取“xboy”解密字符

    – 0x00405408:完成异或解密操作

  • 0x0040CBAC call sub_404018

    – 重命名为:CMPString

    – 0x00404041:循环入口点

    – 功能:字符串比较“武汉男生感染下载者”

  • 0x0040CBCC loc_40CBBC

    – 功能:字符串解密和比较操作,解密字符“whboy”

    – DecodeString

    – CMPString


二.sub_408024核心函数分析

上一篇文章我们详细介绍了熊猫烧香病毒起始阶段的初始化操作,这篇文章将进入该病毒的核心功能函数,进行相关的逆向分析。Let’s Go!!!

1.sub_40277C子函数

第一步,打开IDA Pro载入我们的病毒样本。

https://i-blog.csdnimg.cn/blog_migrate/8fa1425b8ae7daec52816dcb72e757b7.png#pic_center

第二步,定位到loc_40CBE6位置。

这里看到了三个call函数,它们又是什么功能呢?这三个call是熊猫烧香病毒最重要的功能,也是我们接下来要深入逆向分析的内容。

  • sub_408024
  • sub_40CA5C
  • sub_40C97C

https://i-blog.csdnimg.cn/blog_migrate/ed453359dd89442cc78f5a88238cafef.png#pic_center

第三步,查看函数sub_408024内容。

在这个函数的最开始位置我们看到了将84h赋值给ecx,84h表示循环的次数。循环的主体是下面两个push,其中每一个push能开辟8个字节(32位)的空间,两个字节能获得16个字节的空间。这样的空间一共申请了ecx(84h)次。

  • mov ecx, 84h
  • push 0
  • push 0

https://i-blog.csdnimg.cn/blog_migrate/27596d233e1bd2d58f45d2bebf0581ae.png#pic_center


第四步,我们主要分析call函数,往下看到第一个函数sub_40277c。

https://i-blog.csdnimg.cn/blog_migrate/7c0bf233ddc8ad7efea29cb91947e0f9.png#pic_center

第五步,接着用OD载入exe程序,进行动态的分析,直接跳转到该地址。

  • 0x0040804D call sub_40277C

基本流程为右键“转到”->“表达式”->输入“0040804D”,按下F2增加断点。

https://i-blog.csdnimg.cn/blog_migrate/287cedc9ba96f149367023b0b92ece98.png#pic_center

按F9直接执行到该位置。

https://i-blog.csdnimg.cn/blog_migrate/092611baa3b5bb92c93442dc6cc1b812.png#pic_center

该函数我们可以在IDA中先双击查看,会发现该函数首先调用了GetModuleFileNameA。

  • 0x004027A0 call GetModuleFileNameA
  • 该函数功能主要是获取当前进程已加载模块文件的完整路径

https://i-blog.csdnimg.cn/blog_migrate/e85e079237b19a41a77dff0d29814674.png#pic_center


第六步,回到OD中sub_40277C函数,按下F7单步进入函数。

接着进入函数后按F8单步步过,可以看到GetModuleFileNameA右下角的内容,在这个PathBuffer里,会保存即将获取的路径信息。

  • 0x004027A0 call 00401100
  • PathBuffer

https://i-blog.csdnimg.cn/blog_migrate/21fbc912b1d4ca12370e319d84902547.png#pic_center

接着选中PathBuffer值,右键点击“数据窗口中跟随”。

https://i-blog.csdnimg.cn/blog_migrate/cb81cf338fdb8b403ad994ff5d3b5370.png#pic_center

注意:按下F8,大家可以在数据窗口中留意该值的前后变化。发现它成功获取了该样本的本地路径。

  • C:\Users\14551\Desktop\setup.exe

https://i-blog.csdnimg.cn/blog_migrate/6d7b460048d913cbb431761ad37a9a32.png#pic_center


第七步,我们打开IDA给sub_40277C函数重命名。

小技巧

IDA中双击会进入对应的函数,那么如何返回上一层呢?按下ESC即可返回,如下图所示,从GetModuleFileNameA中按ESC返回sub_40277C位置。而按F5键会逆向出C语言程序。

https://i-blog.csdnimg.cn/blog_migrate/f9e43b19adf0796f2e6edb94caf1aa4f.png#pic_center

然后选中函数重命名,快捷键为N。

https://i-blog.csdnimg.cn/blog_migrate/9891bd9de0f6f1f5ee684a6ff979d169.png#pic_center

总结,重命名及对应功能如下:

  • sub_40277C -> GetFilePathAndName
  • 功能:获取文件的完整路径及文件名称

https://i-blog.csdnimg.cn/blog_migrate/35b324e504a4502b73091ef3d6419d6b.png#pic_center


2.sub_405684子函数

接着往下看,函数如下:

  • 0x0040805E call sub_405684

https://i-blog.csdnimg.cn/blog_migrate/9ef3ec0246ab5d861af9a7c93056b480.png#pic_center

第一步,继续在OD中进行跟进。

首先我们表达式跳转到“00408052”位置,然后按下F2增加断点,按下F9执行过来。

https://i-blog.csdnimg.cn/blog_migrate/2d7fd846cf45a7a3188d6cc4781b767e.png#pic_center

我们首先可以看看它压入的参数是什么?

第二步,在数据窗口中跟随EAX。

按下F7单步执行,在寄存器中选中EAX,右键“数据窗口中跟随”。

https://i-blog.csdnimg.cn/blog_migrate/c233fdf447ea4e9f7ba93348cf97aff9.png#pic_center

显示结果如下图所示,可以看到EAX中保存的是刚刚获取的病毒文件完整路径。

https://i-blog.csdnimg.cn/blog_migrate/d2b1701c897badfb5d481f268b5a0711.png#pic_center

第三步,在数据窗口中跟随EDX。

按下F7单步执行,在寄存器中选中EDX,右键“数据窗口中跟随”。目前EDX还是空值。

https://i-blog.csdnimg.cn/blog_migrate/db71d8655739da38290b249d03c8bcc1.png#pic_center

第四步,进入后面的call(00405684),查看它的内容。

先选中EAX右键“数据窗口中跟随”。

https://i-blog.csdnimg.cn/blog_migrate/06286666411b66767a9a57765fe1bc91.png#pic_center

然后按下F7进入函数,可以看到这里出现了粗线条, 说明它是一个循环 。我们步入循环分析其内容。

https://i-blog.csdnimg.cn/blog_migrate/be470e50059f424e9eec01e50bcbd11e.png#pic_center

前面按下F8执行,然后到循环位置按F7步入。

  • mov eax, [local.1]

https://i-blog.csdnimg.cn/blog_migrate/9efbe1256c12277d0d671d092c10ff96.png#pic_center

注意这里简单介绍下局部变量的概念。

小技巧

[LOCAL]是局部变量的意思,例如[LOCAL.1]就是第一个局部变量,存放在栈里的[EBP-4]位置,[LOCAL.2]就是[EBP-8],图片上的命令其实就是MOV EAX, [EBP-4]。

方法一:可以在OD的选项->调试设置->分析里面有个选项把勾去掉设置

https://i-blog.csdnimg.cn/blog_migrate/6ffd1e4bbb520030a7fdca7c82c637c2.png#pic_center

方法二:选中该命令右键“汇编”即可,但修改后会显示灰色

https://i-blog.csdnimg.cn/blog_migrate/308e15c73e3b6373c02b2f0609f28e4c.png#pic_center


第五步,接着分析循环。

分析语句“mov eax, dword ptr ss:[ebp-0x4]”,首先将EBP-4赋值给EAX,而当前的EBP-4就是所获取的病毒的完整路径。**

  • mov eax, [local.1]
  • mov eax, dword ptr ss:[ebp-0x4]

https://i-blog.csdnimg.cn/blog_migrate/5f2e9eefc5f99aeff37cd0811561407f.png#pic_center

然后再按F8,这里是将EAX加上EBX再减1,其中EAX是病毒完整路径的首地址,EBX是20,它又是什么呢?

  • mov al, byte ptr ds:[eax+ebx-0x1]

我们查看EBX,如下图所示。凡是由Delphi编写的程序,它会在字符串减4的位置保存一个数值。这个数值就是字符串的长度,我们可以看到当前路径长度是0x20。

  • [eax+ebx-0x1]:计算字符串最后一个字母的位置,即“e”,下图中也显示出来了“ds:[02140127]=65(e)”

https://i-blog.csdnimg.cn/blog_migrate/ec9c0a7092bc8361abb0b1ea7e9381f4.png#pic_center


第六步,继续按F8执行,这里结合IDA分析分析0x5C、0x2F、0x3A对应的值。

我们在0x004056B4看到有一系列的比对,然后右键分别选中0x5C、0x2F、0x3A,解析成对应的值,或者选中按下R键。

https://i-blog.csdnimg.cn/blog_migrate/ccff118927f9ea48be06501d499763e1.png#pic_center

5C代表斜杠(\),2F代表反斜杠(/),3A代表冒号(:)。

https://i-blog.csdnimg.cn/blog_migrate/348e62841593d89a7bc78866fd1a14a9.png#pic_center

小结,该循环是将病毒所在完整的路径从后向前检索,直到遇到斜杠(\)、反斜杠(/)、冒号(:)结束。结合病毒来看,它找斜杠的位置,其实这段程序要么是想不包含病毒文件名的路径,要么想获取病毒的文件名(setup.exe)。

https://i-blog.csdnimg.cn/blog_migrate/ad0659cd776ef558aea743834d05d3ec.png#pic_center


第七步,在OD中继续按F8调试,注意观察数据窗口的变化。

发现该程序不断地从后往前获取路径信息,并进行对比。

https://i-blog.csdnimg.cn/blog_migrate/b2c0951282e4f4cbc6900721f9f98a99.png#pic_center

接着发现程序在调用完call函数之后,会出现一个新的字符串。事实上很明显,它是想获取去除病毒文件名后的路径。可见,程序将去除了文件名的路径拷贝到了之前申请的空间中,于是可以将sub_405684重命名。

  • 0x004056D8 call 0040412C

https://i-blog.csdnimg.cn/blog_migrate/65724c041e4f9f0784f58ace70f1cc72.png#pic_center

总结,重命名及对应功能如下:

  • sub_405684 -> GetFilePath
  • 功能:获取去除病毒文件名后的路径
  • IDA位置:0x0040805E

https://i-blog.csdnimg.cn/blog_migrate/759a774a78bf2652b1453b8976e8241e.png#pic_center


3.sub_403ED4子函数

第一步,继续在OD中往下分析代码,赋值语句。

返回的第一句代码是将我们之前所获取的不带文件名的地址赋值给EAX。

  • lea eax, dword ptr ss:[ebp-0x3B4]

https://i-blog.csdnimg.cn/blog_migrate/f002effd71b8d1736ea9a786ebe02239.png#pic_center

我们选中EAX在数据窗口中跟随,可以看到对应的值是“02140138”。

https://i-blog.csdnimg.cn/blog_migrate/f19efa7621c780a41ae3bee3b1e9b962.png#pic_center

对应的值如下图所示,即不带文件名的文件路径。现在EAX保存的就是这个地址。

https://i-blog.csdnimg.cn/blog_migrate/fa19667882b14e56e606d15aa82f7a50.png#pic_center


第二步,继续分析代码,接下来将“Desktop_.ini”赋值给EDX。注意,0x44表示为D(十进制68对应的ASCII码)。

  • mov edx, 0x40862C

https://i-blog.csdnimg.cn/blog_migrate/b9a2fed535ff0c6af8a37e5d0e27dadc.png#pic_center

第三步,通过IDA大致看看call函数00403ED4。

  • 0x0040806E call sub_403ED4

https://i-blog.csdnimg.cn/blog_migrate/77fbdbeed326a168171f9b63eb610f63.png#pic_center

但是通过这个很难分析出它的具体功能,我们不妨只关注它的两个参数。观察执行完该函数后的参数位置有什么变化。

第四步,我们留意着数据窗口,然后按F8执行。

可以看到刚才所获取的不带文件的路径名,在其后面增加了一个“Desktop_.ini”,从而组成了新的字符串。

https://i-blog.csdnimg.cn/blog_migrate/5c53ed3c0891f34ae89c3d6930e11669.png#pic_center

分析这里我们就知道sub_403ED4功能是将上面所获取的不带文件名的路径的地址赋值给eax,然后将字符串“Desktop_.ini”的地址赋给edx。

总结,重命名及对应功能如下:

  • sub_403ED4 -> StringCat
  • 功能:拼接字符串,包含“Desktop_.ini”后缀

https://i-blog.csdnimg.cn/blog_migrate/a2d15c8bfa691056920f96ae6f095783.png#pic_center

同样,我们可以进入sub_403ED4进行详细分析。

https://i-blog.csdnimg.cn/blog_migrate/cc21aab6ebe61c1b22d20a3a2cc96493.png#pic_center


4.sub_4057A4子函数

接着继续分析sub_4057A4子函数功能。

  • 0x00408079 call sub_4057A4

https://i-blog.csdnimg.cn/blog_migrate/111a5c87d0402546c6b1d7bbaf0566f0.png#pic_center

第一步,我们在OD中查看EAX的地址。

在这里我们跟踪查看这个地址,选中堆栈数值,右键“数据窗口中跟随数值”。

https://i-blog.csdnimg.cn/blog_migrate/5ab3d52311de716380110ada657dfc54.png#pic_center

可以看到,它的这个参数是我们之前已经连接好的字符串的首地址。

  • 0x020F0138

https://i-blog.csdnimg.cn/blog_migrate/7e18be68edd344ad6195e4d644547129.png#pic_center


第二步,按下F8运行至Call 4057A4函数,再按F7进入该函数分析。

https://i-blog.csdnimg.cn/blog_migrate/af117ad3f655de8229c4d3bf3af2a65e.png#pic_center

继续按下F7进入call 0040573C,发现有个FindFirstFileA函数,我们直接来看看它的参数。注意,很多时候右边注释内容是没有的,需要我们手动分析。

https://i-blog.csdnimg.cn/blog_migrate/1c12f2ea51eaa879b8d24b580843f92a.png#pic_center

按下F8执行到函数调用前位置,可以看到EAX中存放是的是刚才连接出来的字符串。该函数的作用就是说明要查找当前目录下Desktop_.ini文件是否存在。

  • C:\Users\14551\Desktop\Desktop_.ini

https://i-blog.csdnimg.cn/blog_migrate/c12aa8f05d50e3030b7ec44415f8272f.png#pic_center

总结,重命名及对应功能如下:

  • sub_4057A4 -> CheckFileExist
  • 功能:检测文件“Desktop_.ini”是否存在

https://i-blog.csdnimg.cn/blog_migrate/cd7678b2b58d536908416254f2d5fe4d.png#pic_center


5.分析sub_4057A4后续删除功能

接着我们继续分析,由于之前进行了重命名操作,所以代码的可读性更好了,从0x00408079位置下面的代码我们都能看懂。

  • 0x0040807E test al, al
  • 0x00408086 push 80h
  • 0x 004080C5 call SetFileAttributesA

它会根据上一段代码的查找结果进行判定al,即如果当前目录下Desktop_.ini文件存在,那么就会调用SetFileAttributesA函数。该函数会改变他的属性,将它的属性改为80h所代表的值,即该文件的文件属性调整为NORMAL(正常属性)。

https://i-blog.csdnimg.cn/blog_migrate/a402c4d5460e0bc72d166a4848cbc7d7.png#pic_center

继续往下看, 调用了一个Sleep函数停止1毫秒。停止1毫秒之后,它接着调用DeleteFileA函数将Desktop_.ini删除。正常来讲,病毒还没有运行的时候,这个Desktop_.ini文件应当是不存在的;如果存在的话,病毒首先会改变这个文件的属性,再将这个病毒给删除掉。

  • push 1
  • call Sleep
  • call DeleteFileA

https://i-blog.csdnimg.cn/blog_migrate/61220f8f00d63aea2bd12ae663aee422.png#pic_center

这里看到一个未知函数sub_4040CC,它的参数是[ebp+var_3C4],事实上3C4就是文件的路径。将文件路径赋值给EAX,我们进入sub_4040CC函数。发现其功能:

  • 验证EAX是否存在,即判定文件的路径是否为空

如果文件不存在它会直接执行loc_408110位置的函数,sub_4040CC其实就是一个验证机制,在IDA中按下ESC返回,我们给它进行重命名。

https://i-blog.csdnimg.cn/blog_migrate/329023fd84745d4213ef381157cda2af.png#pic_center

总结,重命名及对应功能如下:

  • sub_4040CC -> CheckPathIsExist
  • 功能:检测文件的路径是否存在

https://i-blog.csdnimg.cn/blog_migrate/41ece8b347ca1a375599361f8f318e5d.png#pic_center


6.sub_4078E0子函数

继续往下分析,我们看到sub_4078E0函数。

  • 0x00408126 call sub_4078E0

https://i-blog.csdnimg.cn/blog_migrate/65f7c73e47fccf965cbfa0f5aa3c45db.png#pic_center

第一步,我们在IDA中大致看下函数的内容。

我们可以看到这个函数非常的长,且也调用了很多其它的函数,那么看上去很难分析清楚这个函数到底是做什么的。这里我们先不管其具体的实现细节,只看看该函数执行完后,这些参数或寄存器位置发生了什么变化,主要关注该函数执行前后,程序使用了哪些寄存器。

https://i-blog.csdnimg.cn/blog_migrate/b5e4d3246513bcab8d74f2e13d0473da.png#pic_center

第二步,打开OD跳转到40811D位置,按下F2增加断点,再按F9执行过来。

注意,病毒逆向分析就是调用IDA和OD反复调试的过程。

https://i-blog.csdnimg.cn/blog_migrate/3a8c17fcb1b7f20b62fc8ab9563ae789.png#pic_center

第三步,在OD中分析具体代码。

  • mov eax, dword ptr ss:[ebp-0x3CC]
  • lea edx, dword ptr ss:[ebp-0x4]
  • call 004078E0

首先它是将EBP-3CC赋值给EAX,再将EBP-4赋值给EDX,调用call函数。

https://i-blog.csdnimg.cn/blog_migrate/45269b29b6e9583c718dc4dc092dafc3.png#pic_center

我们现在按F8来步过这个call函数,再观察数据窗口中存在什么变化。可以看到执行完call函数后,这个函数用了很大一片区域写入了非常多看似无意义的字符,结合右边的ASCII码,可以将这些内容理解为暴力P解的字典。

  • 病毒的编写者企图利用暴力P解的方式来攻破计算机中某些验证机制

https://i-blog.csdnimg.cn/blog_migrate/20127fe9d5e8fda81d1a1bc933fe73e0.png#pic_center

当然这些内容还是非常多的,病毒作者也写入了很多其他信息,有兴趣的作者可以好好分析下。这些信息有助于我们获取病毒的行为信息,只有当我们深入分析其原理和实现过程,才有助于我们获取病毒的行为信息。

https://i-blog.csdnimg.cn/blog_migrate/97b1923786b8fe4a13bc9eb7ce5c1dbd.png#pic_center

https://i-blog.csdnimg.cn/blog_migrate/cbce5bc6106afd025134e61cb98357d4.png#pic_center

总结,重命名及对应功能如下:

  • sub_4078E0 -> WriteVirusInfoToMem
  • 功能:写入病毒信息到内存中,病毒作者企图利用暴力P解的方式,来攻破计算机中的某些验证机制

https://i-blog.csdnimg.cn/blog_migrate/a841f95152851ed119abf728c64fde4b.png#pic_center


7.sub_403C44子函数

继续在OD中分析sub_403C44子函数。

第一步,查看[EBP-8]地址对应的值。

在数据窗口中,可以看到eax的值为ebp+var_8的地址,通过OD可以知道,这个地址中保存的是0,可以理解为没有数据。

  • 00 00 00 00

https://i-blog.csdnimg.cn/blog_migrate/f3704545e45f0f77dce195afd0b79ced.png#pic_center

第二步,我们按下F7进入这个call,查看具体内容。

  • 0x0040812E call 00403C44

https://i-blog.csdnimg.cn/blog_migrate/f1355d2692746b089dcffdb5539ee478.png#pic_center

可以看到,它首先是将EAX的内容赋值给EDX,我们按下F8可以看到EDX也变成了0值。

  • mov edx, dword ptr ds:[eax]

https://i-blog.csdnimg.cn/blog_migrate/9ed143d4de4606ee871dc9e8f708a2a5.png#pic_center

之后的test运算,使得ZF变为1,满足跳转条件,直接跳转至retn,那么本段函数也就结束了。

https://i-blog.csdnimg.cn/blog_migrate/79aa0e2dbb2f17811b428cc043ad6880.png#pic_center

刚才我们通过test edx, edx发现ZeroFlag标志位变成了1。这个标志位变为1,说明这个值是一个0,这段函数似乎并没有实现什么特别清晰具体的功能,那么不妨将这个操作理解为某种标志的设置。

https://i-blog.csdnimg.cn/blog_migrate/389871655940ae169e3af491d40c40f3.png#pic_center

总结,重命名及对应功能如下:

  • sub_403C44 -> SetZeroFlag
  • 功能:设置零标志位重设,将其设置为0

https://i-blog.csdnimg.cn/blog_migrate/fd8051add96de69df33aa89d1fbf6090.png#pic_center


8.sub_403ECC子函数

回到OD,我们分析sub_403ECC子函数。

第一步,查看并分析[EBP-4]保存的内容。

  • mov eax, dword ptr ss:[ebp-0x4]

https://i-blog.csdnimg.cn/blog_migrate/9c8f45747a91f7e4cd92716fd5b98c42.png#pic_center

在数据窗口中跟随,可以看到“MZP”,这里大致是保存了一个PE文件,事实上就是将这个PE文件的首地址赋值给这个EAX,接着看看这个call。

https://i-blog.csdnimg.cn/blog_migrate/83ec40eff6599a3ffa5242fe141b5421.png#pic_center

第二步,分析call 403ECC函数。

按下F7进入这个call函数,首先调用“TEST EAX, EAX”验证PE文件是否存在。

https://i-blog.csdnimg.cn/blog_migrate/d0c9f43ce0607d89bfb402a23cb9a49a.png#pic_center

按下F8继续,这里是跳转不成立,然后出现在EAX-4位置,我们在数据窗口中跟随内容。

  • mov eax, dword ptr ds:[eax-0x4]

小技巧

这里需要特别强调的是,由于本病毒程序是使用Delphi编写的,因此字符串的首地址减去4后,所取出的4个字节的内容就是此字符串的长度。

换句话说,这段代码中的[eax-4]就是eax所指向的文件长度,字符串长度就是EC00,这条语句就是将EC00保存在寄存器里面。于是可以将sub_403ECC重命名。

  • 字符串长度:EC00
  • 现在EAX保存的就是字符串的长度,即PE文件的长度

https://i-blog.csdnimg.cn/blog_migrate/fcb6e4f03440636eb702a3181f2e9bc6.png#pic_center

https://i-blog.csdnimg.cn/blog_migrate/6f1aa53e2725f892f1d17515c221a581.png#pic_center

总结,重命名及对应功能如下:

  • sub_403ECC -> GetFileLen
  • 功能:获取PE文件的长度

之前这个文件的长度是保存在EAX里面,这里又将文件长度赋值给EBX。

https://i-blog.csdnimg.cn/blog_migrate/9cbf09a2a892e3a058190d57b527877e.png#pic_center

接下来,在获取文件长度后,程序会跳转到loc_408163处执行。首先它会验证EBX是否为零(文件长度是否为0),正常来说文件长度是不为0的,也就是这个文件是真实存在的,所以接下来的跳转不成立,会继续往下执行。

  • test ebx, ebx
  • jle short loc_408171
  • mov eax, [ebp+var_4]

https://i-blog.csdnimg.cn/blog_migrate/046c185a515391774cac536457b72d93.png#pic_center

接着我们尝试用OD进行分析,跳转到0x00408163的位置。按下F2增加断点,再按F9让它执行过来。

https://i-blog.csdnimg.cn/blog_migrate/9021064521d701fe7840372f54214353.png#pic_center

按F8跳转不成立继续执行,可以看到将[EBP-4]赋值给EAX,事实上就是让EAX重新指向这个PE文件的起始位置。

  • mov eax, dword ptr ss:[ebp-0x4]

https://i-blog.csdnimg.cn/blog_migrate/da10e37e7d279c055fca726a9efc115d.png#pic_center

按下F8继续执行,这里是将 [EAX+EBX-1],由于EAX指向的是文件起始地址,而EBX是文件的长度,减一是获取整个PE文件最后一个字符它是什么。事实上,CMP语句就是验证这个文件最后一个数据它是否为零,如果为0,则接下来的跳转不成立。

  • cmp byte ptr [eax+ebx-0x1], 0x0

https://i-blog.csdnimg.cn/blog_migrate/c1aa79af991166deb5fb01cf028d69d0.png#pic_center

经过OD的动态分析发现,因为这里显示跳转未实现,故文件尾端的值为0,所以不执行跳转,继续向下执行。

https://i-blog.csdnimg.cn/blog_migrate/3c2a97a039272766112d438cff6db453.png#pic_center


三.总结

写到这里,该部分关于sub_408024核心函数的部分功能就介绍完毕,请大家一定要动手跟着调试,先感受下这部分的实验,后面的文章我们将继续分析熊猫烧香病毒感染的过程。

https://i-blog.csdnimg.cn/blog_migrate/fdc516e35cf30a1d8cad5c4b7ccead51.png#pic_center

再次感谢姜晔老师,经过这篇文章的讨论,我们详细调试了病毒的各个模块。当然,整个病毒的所有功能都没时间完全概述,文章更多是提供一种恶意样本分析的方法和思路,带领大家入门,正如姜老师所说“只要各位读者勤于动手,并将所讲的逆向分析的基本原理搞清楚,那么这个病毒分析根本不在话下”。

最后简单总结这篇文章的逆向过程,主要分析sub_408024核心函数。

  • 0x0040804D call sub_40277C

    – 重命名为:GetFilePathAndName

    – 功能:获取文件的完整路径及文件名称

  • 0x0040805E call sub_405684

    – 重命名为:GetFilePath

    – 功能:获取去除病毒文件名后的路径

    – IDA位置:0x0040805E

    – 技巧:循环将病毒的完整路径从后往前检索,直到遇到斜杠(\)、反斜杠(/)、冒号(:)结束,从而提取病毒的路径或病毒的文件名(如setup.exe)

  • 0x0040806E call sub_403ED4

    – 重命名:StringCat

    – 功能:拼接字符串,包含“Desktop_.ini”后缀

  • 0x00408079 call sub_4057A4

    – CheckFileExist

    – 功能:检测文件“Desktop_.ini”是否存在

  • 0x00408105 call sub_4040CC

    – CheckPathIsExist

    – 功能:检测文件的路径是否存在

  • 0x00408126 call sub_4078E0

    – WriteVirusInfoToMem

    – 功能:写入病毒信息到内存中,病毒作者企图利用暴力P解的方式,来攻破计算机中的某些验证机制

  • 0x0040812E call sub_403C44

    – SetZeroFlag

    – 功能:设置零标志位,将其设置为0

  • 0x00408136 call sub_403ECC

    – GetFileLen

    – 功能:获取PE文件的长度

  • CMP语句就是验证PE文件最后一个数据是否为零

再给出这张图,希望加深大家对熊猫烧香的了解。这系列文章写得不容易,您的点赞、评论、收藏将是对我最大的支持,感恩安全路上一路前行,如果有写得不好或侵权的地方,可以联系我删除。基础性文章,希望对您有所帮助,作者目的是与安全人共同进步,加油~

https://i-blog.csdnimg.cn/blog_migrate/b66dded551c40e5b2e64aa16faad8f50.png#pic_center


学安全一年,认识了很多安全大佬和朋友,希望大家一起进步。这篇文章中如果存在一些不足,还请海涵。作者作为网络安全和系统安全初学者的慢慢成长路吧!希望未来能更透彻撰写相关文章。同时非常感谢参考文献中的安全大佬们的文章分享,深知自己很菜,得努力前行。编程没有捷径,逆向也没有捷径,它们都是搬砖活,少琢磨技巧,干就对了。什么时候你把攻击对手按在地上摩擦,你就赢了,也会慢慢形成了自己的安全经验和技巧。加油吧,少年希望这个路线对你有所帮助,共勉。

2020年8月18新开的“娜璋AI安全之家”,主要围绕Python大数据分析、网络空间安全、人工智能、Web渗透及攻防技术进行讲解,同时分享CCF、SCI、南核北核论文的算法实现。娜璋之家会更加系统,并重构作者的所有文章,从零讲解Python和安全,写了近十年文章,真心想把自己所学所感所做分享出来,还请各位多多指教,真诚邀请您的关注!谢谢。

https://i-blog.csdnimg.cn/blog_migrate/0fc98760b03e4a9516d1722c19061a92.png

(By:Eastmount 2020-12-19 星期六 下午6点写于武汉 )


参考文献:

姜晔老师真的非常佩服和值得去学习,包括他苏宁到卡巴斯基的故事,推荐大家去阅读。也希望自己和大家的技术能不断提升,加油!

[1]

[2]

[3]

[4]

[5]

[6]

[7]

[8]

[9]