模块13:恶意软件分析入门
学习目标:掌握静态/动态分析技术、理解检测机制、学习逆向工程基础
所需工具:file, strings, xxd, objdump, readelf, strace, ltrace, androguard, radare2, apktool
目录
一、红队为什么需要恶意软件分析
1.1 理解检测机制,改进免杀技术
杀毒软件和EDR使用多种技术检测恶意软件:
flowchart TD subgraph 检测层["EDR/AV检测层次"] L1["静态签名匹配 - 字节特征码"] --> L2["行为检测 - 运行时行为模式"] L2 --> L3["启发式分析 - 可疑特征检测"] L3 --> L4["沙箱分析 - 虚拟环境观察"] end subgraph 红队应对["红队免杀思路"] R1["代码混淆和加密"] R2["Shellcode编码分段加载"] R3["反射加载技术(无文件落地)"] R4["进程注入(隐藏在可信进程中)"] R5["API Unhooking(恢复被Hook函数)"] R6["Syscall直接调用(绕过用户态Hook)"] end 检测层 -.->|对抗| 红队应对
1.2 分析对手工具,学习攻击技术
通过分析APT组织使用的恶意软件样本,可以学习到:
- 高级持久化技术(WMI事件订阅、计划任务隐藏等)
- 命令与控制(C2)通信协议设计
- 内网横向移动手段
- 权限维持方法
- 数据窃取和渗出技术
常用恶意软件分析平台:
- VX Underground:大量恶意样本集合
- MalwareBazaar:恶意样本分享平台
- abuse.ch:威胁情报和样本库
- VirusTotal:文件分析(注意:上传样本会被分享)
1.3 逆向工程能力
恶意软件分析本质上是逆向工程的子集。通过分析恶意样本,红队成员可以培养:
- 理解二进制程序的执行流程
- 识别代码中的恶意逻辑
- 提取配置信息(C2地址、加密密钥等)
- 编写检测规则(YARA规则)
- 开发防御和检测方案
二、静态分析基础
2.1 file — 文件类型识别
file是静态分析的第一步,用来确定样本的基本属性。
file malware.exe
file suspicious.dll
file unknown_sample.bin输出示例解析:
PE32 executable (GUI) Intel 80386, for MS Windows— 32位PE文件ELF 64-bit LSB executable, x86-64— 64位Linux可执行文件PE32+ executable (DLL) x86-64, for MS Windows— 64位DLL
高级用法:
file -b sample.bin # 简短输出(不显示文件名)
file -i sample.bin # MIME类型输出
file --mime-type sample.bin # 仅输出MIME类型文件类型判断的价值:
- PE文件 → 需要Windows分析环境
- ELF文件 → 可能是Linux恶意软件
- 伪装的扩展名(.jpg.exe) → 明显可疑行为
2.2 strings — 字符串提取
Strings提取二进制文件中的可打印字符串,是最简单但最有效的静态分析方法之一。
strings malware.exe
strings -n 6 malware.exe # 最小字符串长度6
strings -n 8 malware.exe # 最小字符串长度8(减少噪音)
strings -e l malware.exe # 16位编码实用搜索模式:
# 查找硬编码的IP地址
strings malware.exe | grep -E "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"
# 查找HTTP/HTTPS URL
strings malware.exe | grep -i "http"
# 查找域名
strings malware.exe | grep -iE "\.(com|net|org|cn|ru|top|xyz)"
# 查找文件路径
strings malware.exe | grep -iE "/|\\\\"
# 查找注册表路径
strings malware.exe | grep -iE "HKEY_|SOFTWARE\\\\"
# 查找API函数名(Windows)
strings malware.exe | grep -iE "(CreateFile|WriteFile|RegSet|WinExec|VirtualAlloc|CreateRemoteThread)"
# 查找Linux可疑字符串
strings malware.elf | grep -iE "(/bin/sh|/bin/bash|exec|socket|bind|connect)"
# 查找编码/加密相关字符串
strings malware.exe | grep -iE "(base64|xor|aes|rc4|decrypt|encrypt|key)"高级流程:
- 先用较小最小长度(-n 4)获取所有字符串
- 保存到文件便于搜索:
strings -a malware.exe > strings.txt - 按类别分类搜索(IP、URL、路径、命令等)
- 注意伪装的合法字符串
- 关注字符串在文件中的位置
2.3 hexdump/xxd — 十六进制查看
xxd malware.exe | less # 分页查看
xxd -l 256 malware.exe # 只显示前256字节
xxd -s 1024 -l 256 malware.exe # 跳过前1024字节
xxd -g 1 malware.exe # 每列1字节
hexdump -C malware.exe | less # 规范格式(带ASCII)
hexdump -C -n 512 malware.exe # 只显示前512字节在十六进制查看时关注:
| 特征 | 含义 |
|---|---|
| 4D 5A (MZ) | PE文件 |
| 7F 45 4C 46 (.ELF) | ELF文件 |
| 89 50 4E 47 | PNG文件 |
| 50 4B | ZIP文件 |
| 文件扩展名与Magic Bytes不符 | 伪装文件 |
| 大段连续的明文 | 配置信息未加密 |
| 内嵌的MZ/PE签名 | 嵌入的可执行文件 |
2.4 PE/ELF文件结构分析
flowchart TD subgraph PE["PE文件结构"] P1["DOS Header (MZ)"] --> P2["PE Signature (PE\\0\\0)"] P2 --> P3["COFF File Header"] P3 --> P4["Optional Header"] P4 --> P5["Section Table"] P5 --> P6[".text 代码节"] P5 --> P7[".data 数据节"] P5 --> P8[".rsrc 资源节"] P5 --> P9[".rdata 只读数据"] end
使用objdump分析PE文件:
objdump -f malware.exe # 文件头
objdump -p malware.exe # PE头
objdump -h malware.exe # 所有节信息
objdump -d malware.exe | head -100 # 反汇编入口点
objdump -p malware.exe | grep -i "dll" # DLL依赖使用readelf分析ELF文件:
readelf -h malware.elf # ELF头
readelf -S malware.elf # 节头表
readelf -l malware.elf # 程序头表(段)
readelf -d malware.elf # 动态段
readelf -s malware.elf # 符号表
readelf -r malware.elf # 重定位表
readelf -a malware.elf # 所有头信息2.5 PE分析重点关注
- 编译时间戳(TimeDateStamp):判断样本的新旧
- 节名称异常:如名为.textbss的可执行节
- 节权限异常:如.data节有可执行权限
- 导入函数:网络通信(WinSock)、进程操作(CreateProcess)、文件操作(WriteFile)、注册表操作(RegSetValue)
- 资源段(.rsrc):可能包含嵌入的PE文件或配置
三、动态分析基础
3.1 strace — 系统调用追踪
strace ./malware.elf
strace -f ./malware.elf # 追踪子进程
strace -p <PID> # 附加到运行中进程
strace -o output.txt ./program # 输出到文件
strace -e trace=open,read,write ./program # 只追踪特定调用常用过滤选项:
strace -e trace=file ./program # 文件操作
strace -e trace=network ./program # 网络操作
strace -e trace=process ./program # 进程管理
strace -e trace=memory ./program # 内存映射分析strace输出时关注:
open()— 程序打开的文件socket()/connect()— 网络连接(C2通信)execve()— 执行的命令mmap()— 内存映射(可能用于代码注入)ptrace()— 调试器检测unlink()— 文件删除(痕迹清理)
3.2 ltrace — 库函数调用追踪
ltrace ./program
ltrace -f ./program # 追踪子进程
ltrace -p <PID> # 附加到进程
ltrace -o output.txt ./program # 输出到文件
ltrace -e printf+strcpy ./program # 只追踪特定函数重点关注:
system()/popen()— 执行系统命令dlopen()/dlsym()— 动态加载库strcpy()/strcat()— 可能存在溢出风险memcpy()— 内存复制(可能复制shellcode)
3.3 沙箱分析
常用在线沙箱:
| 平台 | 特点 |
|---|---|
| ANY.RUN | 交互式Windows沙箱、实时进程行为、MITRE ATT&CK映射 |
| Joe Sandbox | 企业级、多平台支持、YARA规则生成 |
| Hybrid Analysis | 免费多引擎、与VirusTotal集成 |
| Triage | 社区友好、直观行为时间线 |
沙箱检测绕过技术(红队视角):
- 检测虚拟机环境(VMware/VirtualBox痕迹)
- 检测沙箱进程(sandboxie、vmtoolsd)
- 延迟执行(Sleep/Ping时间超过沙箱超时)
- 用户交互检测(鼠标移动、按键)
- 特定时间/日期触发
四、Androguard APK分析
4.1 安装与基本使用
sudo pacman -S androguard # ArchStrike安装
# 分析APK文件
androguard analyze target_app.apk
# 查看签名信息
androguard sign target_app.apk4.2 Python接口分析
from androguard.core.bytecodes.apk import APK
apk = APK("target_app.apk")
print("Package:", apk.get_package())
print("App Name:", apk.get_app_name())
print("Permissions:", apk.get_permissions())
print("Activities:", apk.get_activities())
print("Services:", apk.get_services())
print("Receivers:", apk.get_receivers())
print("Debug:", apk.is_debuggable())4.3 检查可疑权限
危险权限列表:
RECORD_AUDIO— 录音CAMERA— 拍照READ_SMS/SEND_SMS— 短信READ_CONTACTS— 读取联系人ACCESS_FINE_LOCATION— GPS定位SYSTEM_ALERT_WINDOW— 悬浮窗(可用于钓鱼)REQUEST_INSTALL_PACKAGES— 安装应用
4.4 使用apktool配合分析
sudo pacman -S apktool # ArchStrike安装
# 解包APK
apktool d target_app.apk -o output_dir/
# 分析清单文件
cat output_dir/AndroidManifest.xml | grep -iE "permission|activity|service|receiver"解包后的目录结构:
output_dir/
├── AndroidManifest.xml # 反编译后的清单
├── apktool.yml # 元数据
├── res/ # 资源文件
├── smali/ # Smali反汇编代码
└── lib/ # 原生库(.so)
五、综合实践
5.1 分析一个ELF后门程序
Step 1: 初始信息收集
file unknown_sample.bin
stat unknown_sample.bin
ls -la unknown_sample.binStep 2: 计算哈希值
md5sum unknown_sample.bin
sha1sum unknown_sample.bin
sha256sum unknown_sample.binStep 3: 提取和分析字符串
strings -n 6 unknown_sample.bin > strings_output.txt
grep -iE "http|https" strings_output.txt
grep -iE "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" strings_output.txt
grep -iE "/bin/sh|/bin/bash|system|exec" strings_output.txt
grep -iE "socket|bind|listen|accept|connect" strings_output.txtStep 4: ELF结构分析
readelf -h unknown_sample.bin # 头信息
readelf -l unknown_sample.bin # 段信息
readelf -d unknown_sample.bin # 动态段
readelf -s unknown_sample.bin # 符号表Step 5: 静态代码分析
objdump -d unknown_sample.bin | head -200
objdump -d unknown_sample.bin | grep -E "call.*@plt"
# 重点关注PLT中的函数:
# socket/connect/send/recv → 网络通信
# dup2 → 重定向标准I/O(后门特征)
# execve/system → 执行命令Step 6: 动态分析(隔离环境!)
strace -f -o strace.log timeout 5 ./unknown_sample.bin
ltrace -f -o ltrace.log timeout 5 ./unknown_sample.bin
# 监控网络连接(另一终端)
watch -n 1 "netstat -antp | grep unknown_sample"Step 7: Radare2深度分析
sudo pacman -S radare2
r2 unknown_sample.bin
[0x00400000]> aaa # 自动分析
[0x00400000]> afl # 列出所有函数
[0x00400000]> s main # 跳转到main函数
[0x00400000]> pdf # 反汇编当前函数
[0x00400000]> iz # 列出字符串
[0x00400000]> ii # 列出导入
[0x00400000]> VV # 可视化模式Step 8: 编写分析报告
报告结构:
- 基本信息(文件名、哈希值、文件类型)
- 静态分析发现(关键字符串、可疑导入函数、文件结构异常)
- 动态分析发现(系统调用行为、网络连接、文件操作)
- 功能判定(恶意功能描述、C2通信方式和地址)
- 威胁指标(IOC)(文件哈希、网络地址、文件路径)
- 建议的处置措施
六、安全注意事项
6.1 恶意软件分析安全准则
- 永远在隔离环境中分析:使用专用虚拟机或沙箱、禁用网络连接
- 处理好样本文件:使用加密压缩包存储(密码:infected)、样本文件名改为hash值
- 虚拟机配置:独立虚拟网卡(Host-Only)、安装必要分析工具、关闭自动更新
6.2 绝不要做的事
- 在生产环境中运行恶意软件
- 在没有隔离的环境下解压样本
- 将样本上传到公共沙箱(除非确定可以分享)
- 直接双击运行样本文件
6.3 法律和道德准则
- 仅在合法授权的情况下分析恶意软件
- 分析结果仅用于防御和改进安全防护
- 不利用分析结果开发恶意软件
- 负责任地披露发现的漏洞
相关模块:YARA规则