iOS逆向学习笔记8(MachO文件)

1 什么是MachO文件

  Mach-O其实就是Mach Object文件格式的缩写,是Mac以及iOS上可执行文件的格式,类似于Windows上的PE格式(Portable Exectable)、linux上的elf格式(executable and Linking Format)。
  MachO是一种可执行文件、目标代码以及动态库等类型文件的格式。作为a.out格式的替代,Mach-O提供了更强的扩展性。
  属于MachO格式的常见文件:

  • 目标文件.o
  • 库文件[.a(静态库) .dylib(动态库) framework]
  • 可执行文件
  • dyld
  • .dsym
    可以通过File指令来查看文件的类型
    file指令使用格式:file 文件路径

2 查看各种MachO文件的信息

2.1查看一个.c文件生成的可执行文件的信息

  打开XCode使用快捷键command+N创建一个名为test的c文件,文件内容如下所示:

#include <stdio.h>

int main() {
    printf("test\n");
    
    return 0;
}

打开终端将这个.c文件使用clang命令编译为.o文件



再通过file指令查看编译之后生成的.o文件的信息



可以看到这个test.o文件是一个MachO格式,架构是x86_64的64位的object文件,架构是x86_64表示只有英特尔芯片的Mac电脑能读取这个文件。
再使用clang命令将这个.o文件链接成为可执行文件

使用file命令查看a.out文件的信息


image.png

可以看到这个a.out文件是一个MachO格式,架构是x86_64的64位的可执行文件,架构是x86_64表示只有英特尔芯片的Mac电脑能读取这个文件。
也可以直接将.c文件通过使用clang命令直接编译链接成为可执行文件,如下图所示:

还可以直接将.o文件通过使用clang命令直接链接成为可执行文件,如下图所示:

现在所生成的a.out、test以及test2文件是不是一样的呢?我们通过md5命令来查看这三个文件的hash值是否一致。



通过hash值对比我们可以得知这三个文件是一样的。因为这三个文件的源码文件test.c是一样的,clang编译时的编译方式是一样的,所有生成的可执行文件是一样的。

2.2 查看两个.c文件生成的可执行文件的信息

创建一个test.c文件,文件内容为:

#include <stdio.h>

void test2();

int main() {
    printf("test\n");
    
    return 0;
}

创建一个test2.c文件,文件内容为:

#include <stdio.h>

void test2() {
    printf("test2\n");
}

使用clang命令将两个.c文件(test.c在前)进行编译以及链接生成一个test可执行文件,文件信息如下:



使用clang命令将两个.c文件(test2.c在前)进行编译以及链接生成一个test可执行文件,文件信息如下:



再来看看生成的两个执行文件是否一样。

我们可以看到这两个可执行文件的hash值是不一样的,但使用的确是两个相同的.c文件编译链接而成的,这是为什么呢?
因为可执行文件实际上是多个.o文件的集合,链接时候的这些.o文件的顺序不一样,所生成的可执行文件的内容就不一样。
我们可以使用objdump命令来查看以下这两个执行文件的内容:


可执行文件test文件内容

可执行文件test2文件内容

就如同你在项目中改变.m文件的编译顺序,所生成的可执行文件的内容也是不一样的,如下图所示:

2.3 查看.a文件的信息

使用find命令在/usr目录下查找.a文件
find命令使用格式:find 文件路径 -name 文件名



查看.a文件的信息


2.4 查看.dylib文件的信息


image.png

2.5 查看dyld文件的信息


由上图我们得知dyld实际上是一个动态链接器(dynamic linker),它不是一个可执行文件,是一个通用二进制文件,当启动系统的时候,系统内核会触发这个文件。

2.6 查看dSYM文件的信息

将项目工程的iOS版本改到13.1以下,并且当前环境设置为release模式,编译之后






可以看到这个是一个Macho-O类型的arm64架构下64位的dSYM手册文件。

3 通用二进制(Universal binary)

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

3.1iOS11版本以上可执行文件的架构

iOS11版本以上可执行文件的架构

3.2 iOS11版本以下可执行文件的架构

iOS11版本以下可执行文件的架构

3.2 添加armv7s架构并查看iOS11版本以下可执行文件的架构

XCode中设置可执行文件的架构模式


XCode中设置可执行文件的架构

armv7s是生成iPhone5、iPhone 5c都能用的架构


添加架构

编译之后查看可执行文件支持的架构

4 使用lipo命令对MachO文件包含的架构进行合并以及拆分

4.1 使用lipo命令查看MachO文件的架构信息

命令格式:lipo -info MachO文件路径


4.2 使用lipo命令拆分MachO文件的某种架构

命令格式:lipo MachO文件 -thin 架构 -output 输出文件路径


剥离armv7架构

剥离arm64架构

4.3 使用lipo命令合并MachO文件的多种架构

命令格式:lipo -create MachO1 MachO2 -output 输出文件路径


合并arm64以及armv7两种架构

5 MachO文件结构

5.1 MachO文件基本结构

MachO文件结构

如上图所示:Mach-O的组成结构包括了

  • Header包含了该二进制文件的一般信息(字节顺序、结构类型、加载指令的数量等,使得可以快速确认一些信息,比如当前文件用于32位还是64位,对应的处理器是什么,文件类型是什么)
  • Load commands是一张包含了很多内容的表(内容包括区域的位置、符号表、动态符号表等)
  • Data是对象文件中最大的部分(包含Segement的具体数据)

5.1 使用otool命令查看MachO文件结构

5.1.1 使用otool命令查看MachO文件的header信息

命令格式:otool -f MachO文件路径



使用MachOView查看MachO文件信息



对比上下两张图我们可以发现:
cpuType 是12代码arm架构

cpuType 是16777228代表arm64架构
cpusubType为9对应的是arm_v7架构
cpusubType为11对应的是arm_v7s架构
cpusubType为0对应的是arm64架构
Offset代表的是这个类型架构的machO文件在整个MachO中首地址的偏移量,Size代表的是这个类型架构的machO文件大小
各个架构的MachO文件之间的空隙是因为分页原因造成的,mac中是2的12次方(4k)也就是4096,iOS中分页大小是2的14次方(16k)。


mac中分页大小

5.1.2 使用MachOView查看具体架构类型的MachO文件的header信息

/*
 * The 64-bit mach header appears at the very beginning of object files for
 * 64-bit architectures.
 */
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 */
};

fileType类型

#define MH_OBJECT   0x1     /* relocatable object file */
#define MH_EXECUTE  0x2     /* demand paged executable file */
#define MH_FVMLIB   0x3     /* fixed VM shared library file */
#define MH_CORE     0x4     /* core file */
#define MH_PRELOAD  0x5     /* preloaded executable file */
#define MH_DYLIB    0x6     /* dynamically bound shared library */
#define MH_DYLINKER 0x7     /* dynamic link editor */
#define MH_BUNDLE   0x8     /* dynamically bound bundle file */
#define MH_DYLIB_STUB   0x9     /* shared library stub for static
                       linking only, no section contents */
#define MH_DSYM     0xa     /* companion file with only debug
                       sections */
#define MH_KEXT_BUNDLE  0xb     /* x86_64 kexts */
#define MH_FILESET  0xc     /* a file composed of other Mach-Os to
                       be run in the same userspace sharing
                       a single linkedit. */

image.png





MachO的四大组成

image.png

注意:第二行是外部符号绑定

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341

推荐阅读更多精彩内容