iOS 解析命令:otool -
二进制文件Header(文件头)
包含文件的基本信息,如文件类型(可执行文件、动态库等)、CPU 架构(arm64、x86_64 等)、加载命令的数量等。
通过命令可以查看文件头信息。
otool -h <binary> //查看文件头信息
//示例:
//假设你有一个 iOS App 的可执行文件 MyApp,路径为 /Users/username/MyApp.app/MyApp,你可以运行以下命令查看文件头信息:
otool -h /Users/username/MyApp.app/MyApp
otool -l <binary> //查看加载命令
otool -L <binary> //查看依赖的动态库
otool -tV <binary> //查看代码段的反汇编
otool -s __DATA __data <binary> //查看数据段的内容
otool -h 的作用
otool -h 用于显示 Mach-O 文件的文件头信息。文件头包含以下关键信息:
- Magic Number:标识文件类型(如 MH_MAGIC_64 表示 64 位 Mach-O 文件)。
- CPU Type:文件的 CPU 架构(如 ARM64、X86_64)。
- File Type:文件类型(如可执行文件、动态库、目标文件等)。
- Number of Load Commands:加载命令的数量。
- Size of Load Commands:加载命令的总大小。
- Flags:文件的标志位(如是否启用 PIE、是否剥离符号等)。
输出示例
运行 otool -h 后,你会看到类似以下的输出:
Mach header
magic cputype cpusubtype caps filetype ncmds sizeofcmds flags
MH_MAGIC_64 ARM64 ALL 0x00 EXECUTE 28 4048 NOUNDEFS DYLDLINK TWOLEVEL PIE
字段说明:
-
magic:文件的魔数,标识文件类型。例如:
MH_MAGIC_64:64 位 Mach-O 文件(0xfeedfacf)
MH_MAGIC:32 位 Mach-O 文件(0xfeedface) -
cputype:CPU 架构。例如:
ARM64:64 位 ARM 架构(iOS 设备:16777228 是 CPU_TYPE_ARM64 的值)。
X86_64:64 位 Intel 架构(macOS 设备:CPU_TYPE_X86_64)。 -
cpusubtype:CPU 子类型,通常为 ALL(0:表示通用的 CPU 子类型(CPU_SUBTYPE_ARM64_ALL),适用于所有 ARM64 设备)
-
caps:CPU 特性标志,通常为 0x00。
-
filetype:文件类型。例如:
MH_OBJECT:目标文件(值:1)
EXECUTE:可执行文件(值:2)
DYLIB:动态库(值:6)
BUNDLE:插件或扩展(值:8) -
ncmds:加载命令的数量。
sizeofcmds:加载命令的总大小。 -
flags:文件的标志位。例如:(0x00218085:0x0 02 18 08 5)
PIE:启用位置无关代码「0x00200000」(Position Independent Executable:表示文件支持地址空间随机化ASLR)
TWOLEVEL:使用两级命名空间「0x00018000」
DYLDLINK:文件是一个动态链接的可执行文件「0x00000080」
NOUNDEFS:文件中没有未定义的符号。「0x00000005」
具体案例
输出的内容如下:Mach header(对照以上说明,可以明白具体含义)
magic cputype cpusubtype caps filetype ncmds sizeofcmds flags
0xfeedfacf 16777228 0 0x00 2 119 11976 0x00218085