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中,如下图所示:
?
?
?ida识别到两种架构的代码。
先让ida加载arm7平台的代码
?
?
?在右面的十六进制窗口可以看到mach-o文件的魔数。在左下角的位置显示魔数在文件偏移4000的位置,可以知道可执行文件从偏移4000的位置开始将文件映射到内存(从0开始)。
然后打开段窗口查看文件映射到内存的布局
从ida段窗口可以清楚的看到各个可执行文件各个节的加载情况。
然后我们关闭ida,重新选择arm64加载可执行文件。
加载后我们可以知道 arm64架构的代码从文件偏移14000开始的位置映射到内存。
(两种架构的段,可以发现有一些不一样的地方,就是arm64架构多了一个got节。这个节的作用待补充。)
好了,我们现在知道文件偏移4000-14000的位置属于 arm7架构部分,14000-end 属于arm64架构部分,那么0-4000位置存放的是什么内容呢?
用16进制编辑器打开文件:
CAFEBABE?是不是很熟悉?是java的魔数,至于0-4000的内容到底是什么,带着疑问继续学校mach-o文件。
实验2:生成一个单一平台的应用,查看其文件组织形式。
步骤如实验1所示,将生成的app拖到ida。
?
?
?由此我们可以得出一个结论,就是单平台的ios 应用文件 没有实验1中文件的0-4000数据。