逆向工程是从已有程序、固件、协议或数据中理解其结构和行为。常见目的包括兼容性分析、漏洞修复、恶意样本识别、协议对接、遗留系统维护和安全研究。

基础概念

概念 说明
静态分析 不运行程序,直接分析文件、字符串、导入表、反汇编和反编译结果
动态分析 在受控环境中运行程序,观察进程、网络、文件、注册表、内存和调用栈
反汇编 把机器码转换成汇编指令
反编译 尝试把低级代码还原成接近高级语言的伪代码
符号表 函数名、变量名、调试信息等辅助理解程序的信息
壳和混淆 用压缩、加密、控制流扰乱等方式降低分析可读性
Hook 在运行时拦截函数调用、参数或返回值,常用于调试和观测

常见文件类型

类型 常见平台
PE Windows 可执行文件、DLL
ELF Linux 可执行文件、共享库
Mach-O macOS、iOS 可执行文件
APK Android 应用包
IPA iOS 应用包
bin / hex 固件、单片机程序、原始二进制

不同文件格式有不同入口、段结构、导入导出表和签名方式。分析前先确认格式,比一上来找函数更稳。

静态分析流程

  1. 记录文件来源、hash、大小、时间。
  2. 判断文件类型和架构。
  3. 提取字符串、导入函数、导出函数。
  4. 查看入口点、主函数、关键 API。
  5. 给函数和变量重新命名。
  6. 画出核心调用链。
  7. 整理结论和不确定点。

常见命令:

1
2
3
file sample.bin
shasum -a 256 sample.bin
strings sample.bin | head

动态分析流程

动态分析要在隔离环境里做,避免未知程序影响主机。

建议环境:

  • 虚拟机或容器。
  • 无敏感账号和文件。
  • 可回滚快照。
  • 网络可控,必要时断网。
  • 日志和抓包工具提前准备。

关注点:

  • 启动参数。
  • 文件读写。
  • 网络连接。
  • 进程创建。
  • 环境变量。
  • 异常退出位置。
  • 关键函数参数和返回值。

常用工具

工具 用途
Ghidra 反汇编、反编译、函数分析
radare2 命令行逆向分析框架
Frida 动态插桩、运行时观测
lldb / gdb 调试、断点、调用栈
Wireshark 网络抓包和协议分析
binwalk 固件分析和文件提取
strings / file / hexdump 快速观察二进制文件

工具只是辅助。真正重要的是把“程序做了什么、输入输出是什么、关键状态在哪里”讲清楚。

常见问题

反编译出来看不懂

常见原因:

  • 没有符号名。
  • 编译器优化改变了代码结构。
  • 使用了内联、宏、模板或复杂控制流。
  • 程序经过混淆或加壳。

处理方式:

  • 从字符串和导入函数找入口。
  • 先命名关键函数,再逐步往外扩。
  • 结合动态运行日志确认行为。
  • 不要指望反编译结果和源码完全一致。

程序一运行就退出

可能原因:

  • 缺少依赖库。
  • 检测到运行环境不满足。
  • 参数错误。
  • 配置文件缺失。
  • 权限不足。
  • 程序崩溃但没有显示日志。

排查时先用日志、调试器和系统调用追踪看退出点。

分析固件从哪里开始

先做基础识别:

1
2
3
file firmware.bin
binwalk firmware.bin
strings firmware.bin | head

再看是否包含文件系统、压缩包、内核镜像、启动脚本、配置文件和默认账号。固件分析要注意设备授权和安全边界。

记录模板

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
## 样本信息

- 文件名:
- SHA256:
- 平台:
- 架构:
- 来源:

## 观察结论

- 入口:
- 关键函数:
- 网络行为:
- 文件行为:
- 风险点:

## 未确认问题

-

官方入口

站内搜索

没有找到内容!