首页 > 代码库 > iOS可执行文件格式初探

iOS可执行文件格式初探

Mach-O (Mach object) file format?

这种格式的中文资料很少,最详细的还是苹果的官方文档,本文不重复解释mach-o文件格式的内容,只叙述在用ida逆向ios应用程序时的经验。

mach-o详细文档参考:https://developer.apple.com/library/mac/documentation/DeveloperTools/Conceptual/MachORuntime/index.html

?mach-o格式可以包含多个目标平台的可执行代码,比如同时包含arm64与arm7的可执行代码。

?

实验1:我们首先生成一个包含2中平台的app,通过对比对同一个app 加载不同的架构代码进行对比分析。

当用多目标平台生成一个ios应用程序后,将其拖入到ida中,如下图所示:

NewImage

?

?

?ida识别到两种架构的代码。

先让ida加载arm7平台的代码

?

2?

?在右面的十六进制窗口可以看到mach-o文件的魔数。在左下角的位置显示魔数在文件偏移4000的位置,可以知道可执行文件从偏移4000的位置开始将文件映射到内存(从0开始)。

然后打开段窗口查看文件映射到内存的布局

 3

从ida段窗口可以清楚的看到各个可执行文件各个节的加载情况。

然后我们关闭ida,重新选择arm64加载可执行文件。

4

加载后我们可以知道 arm64架构的代码从文件偏移14000开始的位置映射到内存。

6

(两种架构的段,可以发现有一些不一样的地方,就是arm64架构多了一个got节。这个节的作用待补充。)

好了,我们现在知道文件偏移4000-14000的位置属于 arm7架构部分,14000-end 属于arm64架构部分,那么0-4000位置存放的是什么内容呢?

用16进制编辑器打开文件:

7

CAFEBABE?是不是很熟悉?是java的魔数,至于0-4000的内容到底是什么,带着疑问继续学校mach-o文件。

实验2:生成一个单一平台的应用,查看其文件组织形式。

步骤如实验1所示,将生成的app拖到ida。

NewImage

?

?

?由此我们可以得出一个结论,就是单平台的ios 应用文件 没有实验1中文件的0-4000数据。

iOS可执行文件格式初探