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文件格式深入理解的更多相关文章

  1. Android ELF文件格式

    最近一直在学习elf相关信息.一个小总结,这里记录,也方便以后查阅. ELF是类Unix类系统,当然也包含Android系统上的可运行文件格式(也包含.so和.o类文件). 能够理解为Android系 ...

  2. 音视频入门-14-JPEG文件格式详解

    * 音视频入门文章目录 * JPEG 文件格式解析 JPEG 文件使用的数据存储方式有多种.最常用的格式称为 JPEG 文件交换格式(JPEG File Interchange Format,JFIF ...

  3. 苹果ipa软件包破解笔记

    苹果的验证机制: Appstore上的应用都採用了DRM(digital rights management)数字版权加密保护技术,直接的表现是A帐号购买的app,除A外的帐号无法使用,事实上就是有了 ...

  4. iOS 符号表恢复 & 逆向支付宝

    推荐序 本文介绍了恢复符号表的技巧,并且利用该技巧实现了在 Xcode 中对目标程序下符号断点调试,该技巧可以显著地减少逆向分析时间.在文章的最后,作者以支付宝为例,展示出通过在 UIAlertVie ...

  5. iOS 静态库和动态库(库详解)

    什么是库 ? 库就是程序代码的集合,将N个文件组织起来,是共享程序代码的一种方式.库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行. 库的分类 开源库:源代码是公开的,可以看到每个实现 ...

  6. MachO文件详解--逆向开发

    今天是逆向开发的第5天内容--MachO文件(Mac 和 iOS 平台可执行的文件),在逆向开发中是比较重要的,下面我们着重讲解一下MachO文件的基本内容和使用. 一.MachO概述 1. 概述 M ...

  7. 减小ipa体积之删除frameWork中无用mach-O文件

    最近项目末期, 我们团队为了ipa的大小使用不少的体积减小的方法, 除了一些常规的方法之外, 我分享一下自己研究出来的新思路. 首先我们来简单的介绍一下mach-O. 什么是mach-O? Mach- ...

  8. 解析 MACH_O 文件

    现在做iOS开发的挺多,了解一下在苹果平台上程序运行的原理 解析 MACH_O 文件 这篇文章描述了如何解析 Mach-O 文件并稍微解释了一下它的格式.这不是一份权威指南,不过当你不知从何开始时,它 ...

  9. 为什么要使用Nginx?

    这里做了些基准测试表明nginx打败了其它的轻量级的web服务器和代理服务器,同样也赢了相对不是那么轻量级的产品. 有人说这些基准测试是不准确的,因为在这样那样的环境下,做的比较不一致.我倾向同意基准 ...

随机推荐

  1. 【github&&git】3、git图像化界面GUI的使用

    GIT学习笔记 一.        基础内容 1.git是一个版本控制软件,与svn类似,特点是分布式管理,不需要中间总的服务器,可以增加很多分支. 2.windows下的git叫msysgit,下载 ...

  2. java_有秒计时的数字时钟

    题目内容: 这一周的编程题是需要你在课程所给的时钟程序的基础上修改而成.但是我们并不直接给你时钟程序的代码,请根据视频自己输入时钟程序的Display和Clock类的代码,然后来做这个题目. 我们需要 ...

  3. 详解promise、async和await的执行顺序

    1.题目和答案 一道题题目:下面这段promise.async和await代码,请问控制台打印的顺序? async function async1(){ console.log('async1 sta ...

  4. Django Rest framework 之 权限

    django rest framework 之 认证(一) django rest framework 之 权限(二) django rest framework 之 节流(三) django res ...

  5. 2018-01-15 History in Threads: 火狐插件实现浏览历史按主题显示(树)

    History in Threads似乎是唯一一个业余项目里有确认用户的. 大部分JavaScript源码(300+行)也用了中文命名. 插件功能很简单, 就是根据网页点击顺序生成树, 每个树可以认为 ...

  6. 【读书笔记】iOS-设计模式

    一个可复用的解决方案,用于处理特定场景下的常见问题.一种设计模式并不是一个可以直接转化为代码的已完工设计.它是对于如何解决问题的一种描述或者模板,可以用在许多不同的场合. 参考资料:<iOS W ...

  7. IntelliJ idea连接操作DB2数据库

    一.场景 一直都是用navicat作为数据库的连接工具,但是navicat不支持连接DB2,网上也推荐很多其它软件工具,但是因为DB2用的场景不多,这次只是开发etl工具需要测试数据库,正好发现ide ...

  8. SSM环境搭建

    流程 1,maven 依赖 2,spring 配置文件 3,mybatis 配置文件 4,springMVC 配置文件 5,web.xml pom依赖 1,定义版本 <properties> ...

  9. 自定义控件详解(二):Path类 相关用法

    Path:路径 绘制路径:void drawPath (Path path, Paint paint) Path 可以绘制的路径 一.直线路径 1.基本方法 void moveTo (float st ...

  10. 安卓开发_浅谈Fragment之ListFragment

    ListFragment,即Fragment的一个子类,当我们用的一个Fragment只需要一个listview视图的时候使用 该类有几个特点: 1.ListFragment 本身具只有一个ListV ...