熊猫烧香_汇编级_超详细分析

1.样本概况

1.1 应用程序信息

文件: C:\Windows\System32\drivers\spo0lsv.exe

大小: 30001 bytes

修改时间: 2007年1月17日, 12:18:40

MD5: 512301C535C88255C9A252FDF70B7A03

SHA1: CA3A1070CFF311C0BA40AB60A8FE3266CFEFE870

CRC32: E334747C

简单功能介绍:

\1. 自启动

\2. 删除gho文件

\3. 全盘感染指定类型文件

\4. 局域网传播

\5. 从网络下载其他恶意文件执行

\6. 删除安全管理软件服务、启动项

\7. 其他

说明: 该样本是熊猫烧香的一个变种spo0lsv.exe,高危险级别

1.2 分析环境及工具

系统环境:windows 7 32bit

工具:火绒剑、PcHunter、IDA、OllyDebug

1.3 分析目标

使用火绒剑进行行为分析,结果如下:

\1. 文件操作

图 1 - 1

分析:在各敏感路径创建了spo0lsv.exe、setup.exe、autorun.inf、Desktop_.ini等文件并写入了内容。其作用暂时不明,待后面具体分析。

\2. 注册表操作

图 1 - 2

分析:注册表操作很多,能只管看出的是在启动项下创建了新的键值,以及设置了隐藏属性。

\3. 网络操作

图 1 - 3

分析:网络操作也有很多,能看到尝试连接了很多当前局域网内的其他主机,并连接了一些网站

\4. 进程操作

图 1 - 4

分析:主要操作重复关闭开启了spo0lsv.exe

\5. 执行监控

图 1 - 5

分析:执行了很多次命令,包含删除C盘网络共享等

\6. 其他行为

图 1 - 6

分析:提取了文件于C:Windows\System32\drivers\spo0lsv.exe,在不同文件夹创建了很多Desktop_.ini文件,等等。

2.具体分析过程

2.1 主函数

图 2 - 1

分析:前面使用了“xboy”、“whboy”来进行解密,并进行比对,比对成功就开始逐个调用sub_40819c、sub_40d18c、sub_40d088三个函数,接下来我们详细分析这三个函数

2.2 分析sub_40819c

2.2.1 检测Desktop_.ini文件

图 2 - 2

分析(序号对应图片里的标号):

\1. 获取当前文件的绝对路径(包含当前文件名)

\2. 根据当前获得的文件路径(包含当前文件名)文件名称提取文件所在目录

\3. 拼接文件路径:当前文件所在目录 + “Desktop_.ini”

\4. 检测拼接的文件是否存在

2.2.2 存在Desktop_.ini文件则删除

图 2 - 3

分析:(前面还有文件属性的设置等小细节)

\1. 再次组合目标文件Desktop_.ini的路径

\2. 删除文件

2.2.3 读取当前文件检测是否是被感染者

图 2 - 4

分析:

\1. 读取指定文件(当前文件)

\2. 获取长度

\3. 判断文件长度是否小于等于0

\4. 判断末尾是否是‘\0’即空字符

\5. 如果不是空字符,就往前拷贝一个字节(ebx是下标)

\6. 判断用来存储末尾字符串的是否为空,标识是病毒还是被感染者

注:

读取文件内容的函数分析如图 2-5所示:

图 2 - 5

2.2.4 若当前文件是病毒

分为两种情况:

情况1:当前是非System32\drivers中的病毒,分析如下图

图 2 - 6

分析:

1. 打开spo0lsv.exe句柄并结束进程

2. 组合system32路径 + “drivers\” + “spo0lsv.exe”作为新文件路径

3. 调用CopyFileA()复制当前文件到新拼接的文件名中

4. 执行新拷贝的system32\drivers\spo0lsv.exe文件,并结束自身进程,非system32\drivers文件夹下的spo0lsv.exe到此执行完毕,程序结束

注:

终止进程的代码分析如图 2-7所示:

图 2 - 7

情况2:当前是System32\drivers 中的病毒

不做其他操作,当前部分结束

2.2.5 若当前文件是被感染者

\1. 删除末尾标识字符串

图 2 - 8

\2. 提取感染标识字符串中的信息

图 2 - 9

分析:

\1. 删除“whboy”字符串,提取带有双.exe后缀的原文件名称

\2. 提取原文件大小

\3. 提取并创建宿主PE文件

图 2 - 10

分析:

