用途:解析 macOS/iOS 的 Mach-O 二进制,理解其结构、load commands、入口、代码签名与动态库依赖链,并可用于检查 dylib 注入、签名/公证状态与通用二进制多架构片。不适用于 PE、ELF 以及仅需函数逻辑的反编译场景。
主要能力:用 file、lipo、xxd 初勘类型与架构(魔数 cffaedfe 为 64 位小端,cafebabe 为 fat);用 otool -h / -l 查看 mach_header 与全部 load commands,遍历受 ncmds 与 sizeofcmds 校验;查看 __TEXT/__DATA/__LINKEDIT 段的 vmaddr/vmsize/fileoff;从 LC_MAIN 的 entryoff 计算入口 VA(VA=__TEXT 段 vmaddr+entryoff);从 LC_DYLD_INFO_ONLY 读取 rebase/bind/weak_bind/lazy_bind/export 五组 offset+size;用 otool -L 列出 LC_LOAD_DYLIB 依赖并检测异常注入条目;用 llvm-nm 读取 nlist_64 符号表;用 codesign 检查签名类型与完整性,jtool2 --sig 看 CodeDirectory 细节。
使用方式:macOS 上安装 Xcode Command Line Tools(xcode-select --install),验证 otool --version;跨平台用 llvm-objdump、llvm-nm、llvm-lipo,验证 llvm-objdump --version;Linux 可用 llvm 工具直接解析 Mach-O,输出与 macOS 一致。通用二进制先用 lipo -info 确认架构,再 lipo -thin <arch> -output piece sample 提取单片解析。系统库实际在 dyld 共享缓存中,可用 dyld_shared_cache_util -extract 抽出。修改过的二进制需 codesign -f -s - 重签(仅限自签/adhoc)。
限制:签名验证会拦截调试与注入,Library Validation 开启时 DYLD_INSERT_LIBRARIES 失效;iOS 真机动态调试需开发者证书或越狱环境;load command 被伪造时遍历会错位(64 位 cmdsize 须为 8 的倍数),需用 xxd + Python struct 按偏移手工解析;GOT 位置随版本迁移(新产物在 __DATA_CONST,__got,旧产物在 __DATA,__got);共享缓存库的链接元数据无法直接按文件偏移定位,应优先用 nm/dyldinfo 按 LC_SYMTAB 解析。