熊猫烧香(下)核心函数部分分析

举报
拈花倾城 发表于 2022/01/14 13:37:18 2022/01/14
【摘要】 熊猫烧香(下)核心函数部分分析

@TOC

1、loc_408171

第一步 打开IDA Pro和OD载入病毒样本

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qJrakqb5-1614761352934)(C:\Users\lenovo\AppData\Roaming\Typora\typora-user-images\image-20210303103719136.png)]

打开OD转到00408171 按下F2增加断点,运行到这个地方
在这里插入图片描述

思考:OD重新打开断点为什么还保留着?
在OllyDbg中,它会把所有与程序后模块相关的信息保存在单独的文件中,以便在模块重新加载时继续使用。这些信息包括标签、注释、断点、监视、分析数据、条件等。

在这里插入图片描述

第二步,在OD中分析0x00408171位置。
首先是一个CMP比较操作(Compare),接着查看EBP-0x8的内容。

  • 0x00408171 cmp dword ptr ss:[ebp-0x8], 0x0
    在这里插入图片描述

我们可以看到它内容是0,它的比较对象也是0

第三步,分析JNZ跳转指令。
接着按下F8,可以看到比较后,ZF变成了1。由于二者都为0,所以在比较过后ZF=1,那么接下来的跳转并不执行,继续执行下面的内容。

JNZ 0x004082F0
JNZ(jump if not zero)结果不为零则转移,即z=1时跳转,但是z=1时,zf=0。故JNZ跳转的条件也是零标志位zf=0,由于指令执行的结果为0,此时的ZF值为1,故不执行跳转

CF(进位标志)=1:算术操作最高位产生了进位或借位,=0 最高位无进位或借位 ;
PF(奇偶标志)=1:数据最低8位中1的个数为偶数, =0 数据最低8位中1的个数为奇数;
AF(辅助进位标志)=1:D3→D4位产生了进位或借位, =0 D3→D4位无进位或借位;
ZF(零标志)=1:操作结果为0, =0 结果不为0;
SF(符号标志)=1:结果最高位为1,=0 结果最高位为0;
OF(溢出标志)=1:此次运算发生了溢出, =0 无溢出。

在这里插入图片描述

第四步,分析函数sub_40532C。
在IDA中继续查看代码内容。

在这里插入图片描述

C:\Users\14551\Desktop\setup.exe
在这里插入图片描述

接下来将EDP-0x3D4赋值给EDX,F8执行并在数据窗口中跟随,发现它此时还是空值。

在这里插入图片描述

进入函数

在这里插入图片描述

发现该函数的主要功能是API函数CharUpperBuffA。

  • CharUpperBuffA函数作用:把缓冲区中指定数目的字符转换成大写字母

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

  • sub_40532C -> CharToUpper
  • 功能:缓冲区中指定数目的字符转换成大写字母

在这里插入图片描述

第五步,分析函数sub_4054BC。
在IDA中双击查看该函数的内容。可以发现它主要是调用了GetSystemDirectory函数,从而获取系统的路径。
在这里插入图片描述

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

  • sub_4054BC -> GetSystemDir
  • 功能:获取系统路径
    在这里插入图片描述

2、sub_403F8C子函数

在这里插入图片描述

第一步,我们让OD跳转到0x004081AB的位置。
直接按F8执行下来,在这里可以看到PUSH是将刚才利用GetSystemDirectory函数所获取的系统路径字符串进行压栈。

压栈内容为system32这个目录。

  • C:\Windows\system32
    在这里插入图片描述

第二步,按下F8继续分析,发现它又将drivers压栈,将spoclsv.exe字符串压榨。

  • drivers
  • spoclsv.exe
    在这里插入图片描述

注意,上图仅显示了setup.00408658,没有将具体的值显示出来。

思考:OD中如何查看堆栈中的值?
选中ESP堆栈指针寄存器(主要用于存放堆栈内存储单元的偏移量),在“堆栈窗口中跟随”。然后依次选择值“0x00408644”和“0x00408658”,右键在“数据窗口中跟随”,即可查看堆栈中的值。

在这里插入图片描述

发现对应的值为“drivers”和“spoclsv.exe”,如下图所示。
在这里插入图片描述

写到这里,我们可以推测:下面这个函数的功能是将压入堆栈的字符串进行拼接,成为一个新的路径。

第三步,按下F8执行到这个Call函数进行分析。
按下F8执行过来后,选中EAX在数据窗口中跟随。

EAX是累加器(accumulator),它是很多加法乘法指令的缺省寄存器。
EBX是基地址(base)寄存器, 在内存寻址时存放基地址。
ECX是计数器(counter),是重复(REP)前缀指令和LOOP指令的内定计数器。
EDX则总是被用来放整数除法产生的余数。

在这里插入图片描述

在数据窗口中右键“转到”->“表达式”,然后输入值:

  • 01C67E28

在这里插入图片描述