\1. 以Rewrite()创建并打开一个新文件,或覆盖已存在的文件

\2. 根据长度信息,从已读数据中提取原PE文件的数据

\3. 刷新写入缓冲区到外部文件,确保前面的操作写入成功

\4. 创建并执行批处理文件

批处理文件,创建在User\AppData\Local\Temp文件夹中,名称是一个随机数+“$$.bat”

批处理程序样本如下:

图 2 - 11

分析:

循环等待删除成功,因为程序正在运行,所以一开始删除失败;将新创建的程序重命名为单.exe后缀;最后删除bat文件自生。

\5. 遍历进程,查看spo0lsv.exe是否在运行

图 2 - 12

分析:

\1. 创建进程快照

\2. 获取第一个进程信息

\3. 比较进程名时候是“spo0lsv.exe”

\4. 获取下一个进程信息

注:

当遍历到“spo0lsv.exe”的时候就停止遍历,并返回状态码1,代表正在运行。

\6. 如果没有运行就删除然后重新创建并写入新病毒程序

图 2 - 13

分析:

\1. 设置源文件为普通文件

\2. 拼接文件路径

\3. 删除System32\drivers\spo0lsv.exe文件

图 2 - 14

分析:

\1. 提取病毒文件内容,前面还有几句,由于屏幕限制没有截完全,有兴趣的可以根据地址查找

\2. 拼接文件路径System32\drivers\spo0lsv.exe

\3. 将本文件提取出的病毒块写入System32\drivers\spo0lsv.exe文件,并执行

2.3 分析sub_40d18c

点击进入该函数后又出现了3个函数:sub_40A5B0、sub_40C374、sub_40BACC,接下来分别对其进行详细的分析。

2.3.1 分析 sub_40A5B0 感染

一个开启线程的函数,线程回调函数是sub_40A48c。主要作用是创建、维护每个文件夹下面的Desktop.ini文件以及感染指定类型的文件,以及删除gho文件。

点击进入该线程回调函数展开分析:

\1. 遍历盘符,存储存在的盘符

图 2 - 15

分析:

\1. 使用一个个字母 + “:\”组合成根路径使用GetDriveTypeA()获取盘的类型

\2. 将固定硬盘、网络盘的盘符存储起来

\3. 控制是26次循环,对应26个字母

\2. 排除A、B盘符,对其他盘符拼接“:\”作为参数,调用sub_0x409348,进行全盘遍历感染

对sub_0x409348进行分析:

a) 进行文件遍历,并判断文件是否是文件夹以及文件名是否是’.’

图 2 - 16

分析:

\1. 获取第一个文件

\2. 判断文件的类型是否是文件夹以及文件名是否是“.”

b) 如果是文件夹

首先排除系统相关的文件夹,比如下图中的WINDOWS、WINNT、SYSTEM32等等文件夹。

图 2 - 17

然后检查当前文件夹是否Desktop_.ini文件

图 2 - 18

如果已经存在Desktop_.ini文件就检查内容,是否是最新的,如果不是就更新。

如果不存在Desktop_.ini文件就创建并写入当前的日期:

图 2 - 19

分析:

\1. 组合文件全路径(文件目录+文件名)

\2. 获取本地时间,并准换成Long型

\3. 再次拼接路径

\4. 把文件路径和日期作为参数传入ShowSQLWindow()函数,创建文件并写入内容(日期)

注:

ShowSQLWindow()其显示是一个库函数,但是查不到,就点进去分析了一下,是使用CreateFile()和WriteFile()两个函数创建文件和写入文件。

c) 如果不是文件夹

- 判断是否是gho文件,如果是就删除

- 判断是否是setup.exe\NTDETECT.COM文件,如果是就跳过

由于刚才这几部很简单就不用贴代码赘述了,接下来是感染文件,感染的类型有exe、rsc、htm、html、asp、aspx、php等,我们详细分析其中的感染EXE文件 sub_407F00:

First. 遍历进程,观察当前exe是否在运行

图 2 - 20

Second. 排除自身

图 2 - 21

Third. 读取文件内容

图 2 - 22

Fourth. 观察特诊“whboy”确定是否被感染

图 2 - 23

Fifth. 如果未被感染,开始感染序幕(把自己拷贝一份过去)

图 2 - 24

Sixth. 追加原PE + 感染标识字符串

图 2 - 25

分析:

\1. 生成标识字符串”whboy”+程序名.exe+\2+长度+\1

