MachO文件分析1

320 阅读2分钟

「这是我参与2022首次更文挑战的第8天,活动详情查看:2022首次更文挑战」。

MachO文件

Mach-O是Mach Object文件格式的缩写,是mac以及iOS上可执行文件的格式。是一种用于可执行文件、目标代码、动态库的文件格式。作为a.out格式的替代,Mach-O提供了更强的扩展性。
类似于windows上的PE格式 (Portable Executable ),linux上的elf格式 (Executable and Linking Format)

Mach-O文件格式

  • 目标文件.o

  • 库文件

    • .a
    • .dylib
    • framework
  • 可执行文件

  • dyld

  • .dsym

实际开发中,MatchO文件有很多不同的类型,可以通过在Xcode上指定。
TargetsBuild SettingsLinkingMach-O Type

image.png

通用二进制文件

  • 苹果公司提出的一种程序代码,能同时适用多种架构的二进制文件。
  • 同一个程序包中同时为多种架构提供最理想的性能。
  • 因为需要储存多种代码,通常比单一平台二进制的程序要大。
  • 由于执行中只调用一部分代码,运行起来也不需要额外的内存。

在Xcode编译可以指定生成哪些架构的Match-O文件,同时也可以添加其他架构
TargetsBuild SettingsArchitecturesArchitectures

image.png

设备的CPU架构(指令集)

  • 模拟器:

    • 4s-5: i386
    • 5s-6s Plus: x86_64
  • 真机(iOS设备):

    • armv6: iPhone、iPhone 2、iPhone 3G、iPod Touch(第一代)、iPod Touch(第二代)
    • armv7: iPhone 3Gs、iPhone 4、iPhone 4s、iPad、iPad 2
    • armv7s: iPhone 5、iPhone 5c
    • arm64: iPhone 5s之后机型

Mach-O架构拆分、合并

  1. lipo工具
  • 查看MachO架构

$lipo -info 'MachO文件'

  • 拆分MachO架构

$lipo 'MachO文件' –thin '架构名' –output '目标MachO文件'

  • 合并MachO架构

$lipo -create '第一个MachO文件' '第二个MachO文件 -output '目标MachO文件'

  1. file指令:查看文件信息

$file 文件路径

MachO文件结构

Mach-O 的组成结构如图所示,主要包括三个部分:Header、Load commands、Data

image.png

Header

包含二进制文件的一般信息,架构类型、字节顺序、加载指令的数量等。

image.png

struct mach_header_64 {
    uint32_t        magic;          /* mach magic number identifier */
    cpu_type_t      cputype;        /* cpu specifier */
    cpu_subtype_t   cpusubtype;     /* machine specifier */
    uint32_t        filetype;       /* type of file */
    uint32_t        ncmds;          /* number of load commands */
    uint32_t        sizeofcmds;     /* the size of all the load commands */
    uint32_t        flags;          /* flags */
    uint32_t        reserved;       /* reserved */
};

magic:定位结构是64位还是32位 (e.g. MH_MAGIC_64)
cputype:CPU类型 (e.g. CPU_TYPE_ARM64)
cpusubtype:CPU具体类型 (e.g. CPU_SUBTYPE_ARM64_ALL)
filetype:文件类型 (e.g. MH_EXECUTE)
ncmds:Load Commands条数
sizeofcmds:Load Commands大小
flags:标志位。标识二进制文件支持的功能,主要和系统加载、链接有关
reserved:预留区(只有64位才有)