逆向工程是从已有程序、固件、协议或数据中理解其结构和行为。常见目的包括兼容性分析、漏洞修复、恶意样本识别、协议对接、遗留系统维护和安全研究。
基础概念
| 概念 | 说明 |
|---|---|
| 静态分析 | 不运行程序,直接分析文件、字符串、导入表、反汇编和反编译结果 |
| 动态分析 | 在受控环境中运行程序,观察进程、网络、文件、注册表、内存和调用栈 |
| 反汇编 | 把机器码转换成汇编指令 |
| 反编译 | 尝试把低级代码还原成接近高级语言的伪代码 |
| 符号表 | 函数名、变量名、调试信息等辅助理解程序的信息 |
| 壳和混淆 | 用压缩、加密、控制流扰乱等方式降低分析可读性 |
| Hook | 在运行时拦截函数调用、参数或返回值,常用于调试和观测 |
常见文件类型
| 类型 | 常见平台 |
|---|---|
| PE | Windows 可执行文件、DLL |
| ELF | Linux 可执行文件、共享库 |
| Mach-O | macOS、iOS 可执行文件 |
| APK | Android 应用包 |
| IPA | iOS 应用包 |
| bin / hex | 固件、单片机程序、原始二进制 |
不同文件格式有不同入口、段结构、导入导出表和签名方式。分析前先确认格式,比一上来找函数更稳。
静态分析流程
- 记录文件来源、hash、大小、时间。
- 判断文件类型和架构。
- 提取字符串、导入函数、导出函数。
- 查看入口点、主函数、关键 API。
- 给函数和变量重新命名。
- 画出核心调用链。
- 整理结论和不确定点。
常见命令:
1 | file sample.bin |
动态分析流程
动态分析要在隔离环境里做,避免未知程序影响主机。
建议环境:
- 虚拟机或容器。
- 无敏感账号和文件。
- 可回滚快照。
- 网络可控,必要时断网。
- 日志和抓包工具提前准备。
关注点:
- 启动参数。
- 文件读写。
- 网络连接。
- 进程创建。
- 环境变量。
- 异常退出位置。
- 关键函数参数和返回值。
常用工具
| 工具 | 用途 |
|---|---|
| Ghidra | 反汇编、反编译、函数分析 |
| radare2 | 命令行逆向分析框架 |
| Frida | 动态插桩、运行时观测 |
| lldb / gdb | 调试、断点、调用栈 |
| Wireshark | 网络抓包和协议分析 |
| binwalk | 固件分析和文件提取 |
| strings / file / hexdump | 快速观察二进制文件 |
工具只是辅助。真正重要的是把“程序做了什么、输入输出是什么、关键状态在哪里”讲清楚。
常见问题
反编译出来看不懂
常见原因:
- 没有符号名。
- 编译器优化改变了代码结构。
- 使用了内联、宏、模板或复杂控制流。
- 程序经过混淆或加壳。
处理方式:
- 从字符串和导入函数找入口。
- 先命名关键函数,再逐步往外扩。
- 结合动态运行日志确认行为。
- 不要指望反编译结果和源码完全一致。
程序一运行就退出
可能原因:
- 缺少依赖库。
- 检测到运行环境不满足。
- 参数错误。
- 配置文件缺失。
- 权限不足。
- 程序崩溃但没有显示日志。
排查时先用日志、调试器和系统调用追踪看退出点。
分析固件从哪里开始
先做基础识别:
1 | file firmware.bin |
再看是否包含文件系统、压缩包、内核镜像、启动脚本、配置文件和默认账号。固件分析要注意设备授权和安全边界。
记录模板
1 | ## 样本信息 |