\2. 以追加的方式打开文件

\3. 把源文件内容追加到病毒文件末尾

\4. 把感染标识字符串吹加到文件末尾

\5. 关闭文件

d) 其他文件的感染就不一一赘述了

2.3.2 分析 sub_40C374 维护

点击进去可以发现这是一个定时器,定时器回调函数sub_40BE7C,然后再深入这个定时器函数里面,你会发现逻辑非常简单,就是创建\维护setup.exe、autorun.inf两个文件。

详细分析如下:

\1. 遍历盘符(前面分析过此处略过)

\2. 排除A、B盘循环检测每个盘下是否有setup.exe

图 2 - 26

\3. Setup.exe不存在就创建,如果存在就检查是否被修改,若被修改就删除当前setup.exe创建新的。

这里分析较为复杂的已存在情况:

图 2 - 27

分析:

\1. 删除已存在文件

\2. 拼接新文件名

\3. CopyFileA()复制当前文件到新文件

\4. 判断autorun.inf存在与否,存在或不存在的情况和setup.exe的处理方法一致。

图 2 - 28

图 2 - 29

分析:

\1. 删除已存在的autorun.inf

\2. 创建文件autorun.inf

\3. 写入autorun.inf脚本内容

\4. 关闭文件

注:

这里的autorun.inf脚本内容如下,功能就是启动setup.exe病毒

图 2 - 30

2.3.3 分析 sub_40BACC 局域网传播

细心地点发现这个函数传入了一个参数0Ah,是用来标识将要创建线程个数的,这个函数功能是创建10个子线程来尝试使用弱口令连接当前局域网中的其他主机。

里面首先线程回调函数是sub_40BA8C,点进去是loc_40B864,接下来我们详细分析loc_40B864函数。

\1. 首先循环获取当前网络状态

图 2 - 31

分析:

调用InternetGetConnectedState()函数获取当前的网络是否有连接

\2. 生成随机当前网络IP

分析:

这里的sub_40B520(我取得别名randomLocAreaNetIP)值得重点分析,主要功能是根据当前的IP生成一个当前网络中的随机IP,分析如下图:

a) 首先调用了sub_40A734,主要功能是调用GetHostName()获取当前主机名,再调用GetHostByName()根据主机名获取IP

图 2 - 32

分析:

\1. 调用WSADtartup()初始化网络环境

\2. 调用gethostname()获取主机名,再调用gethostbyname()根据前面的主机名获取IP地址

\3. 调用inet_ntoa()把网络序二进制IP转换成点分十进制的IP地址

\4. 清理关闭网络环境

b) 提取IP的每个部分

分析:

\1. 获取IP的总长度

\2. 根据 ‘.’的位置,提取IP的第一部分,并转换成LONG整型,通过ebx+4以供后面调用

注:

这里我只描述了IP的第一个部分的提取,第二、三部分的提取都一样就不一一赘述了。

c) 随机生成主机ID号

分析;

生成一个0~255的随机数作为主机ID

d) 组合一个当前局域网的IP

分析:

结合的IP个前三部分加上后面随机生成的主机ID,组合拼装出新的IP

\3. 尝试连接随机IP的139端口、445端口

图 2 - 33

分析:

连接139端口,connect()返回值0代表成功。

图 2 - 34

分析:

连接445端口,connect()返回0代表成功。

a) 如果端口连接成功,调用sub_40B40c,这是局域网传播的核心部分,分析sub_40B40c如下

i. 获取系统版本信息

图 2 - 35

分析:

调用GetVersionExA()函数获取系统信息。DetectIsWin32_是重命名的函数名,原是sub_40A7F4里面就是调用GetVersionExA()很简单,就是判断是否是win32平台,是就返回-1,不是就返回0。

ii. 尝试进行弱口令连接

图 2 - 36

分析:

\1. 使用弱口令进行网络资源连接

\2. 连接成功调用sub_40A928,复制当前病毒文件到网络共享文件夹

\3. 关闭网络资源连接

- 分析sub_40A928

n 共享文件夹下复制病毒名为GameSetup.exe

图 2 - 37

分析:

\1. 生成当前共享的是否是目录

\2. 如果是目录则拼接该目录下GameSetup.exe的全路径

\3. 拷贝病毒数据自身于该文件夹下的GameSetup.exe

n 如果有admin$共享就遍历感染全盘

分析:

  1. 判断是否有admin$ 共享
  2. 拼接网络资源路径
  3. 开始全盘遍历感染(此函数我们前面分析过,这里就略过了)

