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中,如下图所示:

?

?

?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数据。

时间: 2024-10-12 06:46:10

iOS可执行文件格式初探的相关文章

可执行文件格式elf和bin

区别 常用的可执行文件包含两类:原始二进制文件(bin)和可加载执行的二进制文件,在linux中可加载执行的二进制文件为elf文件. BIN文件是直接的二进制文件,内部没有地址标记.bin文件内部数据按照代码段或者数据段的物理空间地址来排列.一般用编程器烧写时从00开始,而如果下载运行,则下载到编译时的地址即可. 在Linux OS上,为了运行可执行文件,他们是遵循ELF格式的,通常gcc -o test test.c,生成的test文件就是ELF格式的.执行elf文件时内核会使用加载器来解析e

iOS可执行文件瘦身方法

缩减iOS安装包大小是很多中大型APP都要做的事,一般首先会对资源文件下手,压缩图片/音频,去除不必要的资源.这些资源优化做完后,我们还可以尝试对可执行文件进行瘦身,项目越大,可执行文件占用的体积越大,又因为AppStore会对可执行文件加密,导致可执行文件的压缩率低,压缩后可执行文件占整个APP安装包的体积比例大约有80%~90%,还是挺值得优化的.下面介绍一下在研究可执行文件过程中发现的可以优化的点.研究的过程使用了linkmap,linkmap的介绍跟生成可以参考另一篇文章—iOS可执行文

嵌入式系统可执行文件格式_转

转自:嵌入式系统可执行文件格式 UBOOT编译映像格式(uboot) UBOOT编译完成后,可以得到u-boot各种格式的映像文件和符号表 u-boot.bin:      u-boot映像原始的二进制格式 u-boot:            u-boot映像的ELF格式 u-boot.srec:     u-boot映像的S-Record格式 u-boot.map:    u-boot映像的符号表 u-boot的3种映像格式都可以烧写到Flash中,但需要看加载器能否识别这些格式.一般u-b

Linux下可执行文件格式详解

Linux下面,目标文件.共享对象文件.可执行文件都是使用ELF文件格式来存储的.程序经过编译之后会输出目标文件,然后经过链接可以产生可执行文件或者共享对象文件.Linux下面使用的ELF文件和Windows操作系统使用的PE文件都是从Unix系统的COFF文件格式演化来的. 我们先来了解一些基本的想法. 首先,最重要的思路是一个程序从人能读懂的格式转换为供操作系统执行的二进制格式之后,代码和数据是分开存放的,之所以这样设计有这么几个原因: 1.程序执行之后,代码和数据可以被映射到不同属性的虚拟

Android漫游记(2)---ELF可执行文件格式

ELF是类Unix类系统,当然也包括Android系统上的可执行文件格式(也包括.so和.o类文件).可以理解为Android系统上的exe或者dll文件格式.理解ELF文件规范,是理解Android系统上进程加载.执行的前提.下面我们就来一步步了解这ELF到底是个啥玩意儿(以Arm 32 ELF格式为主)!当然,网上关于ELF的介绍已经非常多,最好的手册还是直接看ELF官方的手册,我这里只是对ELF的文件做个纲领性介绍,然后直奔主题,比如.GOT .PLT或者R_Arm_Jump_Slot,R

iOS可执行文件的简单反ida

ida就不用我就废话了,这篇主要讲解如何通过对mach-o文件简单的更改达到反ida静态分析的目的. 先说一下mach-o文件格式的节. ? ? struct?section?{?/*?for?32-bit?architectures?*/?? ????char????????sectname[16];???/*?name?of?this?section?*/?? ????char????????segname[16];????/*?segment?this?section?goes?in?*/

ios日期格式转换

转自:http://blog.csdn.net/l_ch_g/article/details/8217725 1.如何如何将一个字符串如“ 20110826134106”装化为任意的日期时间格式,下面列举两种类型: NSString* string = @"20110826134106"; NSDateFormatter *inputFormatter = [[[NSDateFormatter alloc] init] autorelease]; [inputFormatter set

iOS时间格式的转换

在开发iOS程序时,有时候需要将时间格式调整成自己希望的格式,这个时候我们可以用NSDateFormatter类来处理. 例如: //实例化一个NSDateFormatter对象 NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; //设定时间格式,这里可以设置成自己需要的格式 [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; //用[NSDate d

iOS:JSON格式字符串转字典,字典转JSON格式字符串

在iOS开发中,和服务器交互中,经常用到字典和JSON格式字符串相互转换. 代码如下: 1.JSON格式字符串转字典 + (NSDictionary *)dictionaryWithJsonString:(NSString *)jsonString { if (jsonString == nil) { return nil; } NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding]; NSError *err