Objective-C Mach-O文件格式深入理解
Mach-O(Mach Object),是一种基于Mach内核的文件格式,苹果很多文件都采用这种格式,最常见的就是可执行文件和动态库。
当然,还有.o的目标文件、.a和.framework的静态库以及动态连接器dyld等等。
利用MachOView可以查看Mach-O文件的内部结构,以Mac微信为例:

1、Mach64 Header(文件头)
包含模数、CPU类型、文件类型、加载指令的数量和大小以及文件状态信息。

1)模数:表示该二进制所支持的CPU位数,用于校验。
#define MH_MAGIC 0xfeedface // 32位
#define MH_MAGIC_64 0xfeedfacf // 64位
2)文件状态信息:即Flags,包含一些状态位。例如MH_DYLDLINK,表示该二进制不能再静态链接。
2、Load Commands(加载指令)


1)LC_SEGMENT_64:加载段
__TEXT:代码段
__DATA:数据段
2)LC_DYLD_INFO_ONLY:
3)LC_SYMTAB:加载符号表,
4)LC_DYSYMTAB:加载符号表
5)LC_LOAD_DYLINKER:加载动态链接器dyld,用于后续加载动态库。

6)LC_UUID:加载二进制的UUID,唯一标识,常用于解析crash堆栈。

7)LC_VERSION_MIN_MACOSX:加载该二进制支持的最小操作系统版本,对应于工程配置中的Deployment Target。

8)LC_SOURCE_VERSION:
9)LC_MAIN:加载main函数。
10)LC_DYLIB:加载动态库,外挂如WeChatPlugin,会增加一条这样的指令,用于加载自定义的动态库。

11)LC_RPATH:加载@rpath,对应于工程配置中的Runpath Search Paths。
12)LC_FUNCTION_STARTS:加载函数入口信息。
13)LC_DATA_IN_CODE:
14)LC_CODE_SIGNATURE:加载签名,用于校验,外挂如WeChatPlugin,会删掉这条指令。
3、Session64(节)

1)__objc_classlist:class-dump就是利用这节把应用的类和对应的方法导出来。
参考链接:
https://developer.apple.com/documentation/kernel/mach_header_64/1525810-flags?language=objc
https://opensource.apple.com/source/xnu/xnu-4570.1.46/EXTERNAL_HEADERS/mach-o/loader.h.auto.html
https://sourceforge.net/projects/machoview/
注:通常所说的XNU内核是Mach的封装。
Objective-C Mach-O文件格式深入理解的更多相关文章
- Android ELF文件格式
最近一直在学习elf相关信息.一个小总结,这里记录,也方便以后查阅. ELF是类Unix类系统,当然也包含Android系统上的可运行文件格式(也包含.so和.o类文件). 能够理解为Android系 ...
- 音视频入门-14-JPEG文件格式详解
* 音视频入门文章目录 * JPEG 文件格式解析 JPEG 文件使用的数据存储方式有多种.最常用的格式称为 JPEG 文件交换格式(JPEG File Interchange Format,JFIF ...
- 苹果ipa软件包破解笔记
苹果的验证机制: Appstore上的应用都採用了DRM(digital rights management)数字版权加密保护技术,直接的表现是A帐号购买的app,除A外的帐号无法使用,事实上就是有了 ...
- iOS 符号表恢复 & 逆向支付宝
推荐序 本文介绍了恢复符号表的技巧,并且利用该技巧实现了在 Xcode 中对目标程序下符号断点调试,该技巧可以显著地减少逆向分析时间.在文章的最后,作者以支付宝为例,展示出通过在 UIAlertVie ...
- iOS 静态库和动态库(库详解)
什么是库 ? 库就是程序代码的集合,将N个文件组织起来,是共享程序代码的一种方式.库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行. 库的分类 开源库:源代码是公开的,可以看到每个实现 ...
- MachO文件详解--逆向开发
今天是逆向开发的第5天内容--MachO文件(Mac 和 iOS 平台可执行的文件),在逆向开发中是比较重要的,下面我们着重讲解一下MachO文件的基本内容和使用. 一.MachO概述 1. 概述 M ...
- 减小ipa体积之删除frameWork中无用mach-O文件
最近项目末期, 我们团队为了ipa的大小使用不少的体积减小的方法, 除了一些常规的方法之外, 我分享一下自己研究出来的新思路. 首先我们来简单的介绍一下mach-O. 什么是mach-O? Mach- ...
- 解析 MACH_O 文件
现在做iOS开发的挺多,了解一下在苹果平台上程序运行的原理 解析 MACH_O 文件 这篇文章描述了如何解析 Mach-O 文件并稍微解释了一下它的格式.这不是一份权威指南,不过当你不知从何开始时,它 ...
- 为什么要使用Nginx?
这里做了些基准测试表明nginx打败了其它的轻量级的web服务器和代理服务器,同样也赢了相对不是那么轻量级的产品. 有人说这些基准测试是不准确的,因为在这样那样的环境下,做的比较不一致.我倾向同意基准 ...
随机推荐
- DotNetCore 结合 Nginx 将网站部署到阿里云
基础环境配置 域名和服务器请先自行购买 基于 云服务器ECS 创建一个应用实例,选择系统镜像为 Ubuntu 16.04,在本机通过 SSH 进行远程连接,并进行相关配置 ssh root@http: ...
- python2&python3
1.Python3 使用 print 必须要以小括号包裹打印内容,比如 print('hi') Python2 既可以使用带小括号的方式,也可以使用一个空格来分隔打印内容,比如 print 'hi ...
- React 入门学习笔记整理(一)——搭建环境
使用create-react-app脚手架搭建环境 1.安装node .软件下载地址:https://nodejs.org/en/,我下的推荐的版本. 安装之后测试是否安装成功.windows系统下, ...
- 用 JS 写 (轮播图 / 选项卡 / 滑动门)
页面中经常会用到各式各样的轮播图,今天贺贺为大家介绍一种常用的方法,对于JS我们需要举一反三,一种方法可以对多个轮播样式进行渲染. <head> <meta charset=&quo ...
- OSPF协议总结
总结: 1.ospf协议报文不会泛洪扩散,而是逐级路由器处理后,再从所有ospf启用端口发送出去,也就是说,只能从邻居接收到ospf报文,报文的源ip是邻居的ip地址,目的ip是组播ip. 2.开启o ...
- React 表单与事件
一个简单是实例 在实例中我们设置了输入框 input 值value = {this.state.data}.在输入框值发生变化时我们可以更新 state.我们可以使用 onChange 事件来监听 i ...
- 洗礼灵魂,修炼python(14)--模块decimal, fractions,operator,collections以及精度介绍
decimal 1.作用: 用于浮点数计算.相比内置的二进制浮点数实现 float这个类型有助于 金融应用和其它需要精确十进制表达的场合,控制精度,控制舍入以适应法律或者规定要求,确保十进制数位精度, ...
- C#操作Exchange配置
1.客户端配置:运行gpedit.msc进入本地组策略管理器,计算机配置>管理模版>Windows组件>WinRM>WinRM客户端启用允许未加密通信:启用受信任的主机并添加e ...
- fedora 28 安装 wine 运行 uTorrent 解决linux 端,pt 资源下载问题
fedora 28 仓库中,资源比较多.使用 wine 运行windows 程序,可以一定程度上解决软件跨平台问题. 搜索: Last metadata expiration check: :: ag ...
- 在LINUX上部署SOFA
JDK1.6环境变量 vim /etc/profile JAVA_HOME=/usr/local/java/jdk1.6.0_45PATH=$JAVA_HOME/bin:$PATHCLASSPATH= ...