2.4 分析sub_40d088

6个定时器,主要功能是使用注册表启动项、隐藏属性、QQ代理下载恶意程序并运行、连接网站下载资源等,挨个分析定时器回调函数sub_40CEE4、sub_40D040、sub_40D048、sub_407430、sub_40CC4C、sub_40C728。

2.4.1 分析sub_40CEE4 提权、关闭窗口、关闭进程、自启动、隐藏属性

  1. 提权(具体代码在sub_406E2C中的线程回调函数sub_4061B8中的sub_406108)

分析:

  1. 获取当前的权限
  2. 修改(提升)当前的权限
  3. 遍历窗口,关闭防火墙、进程、VirusScan等窗口

分析:

  1. 遍历窗口
  2. 获取窗口名
  3. 比对是否是目标窗口名
  4. 如果是目标窗口名就发送12h –WM_QUIT消息然窗口退出

注:

比对了很多窗口,这里只列出了防火墙,其他都一样就不一一赘述了。

  1. 关闭任务栏窗口

分析:

  1. 通过类名找到任务窗口的窗口
  1. 关闭窗口名为” pjf(ustc)”的窗口

注:

可以发现还模仿了很多键盘事件来关闭

  1. 关闭进程

分析:

通过前面分析过的一个函数,打开很多指定进程名的句柄并调用TerminateProcess()来结束进程。

  1. 添加启动项、指定隐藏属性

分析:

直接调用两个简单的注册表操作函数,修改了注册表添加了病毒为自启动,隐藏属性打开。

2.4.2 分析 sub_40D040 QQ代理下载恶意程序并运行

分析sub_40CC34

这还是一个线程函数,回调函数为sub_40C9B0,分析sub_40C9B0函数

  1. 从指定网页上下载文件中的链接

分析:

  1. 解码指定的字符串得出相关链接
  2. 使用QQ代理下载该链接中的内容并返回到eax内指针指向的缓冲区

注:

使用QQ代理的函数分析:

  • 设置QQ为代理程序

  • 通过代理下载、并将数据返回

分析:

  1. 创建下载句柄
  2. 读取刚才下载句柄中的数据
  3. 将数据通过eax返回
  4. 下载链接中的文件并执行

分析:

  1. 获取Windows目录的路径
  1. 获取链接中的文件名称
  1. 下载文件
  1. 拷贝下载的数据
  1. 拼接文件路径并执行

2.4.3 分析 sub_40D048 关闭C盘共享

该函数有开启了两个线程,线程回调函数分别是sub_40CC34、sub_40CDEC,sub_40CC34的主要功能是使用QQ代理下载一批链接,再这些链接指向的恶意软件到Windows文件夹下面运行起来。

  1. 分析 sub_40CC34 和前面的QQ代理下载一致就不再分析了略过
  1. 分析 sub_40CDEC 关闭C盘网络共享

分析:

  1. 遍历盘符
  1. a) "cmd.exe /c net share 盘符$ /del /y"

    b) "cmd.exe /c net share admin$ /del /y" 删除网络共享

2.4.4 分析 sub_407430 关闭安全相关

开启线程关闭安全相关的服务,线程回调函数是sub_406E44。

分析 sub_406E44函数:

分析:

很直白的调用函数关闭安全相关的服务、删除注册表键值等

2.4.5 分析 sub_40CC4C 使用QQ代理下载指定链接数据

前面分析过,此处略过

2.4.6 分析 sub_40C728 使用QQ代理下载恶意程序并执行

前面分析过,此处略过

3.总结

3.1 分析结果总览

3.2 本分析感悟总结

通过这次分析,让我第一次领略了一个完整病毒的所有构成,越分析越感觉到舒服,因为一层层的解开病毒的神秘面纱,都想写一个熊猫烧香变种的冲动。感谢给了这一周充足的时间,给我完整的分析。

原文地址:https://www.cnblogs.com/leibso-cy/p/11718184.html

时间: 2024-10-08 10:32:57

熊猫烧香_汇编级_超详细分析的相关文章

Centos6.5全程手动安装(小白级)超详细

Centos6.5手动环境安装步骤:备注:虚拟机模拟安装步骤 网络:172.16.100.1IP:172.16.100.65软件:VMware? Workstation 11.0.0 build-2305329ISO: CentOS-6.5-x86_64-bin-DVD1.iso 原文地址:http://blog.51cto.com/jameszhan/2308590

