关于 analyzing-binaries
面向安全分析人员的二进制逆向技能,涵盖初步筛查、静态与动态分析及基于证据的调查,适用于研究未知程序、固件组件和闭源目标中的漏洞。
主要功能
- 01二进制初步筛查与格式识别
- 02使用反汇编器进行静态分析
- 03动态跟踪与调试
- 04固件分析与模拟流程
- 05识别并应对反分析技术
适用场景
- 01调查未知可执行文件
- 02还原协议或文件格式
- 03检查固件中的原生组件
- 04查找闭源二进制中的缺陷
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ trilwu/ secskills --skill analyzing-binaries安装后在 Claude Code 中输入/analyzing-binaries确认已加载。
详细介绍
分析二进制文件
逆向工程就是针对无法读取的程序进行假设检验。这项工作的成本主要取决于你要查看多少代码,因此整个过程都围绕着缩小范围展开:先做初步筛查,找出最值得关注的少数部分,再仔细阅读。
适用场景
- 了解未知或缺少文档的可执行文件的功能
- 从二进制文件中还原算法、文件格式或线路协议
- 在闭源目标中定位漏洞
- 分析嵌入式和 IoT 设备的固件
- 解决 CTF 逆向题
不适用场景
- 意图引爆的实时恶意软件——使用
analyzing-malware,其中介绍了隔离和安全引爆。需要反汇编时再回来使用本指南。 - 没有文件头的原始 shellcode 二进制块(与位置无关的载荷、stager、egg-hunter)——使用
analyzing-shellcode - 有源代码——使用
auditing-code-for-vulnerabilities - 整体评估 Android/iOS 应用——使用
testing-mobile-applications;对于其中的原生.so/Mach-O 组件,使用本指南 - 框架运行时,而非普通二进制文件——工具链具有特异性,通用逆向工程无法胜任:对于
libapp.so/Dart 快照,使用reversing-flutter-apps;对于libil2cpp.so和global-metadata.dat,使用reversing-unity-il2cpp;对于 Hermes 字节码,使用reversing-react-native-apps - 具有自身符号还原机制的语言运行时——
analyzing-go-binaries(剥离后仍会保留pclntab)、analyzing-rust-binaries(panic 字符串会泄露源代码路径)、analyzing-dotnet-assemblies(IL 可反编译为 C#)。对这些目标使用通用逆向工程会浪费大部分精力 - 经过加壳或保护的可执行文件——先使用
unpacking-protected-binaries;转储之前没有内容可供反汇编 - 需要先提取整个固件映像才能开始逆向工程——使用
analyzing-firmware-images运行binwalk、提取文件系统并进行跨架构仿真;之后再回来分析其中的单个二进制文件
先做初步筛查——切勿一上来就打开反汇编器
在这里花的每一分钟,都能省下反编译时的一小时。
file target && du -h target
# Architecture, endianness, PIE, stripped or not — all decide your tooling
readelf -hSd target # ELF: headers, sections, dynamic deps
rabin2 -I target # radare2's normalized summary of any format
objdump -p target # PE/ELF imports and load config
# Protections tell you what the author expected
checksec --file=target # NX, canary, RELRO, PIE, Fortify
# Strings, but read them for structure rather than skimming
strings -n 8 -t x target | less # ASCII with offsets
strings -e l -n 8 target # UTF-16LE, essential on Windows
反汇编前,初步筛查应回答以下问题:
| 问题 | 线索 |
|---|---|
| 这是用什么语言或工具链构建的? | Rust/Go 运行时字符串、libstdc++、__gxx_personality、MSVC RTTI |
| 文件是否加壳? | 高熵、导入表很小、节名称为 UPX、.themida |
| 文件会与什么通信? | 导入 socket/HTTP API、嵌入的 URL、证书二进制块 |
| 有趣的逻辑在哪里? | 导入加密、文件、注册表、进程相关的 API |
| 符号是否已剥离? | nm -D 输出为空、没有 .symtab |
# Entropy scan finds packed or embedded-blob regions
binwalk -E target
# Unpack the common case
upx -d target -o target.unpacked
Go 和 Rust 二进制文件通常不会以影响分析的方式剥离符号。开始其他工作之前,先还原符号——这能将数小时的工作缩短到几分钟。
# Go: recover function names and types
GoReSym -t -p target > syms.json # or the redress / IDAGolangHelper plugins
# Rust: demangle
nm -C target 2>/dev/null | head
静态分析工作流
选定一种工具并深入使用;分析中途切换工具会导致注释丢失。
# Ghidra headless: batch import, auto-analyze, run a script
analyzeHeadless /proj MyProj -import target -postScript Decompile.java
# radare2 / rizin interactive
r2 -AA target
# aaa analyze everything
# afl list functions, sorted by size — big ones first
# axt @ sym.f cross-references TO a function (who calls this?)
# pdg @ main decompile with ghidra plugin (r2ghidra)
# iz / izz strings in data / whole binary
# /x deadbeef search for a byte pattern
# Binary Ninja / IDA headless equivalents exist; the workflow is identical
根据证据导航,而不是按地址顺序。 以下三个入口能最快找到有趣的代码:
- 字符串 → 交叉引用。 找到运行时看到的消息,通过交叉引用定位到生成该消息的函数。
- 导入项 → 交叉引用。 对
recv、CreateProcess、fopen、EVP_EncryptInit执行交叉引用,找到执行你所关注操作的代码。 - 熵/常量。 加密常量(AES S 盒、SHA-2 轮常量、MD5 魔数)容易识别;
binwalk、findcrypt和 YARA 规则可用于定位。
然后从该锚点向外阅读。随着你弄清每个函数和变量的作用,为它们逐一重命名——经过注释的反编译清单与原始清单完全不同。
识别反编译输出中的结构
反编译器给出的是类似 C 代码的噪声。你需要寻找的是:
- 带索引的字节数组循环,并执行 XOR — 可能是混淆或自制密码。提取密钥,在离线环境中解码。
- 对输入读取的小整数执行 switch — 命令分发。这通常就是协议,也是理解其他一切的地图。
memcpy的长度来自输入 — 内存安全审查的起点;参见auditing-code-for-vulnerabilities。- 对同一基址反复访问
[rax + 8*n]— 这是一个结构体。在工具中定义它,反汇编列表就会变成可读代码。 - 加载表后立即通过寄存器调用 — 虚函数表或回调分发。还原该表即可还原类。
动态分析
静态分析告诉你代码能做什么;动态分析告诉你代码实际做了什么。只在隔离的 VM 中运行不可信二进制文件,不要共享主机目录,并确保网络连接由你控制——隔离流程参见 analyzing-malware。
# Syscall and API-level behaviour
strace -f -e trace=network,file,process -o trace.log ./target
ltrace -f ./target
# Windows equivalents: API Monitor, Procmon, drltrace
# Debugging
gdb -q ./target # with pwndbg/GEF: `checksec`, `vmmap`, `heap`, `telescope`
lldb ./target # macOS
x64dbg / WinDbg # Windows
# Instrumentation — the highest-leverage dynamic technique
frida-trace -f ./target -i 'recv*' -i 'EVP_*'
# then edit the generated JS handlers to dump buffers and patch return values
Frida 是绕过反调试、自定义加密和许可证检查的最快方法:在解密之后 hook 函数,而不是试图破解保护它的混淆。
仿真适用于固件和隔离的例程:
qemu-arm -L /usr/arm-linux-gnueabi ./target # user-mode
# Unicorn for a single function: map memory, set registers, run, read result
# angr for symbolic execution when you need an input that reaches a state
固件
binwalk -Me firmware.bin # extract recursively
# Identify the filesystem before extracting: squashfs, jffs2, cramfs, ubifs
unsquashfs -d rootfs squashfs-root.bin
# Then treat the rootfs as a Linux system
rg -n 'password|admin|BEGIN (RSA|OPENSSH) PRIVATE KEY|api[_-]?key' -i rootfs/
find rootfs -name '*.pem' -o -name 'shadow' -o -name '*.conf'
# Web interface and startup scripts are where the bugs are
ls rootfs/etc/init.d rootfs/www rootfs/usr/sbin
对于没有文件系统的引导加载程序或裸机映像,在反汇编之前先找到加载地址(通常可在供应商 SDK 中找到,或通过绝对指针聚类推导)。基址错误会让整个反汇编列表失去意义。
反分析
先识别它,再决定是破解还是绕过。
| 技术 | 识别方法 | 应对措施 |
|---|---|---|
| 加壳 | 高熵,包含存根和一个大型节 | 脱壳,或在 OEP 之后从内存中转储 |
| 反调试 | IsDebuggerPresent、ptrace(PTRACE_TRACEME)、计时检查 | 修补检查,或用 Frida hook |
| VM 检测 | CPUID 检查、MAC OUI、注册表痕迹 | 加固 VM,或修补检测器 |
| 字符串混淆 | 没有可读字符串,但能明显看到解码循环 | 对所有调用点仿真解码器 |
| 控制流扁平化 | 围绕状态变量的大型 switch | 符号化去混淆,或忽略它并采用动态分析 |
绕过通常更省力。如果某项检查让你无法进行静态分析,就 hook 消耗其结果的函数。
应当摒弃的自我安慰
- “我要读完整个二进制文件。” 你做不到。先分诊并找准切入点,否则你会把整个项目的时间都耗在库代码上。
- “反编译器输出有误,所以这条路走不通。” 调用约定和结构体相关的反编译输出经常有误。得出结论前,先检查对应指令的反汇编。
- “它经过了剥离,所以符号都没了。” 库函数可以恢复(FLIRT/Sigs、与编译后的参考文件进行
bindiff),Go/Rust 元数据通常也会保留。 - “我直接运行看看它会做什么。” 在确认它是否有害以及运行环境如何隔离之前,不要这么做。
- “字符串说明了一切。” 字符串告诉你该去哪里找。攻击者会植入误导性字符串。
交付内容
逆向工程报告应让读者无需重复你的工作就能采取行动:
- 身份信息 — 哈希、文件类型、架构、编译器、加壳器
- 能力 — 描述它的行为,而不是地址
- 关键例程 — 带注释的地址、名称和一句话用途说明
- 协议/格式 — 按字段说明;如有帮助,附上解析器或 Kaitai 规范
- 指标 — 网络端点、文件路径、互斥体、密钥、常量
- 未解决的问题 — 你尚未解决的问题及原因
ATT&CK 覆盖范围
根据 secskills-core/ttp-index.json 生成——请编辑该文件,然后运行
python3 scripts/sync_attack.py --write。在报告中引用这些 ID 前,请根据
当前 ATT&CK 版本重新核验。
防御规避(TA0005)
- T1027 混淆文件或信息——另请参阅
analyzing-malware、analyzing-shellcode - T1027.002 软件加壳——另请参阅
analyzing-malware - T1140 反混淆/解码文件或信息——另请参阅
analyzing-malware、analyzing-shellcode - T1497 虚拟化/沙箱规避——另请参阅
analyzing-malware - T1622 调试器规避——另请参阅
analyzing-malware
针对上述任一项的检测内容:engineering-detections。主动搜索:hunting-threats。入侵后处置:responding-to-incidents。
参考资料
analyzing-malware——遏制、引爆分析和 IOC 提取testing-mobile-applications——围绕原生组件的 APK/IPA 工作流- Ghidra、rizin/radare2、Binary Ninja、IDA——任选一种并深入学习
- Frida、angr、Unicorn、QEMU,用于动态分析和模拟分析