怎样读懂可执行文件
以 macOS 的 Mach-O 为例,从文件身份、结构到入口点进行有证据的检查。
读完这一章,你会理解
- 形成二进制检查顺序
- 理解段、节和加载命令
- 避免把十六进制输出当成完整解释
先确认文件身份
分析之前先回答:它是什么格式、面向什么架构、是否包含调试信息。file 能快速给出身份;十六进制查看适合确认文件头方向,但不适合独自承担结构解释。
file hello
xxd hello | head再使用结构化工具读取元数据
Mach-O 通过加载命令描述段、动态库和入口等信息。otool 可以按结构展示这些命令,nm 可以查看符号,比在原始字节中人工猜测可靠得多。
otool -l hello
nm -nm hello始终标明你使用的坐标
文件偏移描述内容在磁盘文件中的位置,虚拟地址描述加载后的地址空间,运行地址还可能受到地址随机化影响。结论中如果不标明坐标,很容易出现看似精确但实际混淆的地址。