接着再CALL函数处按下F8,我们需要关注数据窗口中的前后变化情况。我们可以看到它新生成了一个路径字符串。

  • C:\Windows\system32\drivers\spoclsv.exe

在这里插入图片描述

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

  • sub_403F8C -> TwoStringCat
  • 功能:将两个字符串进行连接
    在这里插入图片描述

3、sub_4060D4子函数

事实上,这段程序的功能如下:

  • 首先通过这个函数将字符串连接;
  • 再将路径字符串转换为大写字母;
  • 然后将这个字符串与这里进行对比。

在这里插入图片描述

第一步,我们通过OD来分析下比较功能,在OD中执行到4081E3位置,然后按F9执行过去。

  • 0x004081E3 call sub_404018
    在这里插入图片描述

第二步,分析sub_404018函数。
我们在这里看下它比对的是什么字符串,在数据窗口中跟随值,可以看到两个字符串分别是拼接的字符串和当前OD分析程序的字符串。

C:\USERS\14551\DESKTOP\SETUP.EXE
C:\WINDOWS\SYSTEM32\DRIVERS\SPOCLSV.EXE

很明显,我们分析的熊猫烧香病毒程序在桌面上,而比对的是DRIVERS路径下。

在这里插入图片描述

sub_404018函数的目的是分析当前这个程序是不是drivers目录下的这个程序,如果是的话执行一段代码,否则执行另一段代码。

在这里插入图片描述

因为目前不是在drivers路径下,因此它执行另一段代码,我们按下F8继续执行。JE跳转不成立,继续出现一个新的CALL。

  • 0x004081F3 CALL setup.004060D4

第三步,sub_4060D4函数的参数分析。
该函数存在一个参数存在EAX中,通过数据窗口跟随发现值为:

  • spoclsv.exe
    在这里插入图片描述

我们回到IDA查看该函数的基本组成,双击进入sub_4060D4函数。可以看到这个函数非常长,并且内部包括很多CALL函数,如果说一个个CALL分析,会发现它调用了很多的API函数。通过分析归纳该函数的作用如下:

查找当前内存中指定的进程,即查找当前是否有spoclsv.exe这个进程

在这里插入图片描述

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

  • sub_4060D4 -> SearchAndTerminateProcess
  • 功能:查找当前内存中的指定进程,若存在,则将其终止

在这里插入图片描述

4、CopyFile和WinExe子函数

在CopyFile函数位置我们停下来分析。

  • 0x004082A6 call CopyFileA

在这里插入图片描述

第一步,我们将OD跳转到文件名0x0040828C的位置,按下F2增加断点。

  • 0x0040828C push eax

程序执行过来后,在这里我们跟踪下这个EAX地址。这里可以看到想要拷贝的地址就是刚才我们所连接成的字符串地址。

  • C:\Windows\system32\drivers\spoclsv.exe

那么,它所拷贝的内容是什么呢?

在这里插入图片描述

第二步,继续分析拷贝文件的内容。
按下F8执行到0x004082A5位置,可以看到它是将当前这个病毒文件复制到drivers目录下,通过CopyFile来实现。

事实上,它是将我们的当前文件改为spoclsv.exe之后,再复制到drivers目录中。

在这里插入图片描述

第三步,我们继续往下分析,看到一个WinExec函数。

在这里插入图片描述

通过OD来到4082E3位置,我们看看这个参数来判断它想执行什么程序。
在这里插入图片描述
第四步,按下F2增加断点,然后F9执行过来,并在数据窗口中跟随EAX值。
可以看到,它实际想执行的就是这个spoclsv.exe程序。也就是说,它在把当前这个病毒样本复制到drivers目录之后,那么这句代码就是将它执行起来。再往下ExitProcess是结束当前正在运行的进程,即熊猫烧香的病毒样本。

在这里插入图片描述
注意,当病毒本体将自身复制到“drivers”中并改名后,这里就是对改了名字的病毒程序执行运行的操作,然后主体程序就退出了。如果想继续用OD进行动态分析,要么载入“spoclsv.exe”,要么对之前的一处条件跳转进行修改,令程序以为自己就是“spoclsv.exe”。

第五步,回到跳转位置0x004081E8,对其进行分析。
在这里插入图片描述

在OD中跳转到该位置,然后按下F2下一个断点,并执行到断点处。

  • 0x0040818 JE 004082F0
    在这里插入图片描述

正常来说,由于我们当前所分析的程序并不是drivers目录下的那个病毒样本,因此这个跳转是不成立的。这里为了使其成立,可以将JZ修改为JNZ,但是这改变了病毒程序。最好的办法是改变ZF标志位,将原来的0改为1就可以了。

第六步,双击ZF标志位,它会变成1。
双击后可以看到提示“跳转已实现”,现在这个病毒就以为自己是spoclsv.exe。

在这里插入图片描述

第七步,按下F8执行到4082F0位置

真正实现病毒功能的也就是“spoclsv.exe”这个程序。
希望大家可以有所收获!!!

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。