iOS逆向-MACH-O文件

请注意,本文编写于 390 天前,最后修改于 191 天前,其中某些信息可能已经过时。

Mach-O是Mach Object的缩写,是Mac/iOS上用于存储程序,库的标准格式

Mach-O结构和格式

XNU源码中的fat和loader头文件中描述了Mach-O的FAT文件格式的结构和Mach-O文件的格式。

文件格式
文件格式

常见的Mach-O文件类型

  • MH_OBJECT (目标文件,即.o文件。以及由多个.o文件合并而成的静态库.a文件)
  • MH_EXECUTE (可执行文件 .app)
  • MH_DYLIB (动态库文件 .dylib 和 .framework)
  • MH_DYLINKER (动态链接编辑器 dyld)
  • MH_DSYM (存储着二进制文件符号信息的文件)

可以使用 file 文件路径指令查看文件的类型。

64位x86架构的Mach-O文件
64位x86架构的Mach-O文件

UIKit 通用二进制Mach-O文件
UIKit 通用二进制Mach-O文件

在Xcode中查看taget的Mach-O类型

查看taget的Mach-O类型
查看taget的Mach-O类型

Mach-O的基本结构

Mach-O的基本结构
Mach-O的基本结构

[Mach-O](https://developer.apple.com/library/content/documentation/DeveloperTools/Conceptual/MachOTopics/0-Introduction/introduction.html
)的官方描述中,Mach-O文件是由Header, Load commands, Raw segment data构成。

构成
构成

  • header 指定文件了目标体系结构,如PPC、PPC64、IA32或X8664。
  • load commands 指定文件的逻辑结构和虚拟内存中文件的布局
  • Raw segment data 包含加载命令中定义的段的原始数据

mac提供了otool命令查看Mach-O特定部分的段和内容。

otool
otool

也可以使用MachOView来查看。

MachOView
MachOView

FAT文件

Universal Binary(通用二级制文件)的别称。它是能同时适用于多种架构的二级制文件,并且包含了多种不同架构的独立二进制文件。
通用二进制文件比单一架构的二进制文件要大,但是不会达到单一架构的二级制文件的两倍,因为两个平台机构会有一些公用的文件存在。而正是由于通用二级制文件比原来的要大,所以被称之为‘胖二级制文件’。

dyld加载Mach-O

App的可执行文件和动态库都是由dyld负责加载的。另外dyld还加载了MH_EXECUTE,MH_DYLIB,MH_BUNDLE类型的Mach-O文件。

在dyld的loadPhase6函数中

loadPhase6函数片段
loadPhase6函数片段

会判断文件类型是否为MH_EXECUTE,MH_DYLIB,MH_BUNDLE这三种类型,如果是的话就会break Switch-case 执行下面的加载代码,否则则抛出 文件虽然是mach-o,但是是一种dyld不能加在的类型。而读取的文件类型就来自Mach-O的header的filetype。

笔记来自 www.520it.com 小码哥iOS逆向

Comments

添加新评论