aishamjad33-ux/Malware-Analysis
GitHub: aishamjad33-ux/Malware-Analysis
这是一个恶意软件分析的学习笔记和实验文档,专注于静态分析方法、IOC提取和加壳处理的教学与实践。
Stars: 0 | Forks: 0
# 🦠 恶意软件分析 — 学习笔记与实验文档




## 📑 目录
1. [什么是恶意软件?](#1-what-is-malware)
2. [恶意软件类型 — 病毒与蠕虫](#2-types-of-malware--virus-vs-worm)
3. [恶意软件分析概述](#3-malware-analysis-overview)
4. [哈希与文件完整性](#4-hashing--file-integrity)
5. [静态与动态分析](#5-static-vs-dynamic-analysis)
6. [静态恶意软件分析流程](#6-sequence-for-static-malware-analysis)
7. [实验:安全的恶意软件处理](#7-lab-safe-malware-handling)
8. [文件类型识别](#8-file-type-identification)
9. [字符串分析](#9-string-analysis)
10. [加壳与混淆](#10-packing--obfuscation)
11. [编码与加密](#11-encoding-vs-encryption)
12. [加壳与未加壳二进制分析](#12-packed-vs-unpacked-binary-analysis)
13. [无文件恶意软件](#13-fileless-malware)
14. [工具参考](#14-tools-reference)
## 1. 什么是恶意软件?
恶意软件(恶意软件)是指任何有意设计用于渗透、破坏系统或获取未授权访问权限的程序。它通过电子邮件附件、恶意下载、受感染的USB驱动器和软件供应链攻击传播。
恶意软件是一个**总括性术语**,涵盖许多不同的威胁类别——每个类别都有不同的感染机制、持久化方法和最终目标。
## 2. 恶意软件类型 — 病毒与蠕虫

上面的比较表详细列出了两种最基本且最容易混淆的恶意软件类型。查看**传播方式**这一行是关键区别——病毒需要人类手动执行受感染的文件才能激活,因此依赖于社会工程学或物理访问。而蠕虫则自主利用网络漏洞,扫描并感染其他系统,完全无需任何用户交互。
从蓝队(防御方)的角度来看,**检测**这一行同样重要。病毒极难检测,因为它们将自身嵌入到合法文件中——一个看起来干净的Word文档或PDF文件可能携带病毒负载。而蠕虫尽管破坏性更强,但实际上更容易被发现,因为其激进的网络扫描和复制行为会产生异常的流量模式,这些模式可以被SIEM工具和IDS系统立即标记出来。
**示例**这一行将其置于真实历史背景中——ILOVEYOU和Melissa是通过电子邮件附件传播的病毒,需要用户操作。WannaCry尽管在此被归类为蠕虫,但实际上是一种混合体——它将勒索软件与利用永恒之蓝漏洞的蠕虫传播机制相结合,使其能够在没有任何用户交互的情况下跨网络传播。

上图说明了整个恶意软件生态系统。每个类别代表一种不同的威胁概况:
| 类型 | 工作原理 | 主要目标 |
|------|----------|----------|
| **木马** | 伪装成合法软件 | 后门访问、数据窃取 |
| **Rootkit** | 深度嵌入操作系统内核 | 持久化隐藏的特权访问 |
| **间谍软件** | 在后台静默运行 | 监控键盘记录、窃取凭据 |
| **勒索软件** | 加密所有用户文件 | 金钱勒索 |
| **广告软件** | 向浏览器/应用注入广告 | 产生收入,常常是更恶劣恶意软件的投放器 |
| **犯罪软件** | 针对银行和金融系统 | 金融欺诈、凭据窃取 |
理解这些类别至关重要,因为每种类型都需要不同的检测方法、不同的取证方法和不同的事件响应程序。
## 3. 恶意软件分析概述

上面的幻灯片确立了恶意软件分析的三个核心目标,并介绍了威胁情报中最重要的概念之一——**入侵指标**。
查看IOC表格,每一行代表攻击的不同层面:
- **文件哈希**是最精确的IOC——所示的MD5哈希 (`5d41402abc...`) 唯一标识了一个确切版本的恶意文件。即使是一个字节的变化也会产生完全不同的哈希值,这使其成为威胁情报平台(如VirusTotal)上恶意软件识别的黄金标准。
- **网络流量IOC**揭示了恶意软件的命令与控制基础设施。去激活化的IP地址 `185.159.82[.]47`(括号防止意外解析)是从样本中提取的C2服务器地址。共享此信息可让其他组织阻止相同的基础设施。
- **注册表项**暴露了恶意软件如何实现持久化。所示的键 (`HKCU\Software\Microsoft\Windows\CurrentVersion\Run\badscript`) 是经典的Windows自启动位置——恶意软件写入此处以在重启后存活,而无需提升权限。
- **文件系统IOC**揭示了恶意软件的藏匿之处。`C:\Windows\Temp\scvhost.exe` 是对合法 `svchost.exe` 的故意拼写错误——这是一种常见的伪装技术,恶意软件将自己命名为与受信任的系统进程几乎相同,以避免随意检查。
### 核心目标
1. **理解行为与目的** — 恶意软件一旦执行会做什么?
2. **评估潜在损害** — 哪些数据、系统或网络面临风险?
3. **提取IOC** — 为SIEM、IDS和威胁情报平台构建检测签名
## 4. 哈希与文件完整性

上图演示了密码学哈希最关键的特性之一——**雪崩效应**。注意幻灯片底部的三个SHA-256哈希值。输入值 `hello`、`hell` 和 `hel` 每次只差一个字符,但产生的64个字符的哈希值却完全不同,它们之间没有任何可见的关联。
这一特性对恶意软件分析具有深远影响:
- **篡改检测** — 如果收到一个恶意软件样本,其哈希值与威胁源中已知的哈希值不匹配,则表明该文件已被修改。这可能意味着出现了新变种或样本已损坏。
- **唯一标识** — 每个唯一的恶意软件二进制文件都会产生一个唯一的哈希值。两个哈希值相同的文件在密码学上保证是完全相同的,这使得哈希成为最可靠的恶意软件指纹。
- **安全共享** — 与恶意软件本身不同,哈希可以公开共享而无任何风险。分析师经常在VirusTotal、MalwareBazaar和威胁情报源等平台上共享哈希值,以便其他组织检查是否遇到过相同的样本。
- **单向函数** — 哈希无法被逆向还原为原始文件,这意味着共享哈希永远不会暴露底层的恶意软件代码。
```
# 在Linux上生成文件哈希
md5sum suspicious.exe
sha256sum suspicious.exe
# 验证已知哈希
echo "known_hash suspicious.exe" | sha256sum --check
```
## 5. 静态与动态分析

上面的比较表代表了每个恶意软件分析师在接触样本之前必须理解的两种基本方法论。选择静态分析还是动态分析并非偏好问题——而是一个基于恶意软件如何隐藏自身的战略决策。
**静态分析**在不执行二进制文件的情况下对其进行检查。这使得它完全安全——恶意软件无法被引爆、传播或与其C2服务器通信。分析师可以提取字符串、检查PE头、计算熵值并识别可疑的导入函数,所有这些都没有任何感染风险。然而,这种方法有一个关键弱点:如果恶意软件被加壳或混淆,静态分析几乎无法揭示任何有用信息,因为真正的代码在运行时才会被隐藏。
**动态分析**通过实际上在受控沙箱或虚拟机中执行恶意软件并观察其真实行为(创建了哪些文件、修改了哪些注册表项、建立了哪些网络连接)来解决这个问题。这种方法甚至可以检测到完全未知的零日恶意软件,因为它监控的是行为而不是签名。但风险在于——如果沙箱配置错误或恶意软件检测到正在被分析,隔离可能会失败。
专业的工作流程总是**先静态,后动态**:
- 静态分析为您提供上下文和安全的初步分类
- 如果样本被加壳或具有规避性,先解壳然后重复静态分析
- 仅在需要观察真实行为时才转向动态分析
## 6. 静态恶意软件分析流程

上图所示的流程并非任意安排——每一步都直接建立在前一步的发现之上。跳过步骤会导致分析结果不完整或具有误导性。
| 步骤 | 操作 | 重要性 |
|------|------|--------|
| **1** | 构建隔离环境 | 防止恶意软件逃逸到宿主机或网络 |
| **2** | 安全处理恶意软件样本 | 防止在分析开始前意外执行 |
| **3** | 确定文件类型 | 揭示伪装技巧——切勿仅凭扩展名判断 |
| **4** | 指纹识别 | 对文件进行哈希处理以立即生成主要IOC |
| **5** | 搜索字符串 | 提取揭示意图、URL、API的可读文本 |
| **6** | 加壳与混淆 | 确定真正的代码是否被隐藏——在继续前进行解壳 |
从该流程中得到的一个关键见解:如果第6步显示文件被加壳,您必须返回并对**解壳后的版本**重复第4步和第5步。加壳二进制文件的哈希、字符串和导入函数毫无意义——它们属于壳程序存根,而非实际的恶意软件。
## 7. 实验:安全的恶意软件处理
### 步骤1 — 构建隔离环境
在接触任何恶意软件样本之前,必须彻底保护好分析环境。任何单一的配置错误都可能导致恶意软件逃逸到您的宿主机或在网络上扩散。
**VMware设置:**
- 禁用宿主机与客户机之间的共享文件夹——共享文件夹是恶意软件直接的逃逸路径
- 将网络适配器设置为**仅主机模式**或**隔离模式**——切断互联网访问,使恶意软件无法联系其C2服务器
- 在每次分析会话前创建干净的**快照**——便于在分析每个样本后立即恢复到干净状态
- 禁用剪贴板共享——防止恶意内容意外粘贴到宿主机
**禁用Windows Defender(仅在虚拟机内操作):**
- Windows设置 → 病毒和威胁防护 → 管理设置
- 禁用实时保护
- 添加或删除排除项 → 添加整个C:\驱动器
- 禁用Windows Defender防火墙
### 步骤2 — 安全处理样本
在接触恶意软件文件之前,必须将其“解除武装”以防止意外执行。双击一个重命名扩展名的文件不会执行它——Windows基于实际文件格式执行,但重命名消除了shell关联触发器的风险。
**方法A — 重命名扩展名:**
- malware.exe → malware.exe.malz
- malware.exe → malware.txt
**方法B — 密码保护的压缩包:**
- 使用密码将文件压缩打包:**infected**
### 步骤3 — 将样本传输到虚拟机的方法
| 方法 | 步骤 | 风险等级 |
|------|------|----------|
| **Web WhatsApp** | 在虚拟机内打开 web.whatsapp.com,将文件发送给自己 | 低 |
| **USB驱动器** | 通过USB传输,传输后立即断开连接 | 中 |
## 8. 文件类型识别
在安全处理样本之后,识别文件的真实类型是分析的第一步。恶意软件分析的黄金法则是:**切勿相信文件扩展名**。恶意软件作者经常将可执行文件重命名为无害的扩展名,如 `.pdf`、`.jpg` 或 `.txt`,以绕过随意检查并诱骗用户执行它们。
操作系统根据文件的内部结构(而非扩展名)来决定如何处理文件。这意味着一个名为 `invoice.pdf` 但实际上是一个EXE的文件,如果被双击,将作为EXE执行——`.pdf`扩展名纯粹是装饰性的。
### 文件类型识别工具
| 工具 | 类型 | 用途 |
|------|------|------|
| **HxD** | GUI — 十六进制编辑器 | 手动检查原始字节并验证魔术数字 |
| **PEstudio** | GUI | 一体化PE分析——哈希、熵、导入函数、字符串 |
| **CFF Explorer** | GUI | 深入的PE头检查和节区分析 |
| **TrID** | GUI / CLI / 在线 | 通过将二进制签名与包含13,000多种定义的数据库匹配来识别文件类型 |
### 魔术数字 — 真实依据
每种文件格式都以一个称为**魔术数字**的唯一字节序列开头。与扩展名不同,魔术数字无法通过重命名来伪造——它们嵌入在文件的二进制内容中,并揭示真实的格式,无论文件叫什么名字。
| 文件类型 | 魔术字节(十六进制) | ASCII表示 |
|----------|----------------------|-----------|
| EXE / DLL | `4D 5A` | `MZ` |
| ZIP | `50 4B 03 04` | `PK..` |
| PNG | `89 50 4E 47` | `.PNG` |
| PDF | `25 50 44 46` | `%PDF` |
### 实验:样本1 — EXE文件分析

此截图显示了使用多个工具同时分析同一个文件——这是一种专业的、可以交叉验证发现的方法。左上角的TrID以48.8%的置信度将该文件识别为Win32可执行文件(MS Visual C++通用),这是编译后的C++二进制文件的预期结果。48.8%的置信度并不表示不确定性——它反映了多个EXE子类型匹配,但都指向相同的核心格式。
左下角的PEstudio揭示了两个关键信息:熵值为**6.243**,文件类型为`executable, 32-bit, console`。6.243的熵值处于正常范围的上限——未被加壳,但表明二进制文件包含一些压缩资源。右侧HxD视图中偏移量`0x00000000`处可见的`MZ`魔术字节(`4D 5A`)明确确认这是一个PE可执行文件,无论扩展名如何被操纵。
PEstudio中显示的SHA-256哈希值(`49710C529A02DE0BEB...`)成为该样本的主要IOC——这是分析师记录并在VirusTotal上查询的第一件事。
### 实验:样本2 — 纯PNG图像

此截图演示了即使对于看似无害的文件进行验证的重要性。TrID返回了**100% PNG**的清晰识别,VirusTotal显示**0/61个引擎**将此文件标记为恶意——确认它是一个合法的图像,没有嵌入恶意内容。
右侧的HxD视图在字节级别确认了这一点——文件以`89 50 4E 47 0D 0A 1A 0A`开头,这是标准的PNG魔术数字序列。PEstudio显示熵为**7.960**,乍一看似乎令人担忧,因为接近8.0的值通常表示加密或加壳。然而,对于PNG文件来说,这是完全正常的——PNG使用无损压缩,自然产生高熵。这是一个关键教训:**熵必须始终在文件类型的上下文中解释**,而不是孤立地看待。
### 实验:样本3 — 通过多种工具识别的EXE

此样本显示了通过TrID、CFF Explorer、PEstudio和HxD同时分析同一个文件的结果。TrID再次返回48.8%的Win32可执行文件置信度——与样本1相同,确认两者是用相同的工具链编译的。右上角的CFF Explorer揭示了PE文件头特征面板,其中**“File is executable”**(文件是可执行文件)被勾选,确认这是一个可运行的EXE,而不是DLL。
熵值**6.243**与样本1完全匹配——表明这两个样本可能是从相同源代码编译的相关变种。这种跨样本关联是恶意软件聚类中的标准技术,分析师通过共享的编译产物、导入哈希或熵特征对相关样本进行分组。
### 实验:样本4 — DLL文件

此截图揭示了一个DLL文件——在PEstudio中可立即识别,文件类型显示为`dynamic-link-library, 32-bit, GUI`。与EXE样本的关键区别在于右上角的CFF Explorer特征面板:**“File is a DLL”**(文件是DLL)被勾选,而**“File is executable”**(文件是可执行文件)未被勾选。
TrID仍然返回Win32可执行文件匹配,因为DLL和EXE共享PE文件格式——区别是在PE头级别做出的,而不是在魔术数字级别。两者都以`MZ`字节开头。分析师遇到DLL时必须立即问:是哪个EXE加载了这个DLL,它提供了什么功能?恶意软件作者通常使用DLL将功能分散到多个文件中,使分析更加复杂,检测更加困难。
## 9. 字符串分析
字符串分析是静态恶意软件分析中最强大且最安全的技术之一。在执行可疑文件之前,提取并检查其嵌入的字符串可以揭示恶意软件的全部意图——它针对什么、如何通信、投放什么内容以及如何实现持久化——而没有任何引爆的风险。
二进制分析中的**字符串**是指嵌入在二进制文件中的任何可打印ASCII或Unicode字符序列。它们的存在是因为恶意软件像任何软件一样,包含硬编码值——文件路径、注册表项、URL、API名称、错误消息和配置数据——这些必须以可读文本的形式存储在二进制文件的某处。
### 字符串能揭示什么
| 类别 | 示例 | 分析意义 |
|------|------|----------|
| **Windows API调用** | `CreateRemoteThread`, `WriteProcessMemory` | 揭示能力——注入、键盘记录、持久化 |
| **网络指标** | URL、IP地址、C2域名 | 识别命令与控制基础设施 |
| **文件系统路径** | `C:\Windows\Temp\`, `%APPDATA%` | 显示恶意软件投放或隐藏文件的位置 |
| **注册表项** | `HKCU\...\Run\` | 揭示持久化机制 |
| **Tor地址** | `.onion` URL | 表示匿名C2——勒索软件中常见 |
| **勒索信** | 硬编码的受害者信息 | 确认勒索软件分类 |
| **混淆信号** | Base64数据块、XOR编码数据 | 表明恶意软件正在积极隐藏其字符串 |
### 字符串分析工具
| 工具 | 类型 | 主要优势 |
|------|------|----------|
| **strings** | CLI | 快速、轻量,适用于任何二进制文件 |
| **FLOSS** | CLI | 解码被`strings`遗漏的混淆、堆叠和XOR编码的字符串 |
| **BinText | GUI | 显示字符串的文件位置和内存地址,便于交叉引用 |
| **PEstudio** | GUI | 自动用红色标记可疑字符串 |
| **Hybrid Analysis** | 在线 | 完整沙箱——字符串加上实时行为分析 |
### 实验:使用strings CLI

此截图显示了Sysinternals的`strings.exe`工具对`Rams1.exe.txt`进行分析——注意`.txt`扩展名表明样本在分析前已被安全解除武装。输出结果立即暴露了深埋在二进制文件中的可读内容,没有任何执行风险。
输出中的几条条目对训练有素的分析师来说立即具有重要意义。`SHA256`、`get_UTF8`、`RijndaelManaged`和`CryptoStreamMode`字符串的存在表明该二进制文件使用了**.NET加密库**——这是勒索软件的一个强烈早期迹象,因为勒索软件必须使用健壮的算法来加密文件。字符串`Form1`和`Rams1.Properties.Resources`确认这是一个**.NET Windows窗体应用程序**,这大大缩小了分析范围。二进制文件中嵌入的哈希值`66840DDA154E8A113C31DD0AD32F7F3A366A80E8136979D8F5A101D3D29D6F72`尤其可疑——恶意软件有时会硬编码目标文件或其自身组件的哈希值用于完整性验证。

进一步滚动字符串输出揭示了最确凿的证据——**Tor .onion地址**和一个硬编码的勒索消息。字符串`http://alt356.onion/keys/save.php`和`http://bercerramsh.onion/2834-234323-23490-54665`无疑是Tor隐藏服务URL。勒索软件使用Tor进行C2通信,因为它使攻击者的基础设施匿名化,使得取缔和归因变得极其困难。
勒索信字符串`"Your files have been encryted with Rams1, your id number is"`(注意拼写错误“encryted”——在非英语母语者编写的恶意软件中很常见)加上`\Desktop\ReadmeForDecryption.txt`,确认这是勒索软件,它会在受害者的桌面上投放一个解密说明文件。底部的字符集字符串代表用于生成特定受害者解密密钥的加密密钥字符池。
分析至此,即使没有执行一条指令,我们已经确认:**这是通过Tor通信、加密文件并要求支付赎金进行解密的勒索软件**。
### 实验:使用BinText

与CLI方法相比,BinText提供了更结构化的字符串提取视图——显示每个字符串及其**文件位置偏移量**和**内存地址**,这对于在深入分析时与反汇编器交叉引用至关重要。该工具从此样本中提取了203个ANSI字符串和39个Unicode字符串。
此截图中可见的字符串加强了勒索软件的分类——Tor .onion URL `http://alt356.onion/keys/save.php` 再次出现,同时还有勒索信文本和目标文件扩展名(`.docx`、`.pptx`、`.xlsx`、`.aspx`、`.html`)。针对Office文档、电子表格和Web文件表明,这种勒索软件旨在最大限度地破坏商业环境中最关键的文件类型。
### 实验:使用FLOSS

FLOSS(FireEye Labs Obfuscated String Solver)远远超出了标准字符串提取的范围。`strings`提取的只是二进制文件中已经存在的可打印字符序列,而FLOSS会主动分析代码以识别和解码**堆叠字符串**——那些在运行时逐字符构造的字符串,专门用于规避静态字符串提取。
此截图显示FLOSS对同一个`Rams1.exe`样本进行操作。`FLOSS STATIC STRINGS: UTF-16LE (67)`标题确认它找到了67个Unicode字符串,包括Tor地址和勒索信文本。顶部的XML清单内容(`
标签:DAST, DNS 反向解析, IOC提取, meg, 二进制分析, 云安全监控, 云安全运维, 云资产清单, 信息安全, 加密, 哈希, 威胁分析, 字符串分析, 学习笔记, 实验文档, 恶意软件分析, 恶意软件处理, 恶意软件类型, 打包分析, 文件完整性, 文件类型识别, 无文件恶意软件, 混淆分析, 漏洞扫描器, 病毒, 编码, 网络安全, 自动化侦查工具, 蠕虫, 逆向工程, 隐私保护, 静态分析, 静态恶意软件分析