【caffe-windows】 caffe-master 之 classfication_demo.m 超详细分析

classification_demo.m 是个很好的学习资料,了解这个代码之后,就能在matlab里用训练好的model对输入图像进行分类了,而且我在里边还学到了oversample的实例,终于了解数据增强是个怎么回事. caffe-master\matlab\demo\classification_demo.m这个demo是针对  ImageNet图像分类的(1000个类), 主要是调用训练好model,对输入的图像进行分类,输出分类结果. 要想运行此demo,需要的东西有: 1. 模型描述

u-boot启动流程分析(2)_板级(board)部分

转自:http://www.wowotech.net/u-boot/boot_flow_2.html 目录: 1. 前言 2. Generic Board 3. _main 4. global data介绍以及背后的思考 5. 前置的板级初始化操作 6. u-boot的relocation 7. 后置的板级初始化操作 1. 前言 书接上文(u-boot启动流程分析(1)_平台相关部分),本文介绍u-boot启动流程中和具体版型(board)有关的部分,也即board_init_f/board_i

微机接口技术与汇编语言上机实验报告_汇编初步(intel8086)

实验环境:intel x386 一.要求:将3000H单元开始置数为00H-0FH SSTACK SEGMENT STACK DW 32 DUP(?) SSTACK ENDS CODE SEGMENT ASSUME CS:CODE, SS:SSTACK START: PUSH DS XOR AX, AX MOV DS, AX MOV SI, 3000H MOV CX, 16 AA1: MOV [SI], AL INC SI INC AL LOOP AA1 ;CX == 0? NEXT():AA1

Spring_MVC_教程_快速入门_深入分析

Spring MVC 教程,快速入门,深入分析 博客分类: SPRING Spring MVC 教程快速入门 资源下载: Spring_MVC_教程_快速入门_深入分析V1.1.pdf SpringMVC核心配置文件示例.rar 作者:赵磊 博客:http://elf8848.iteye.com 目录 一.前言 二.spring mvc 核心类与接口 三.spring mvc 核心流程图 四.spring mvc DispatcherServlet说明 五.spring mvc 父子上下文的说明

Android自定义相机超详细讲解

Android自定义相机超详细讲解 转载请标明出处: http://blog.csdn.net/vinicolor/article/details/49642861: 由于网上关于Android自定义相机的文章写得不是太详细,Google官方的文档又说得不太容易理解,所以今天我来详细讲解一下Android自定义相机. 这篇文章主要写给一些刚刚接触Android的那些看官方API困难以及不太了解Android机制的同学们,所以熟练开发者可以绕道了. 最近在使用Camera类的时候发现居然被弃用了,

机器学习_深度学习_入门经典(永久免费报名学习)

机器学习_深度学习_入门经典(博主永久免费教学视频系列) https://study.163.com/course/courseMain.htm?courseId=1006390023&share=2&shareId=400000000398149 作者座右铭---- 与其被人工智能代替,不如主动设计机器为我们服务. 长期以来机器学习很多教材描述晦涩难懂,大量专业术语和数学公式让学生望而止步.生活中机器学习就在我们身边,谷歌,百度,Facebook,今日头条都运用大量机器学习算法,实现智能

超强、超详细Redis数据库入门教程

这篇文章主要介绍了超强.超详细Redis入门教程,本文详细介绍了Redis数据库各个方面的知识,需要的朋友可以参考下 [本教程目录] 1.redis是什么2.redis的作者何许人也3.谁在使用redis4.学会安装redis5.学会启动redis6.使用redis客户端7.redis数据结构 – 简介8.redis数据结构 – strings9.redis数据结构 – lists10.redis数据结构 – 集合11.redis数据结构 – 有序集合12.redis数据结构 – 哈希13.聊聊

基本数据类型(字符串_数字_列表_元祖_字典_集合)

基本数据类型(字符串_数字_列表_元祖_字典_集合) 1.字符串 2.数字 除了布尔类型外,int.long.float和complex都可以使用的运算为:加.减.乘.除.整除.幂运算和取余 3.列表和元组 列表的内容可变,可以包含任意对象,使用中括号表示.元组的内容不可变,可以包含任意对象,使用圆括号表示.元组 1 l = [1, 2, 3, '4', '5'] # 列表 2 l = list((1, 2, 3, '4', '5')) 3 4 t = (1, 2, 3, '4', '5') #