首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Mach-O文件结构

Mach-O文件 Mach-O文件是iOS,iPadOS、macOS平台的可执行文件格式。...; 几乎所有的Mach-O文件都包含3个segment __TEXT:代码,只读可执行,存储函数的二进制代码(__text),常量字符串(__cstring),OC的类/方法名等信息 __DATA...:数据, 可读可写,存储OC的字符串(__cfstring),以及运行时的元数据:class/protocol/method,以及全局变量,静态变量等; __LINKEDIT:只读,存储启动App需要的信息...,如 bind & rebase 的地址、函数的名称和地址等信息; 2.源码分析 在Data区中,Section占了很大的比例,而且在Mach-O中集中体现在__TEXT和__DATA两里。...文件时,经常会看到内存地址相关的内容,这里就涉及到了大小端模式的概念; 小端模式:数据的低字节,保存在内存的低地址; 大端模式:数据的低字节,保存在内存的高地址; iOS设备的处理器是基于ARM架构的,

1.3K20
您找到你想要的搜索结果了吗?
是的
没有找到

Mach-O相关概念

一、什么是Mach-O Mach-O是Mach Object的缩写,是Mac/iOS上用于存储程序、库的标准格式 二、属于Mach-O格式的文件类型 xnu内核源码-loader.h文件 #define...,最为重要,常见的有: 常见Segment 含义 __TEXT 代码/只读数据 __PAGEZERO __PAGEZERO 是在可执行文件有的,动态库里没有。...这个开始地址为0(NULL指针指向的位置),是一个不可读、不可写、不可执行的空间,能够在空指针访问时抛出异常。...该段是只可读,不可写不可执行 __OBJC 包含会被Objective Runtime使用到的一些数据。...5.2.3 Section 常见的section Section 含义 __text 主程序可执行的机器码 __stubs 用于动态库链接的桩,本质上是一小会直接跳入lazybinding

90510

HOOK原理

系统进程一旦出错,可能导致整个进程崩溃,崩溃后就会造成iOS瘫痪。...对于MachO中的代码(__TEXT)来说,它是只读的。在运行时,无法直接修改外部函数的真实地址。...为了解决上述情况,苹果采用PIC技术(位置独立代码),当调用外部函数时,在编译阶段,会在MachO的可读可写数据,定义符号,占8字节,用来存放外部函数的地址。但在编译阶段暂存的是占位地址。...s打印 0x62A8的内容位于__TEXT的__stubs中,__stubs称为符号桩,它的本质就是一代码,用于跳转到懒加载符号表中,找到对应符号的值。...Cydia Substrate,主要作用是针对OC方法、C函数以及函数地址进行HOOK操作 外部符号调用流程,以NSLog为例 【第一步】通过代码__TEXT中__stubs(桩)中addr确定桩的地址

99620

今日头条 iOS 安装包大小优化 - 新阶段、新实践

今日头条在继续探索包大小优化时实践了更多思路,包括构建配置、图片压缩、__TEXT 迁移、二进制压缩等。这些优化项在业务入侵较少的前提下给今日头条带来了显著的包大小收益。...[图:Asset Catalog] 1.2、Mach-O 文件 Mach-O 文件是 iOS 上的可执行文件,它是由代码源文件经过编译和静态链接获得。...3.5、__TEXT 迁移 安装包经过压缩后的 Download Size 若超过 200 MB,在蜂窝网络下载 App 就会受到限制,这对新增会有较大影响。...在 2020 年下半年,我们探索实践了 TEXT 迁移技术:在链接阶段使用 -rename_section 选项将 `TEXT,text迁移到BD_TEXT,__text`,减少苹果对可执行文件的加密范围...3.6、二进制压缩 Mach-O 文件占据了 Install Size 中很大一部分比例,但并不是文件中的每个/节在程序启动的第一时间都要被用到。

1.8K00

iOS强化 : 熟悉 Mach-O 文件

前言 ---- 关于 Mach-O 文件,在iOS App 加载流程知识中已经提到过。 整体结构大致如下: ?...Mach-O 定义 ---- Mach-O(Mach Object)是 macOS、iOS、iPadOS 存储程序和库的文件格式。...Mach-O 格式用来代替 BSD 系统的 a.out 格式。Mach-O 文件格式保存了在编译过程和链接过程中产生的机器代码和数据,从而为静态链接和动态链接的代码提供了单一文件格式。...(符号表) 由此我们知道,可执行文件只是Mach-O的一种,因此我们将Mach-O文件分为以下几种: 名称 注释 Mach-O Object 目标文件 Mach-O ececutable 可执行文件...:__TEXT 和 __DATA __TEXT 代码的读取是从__TEXT开始读取的,其中不同的__TEXT代表的意思如下: 注释 __DATA __DATA在内存中紧跟在__TEXT之后

1.1K40

深入iOS系统底层之映像文件操作API介绍

--《唐高骈·山亭夏日》 mach-o文件和进程的映像(image) iOS系统生成的可执行程序或者动态库文件的存储布局格式被称之为mach-o格式。...一个程序在构建时的基地址值可以在程序的第一个名为__TEXT的代码描述结构体struct segment_command中的vmaddr数据成员中获取,而程序被加载后的得到的映像的mach-o头部结构体...比如一个可执行程序中所有的代码都保存在名字为:__TEXT的代码中,而所有的数据都保存在名字为:__DATA的数据中。以页为边界进行对齐。 每个则由多个节(Section)组成。...和节操作的API在系统的libmacho.dylib库中实现,这个库暂时还没有开源出来。 1....unsigned long get_end(void); //获取当前进程可执行程序映像的第一个__TEXT的__text节的数据后面的开始地址。

1.4K10

启动时间的一些分析

2、链接:将编译产生的多个.o文件结合静态库、动态库进行链接,得到一个可执行文件,也叫Mach-O文件;​ ?...二、iOS如何启动App WWDC视频中对启动过程做了一些介绍,先看iOS 13以前用dyld2是如何启动App: ?...4、符号查找定位,下图是我们工程依赖的GLKit.framework,但是点开framework的所在文件夹,会发现只有头文件和一个tbd文件;tbd是text-based stub library的简称...iOS 13之后,系统提供的dyld3将启动过程的解析Mach-O文件的头部、解析动态库的依赖、符号查找定位的结果做了一个缓存,写到是disk中。...PageCache里有对应缓存,则会触发一个Page Cache Hit;(参考资料) Copy On Write 操作系统中的内存页存在共享的情况,如果某些页是只读,则一直是可以共享的;但是如果对一个可写的共享内存页进行写操作时

1.3K20

iOS 优化 - 瘦身

Apple __TEXT 大小限制: iOS 7 之前,二进制文件中所有的 __TEXT 总和不得超过 80 MB; iOS 7.X 至 iOS 8.X,二进制文件中,每个特定架构中的 __TEXT...不得超过 60 MB; iOS 9.0 之后,二进制文件中所有的 __TEXT 总和不得超过 500 MB。...png 为有效图像定义的文件扩展名以及内部文件结构,但符合 PNG 的查看和编辑软件不再能够处理它们; 增加了一个 iDot 数据块,是 Apple 自定义的数据块,暂时不知其作用; 其本质是使正常的...二进制压缩:Mach-O 文件中并不是每个 / 节在程序启动的第一时间都要被用到。...**TEXT 迁移:将可执行文件的 **TEXT 中的部分节移动到其它的,提高了可执行文件的压缩效率。

2.5K20

深入iOS系统底层之静态库介绍

iOS系统的目标文件也是一种mach-o格式的文件,mach-o文件的头部结构体:struct mach_header中的filetype成员字段用来描述当前文件的类型,目标文件所对应的类型是MH_OBJECT...目标文件中的布局结构和内容和可执行文件中的布局结构和内容非常相似,编译后形成的目标文件中的代码(__TEXT Segment)中的节(__text Section) 中的内容存放的是已经被编译为机器指令的二进制代码了...我们可以在可执行文件的mach-o文件的名字为__TEXT的这个LC_SEGMENT或者LC_SEGMENT_64中的load command定义中找到程序加载的默认的基地址。...名字为__TEXT的结构体struct segment_command中的vmaddr数据成员中的值保存的就是程序加载的默认基地址值,一般情况下可执行程序的默认基地址都是0x100000000。...因为在iOS系统中可以支持x64和arm两种体系结构,因此iOS系统中的静态库文件中还可以同时支持多种体系结构的目标文件的集合,我们称这种静态库文件之为fat格式的静态库文件。

1.2K52

IOS开发高级系列】dyld专题

Mach-O文件格式是OS X与iOS系统上的可执行文件格式,像我们编译过程产生的.O文件,以及程序的可执行文件,动态库等都是Mach-O文件。...LoadCommands:可以理解为加载命令,在加载Mach-O文件时会使用这里的数据来确定内存的分布以及相关的加载命令。...当Mach-O包含一个__RESTRICT/__restrict时,进程会被设置成受限。    ...recursiveRebase()则对映像完成递归rebase操作,该函数只是调用了虚函数doRebase(),doRebase()被ImageLoaderMachO重载,实际只是将代码设置成可写后调用了...la_symbol_ptr节区中,指向的是一代码,类似于如下的语句: push xxx jmp yyy         其中xxx是符号在动态链接信息中延迟绑定符号数据的偏移值,yyy则是跳转到_TEXT

61560

iOS编译原理

主要内容: 理解C、C++以及OC的关系 编译型语言与解释型语言 编译器LLVM与CLang 理解iOS编译流程 预处理 编译 汇编 链接 一、理解C、C++以及OC的关系 1.C语言 C语言是一门面向过程的计算机编程语言...clang,swift 的前端是 swiftc,但二者的后端都是 LLVM; 四、理解iOS编译流程 1.编译流程图 LLVM的编译过程相当复杂,iOS代码运行需要经过:预处理、编译、汇编、链接四个关键阶段...64-bit object x86_64 可以看到,汇编器生成Mach-O格式的文件,而且是object类型,即目标文件类型: Mach-O文件是用于iOS和OS平台上的文件类型; Mach-O作为...,__text) external _main 可以看到,此时我们使用的NSLog函数,对应着_NSLog符号: undefined:表示在当前文件暂时找不到符号_NSLog; external:表示这个符号是外部可以访问的...,__text) [referenced dynamically] external __mh_execute_header 0000000100003f40 (__TEXT,__text) external

1.6K20

APP生成与运行(二)

二、main函数启动之前 Mach-O可执行文件 Mach-O文件格式是 OS X 与 iOS 系统上的可执行文件格式,像我们编译过程产生的.O文件,以及程序的可执行文件,动态库等都是Mach-O文件。...Data,数据,包含load commands中需要的各个(segment)的数据,每一个Segment都得大小是Page的整数倍。...Main函数之前 Main函数之前是iOS系统的工作,所以这部分的优化往往更具有通用性。 dylibs 启动的第一步是加载动态库,加载系统的动态库使很快的,因为可以缓存,而加载内嵌的动态库速度较慢。...对于Objective C开发来说,主要的时间消耗在Class/Method的符号加载上,所以常见的优化方案是: 减少__DATA中的指针数量。 合并Category和功能类似的类。...静态库与动态库的区别 首先来看什么是库,库(Library)说白了就是一编译好的二进制代码,加上头文件就可以供别人使用。

1.2K10

(5)初识Mach-O

APP从开发到安装到手机的过程1 MJRefreshExample.app中的MJRefreshExample文件是iOS中的可执行文件,文件格式是Mach-O APP从开发到安装到手机的过程2 逆向APP...(dyld shared cache) 缓存文件路径:/System/Library/Caches/com.apple.dyld/dyld_shared_cache_armX 动态库的加载 在Mac\iOS.../dsc_extractor 动态库共享缓存文件的路径 用于存放抽取结果的文件夹 Mach-O Mach-O是Mach object的缩写,是Mac\iOS上用于存储程序、库的标准格式 属于Mach-O...(描述文件在虚拟内存中的逻辑结构、布局 ) Raw segment data(在Load commands中定义的Segment的原始数据 ) 窥探Mach-O的结构 命令行工具 file:查看...Mach-O的文件类型 file 文件路径 otool:查看Mach-O特定部分和的内容 lipo:常用于多架构Mach-O文件的处理 查看架构信息:lipo

1.1K40

探秘 Mach-O 文件

Mach-O 文件中可以有多个 Segment,每个 Segment 可能包含一个或多个 Section。 Data(数据区),Segment 的具体数据,包含了代码和数据等。...#define SEG_TEXT "__TEXT" // 代码,只读数据 #define SEG_DATA "__DATA" // 数据 #define SEG_LINKEDIT "__LINKEDIT...vmsize 的虚存大小 fileoff 在文件的偏移 filesize 在文件的大小 nsects 中有多少个 section 接着看看 section 的定义: [1240] __Text...__text 主程序代码 Text.__cstring c 字符串 Text.__stubs 桩代码 Text.__stub_helper Data.__data 初始化可变的数据 Data....写到这里,算是快速过了一遍 Mach-O 文件的基本概念,接着聊聊可以怎样减少项目的体积。 减少包大小 iOS 的包主要由可执行文件、资源文件(图片)等文件组成,所以可以从这两大头文件入手优化。

2.2K30

二、应用脱壳

ipa文件 6.1 一键快速脱壳 Frida-ios-dump的原理和dumpdecrypted一样,都是通过把内存中已解密的数据dump再修复Mach-O,但是dumpdecrypted仅能dump主程序...在学习Mach-O文件格式时讲过,LC_CODE_SIGNATURE加载命令存放的是一些与签名有关的数据,而里面最重要的是CSSLOT_CODEDIRECTORY和CSSLOG_ALTERNATE_CODEDIRECTORIES...,它们包含了代码的SHA-1和SHA-256校验信息。...所以我们需要根据校验原理编写一个mac端工具,它能自动修正签名的hash值,然后修改dump.py文件,让脚本在生成ipa文件之前先调用我们编写的工具。...七、使用lipo分离架构 前文已经说过了,最终脱壳出的文件架构和使用的iOS设备有关。Mach-O是胖文件格式,可能存在多种架构,那些没被脱壳的架构已经没有存在的意义,将其剔除还可以节省不少空间。

1.3K10

iOS符号化浅析

其内部数据是高度压缩的,可以通过 dwarfdump、otool 等命令提取其中的可读信息。通过 MachOView 打开 DWARF 后会发现其外层依旧是 Mach-O 格式。...0x000000010029e694 0x0000000100298000 + 26260 当然对于完整的 Crash 日志文件,我们可以利用symbolicatecrash工具比较方便的将整份日志文件进行符号化,这节暂时不对其进行介绍...加载 Mach-O 文件时为了安全使用了 ASLR(Address Space Layout Randomization) 机制,导致二进制 Mach-O 文件每次加载到内存的首地址都会不一样,但是计算规则是一致的...获取 dSYM 起始地址 otool -l iOSTest.app.dSYM/Contents/Resources/DWARF/iOSTest | grep __TEXT -C 5 执行命令后,结果如下...,可以看到 dSYM 中代码起始地址为 0x0000000100000000,一般情况下都为这个值。

1.8K41

iOS 裁包大作战 —— JOOX Music 如何瘦身40MB

典型的 Mach-O 通常主要由文件头(Header)、加载命令(Load Commands)以及具体数据(Segment & Section)组成。...Segment & Section : 主要包含代码、程序数据,内含我们需要的 OC类列表、被引用类列表、被引用方法列表等信息。用 MachOView 打开一个可执行文件查看到它的结构。...2.1.2.2 otoolotool 是一个反编译工具,可以提取并显示 iOS 可执行文件的相关信息,包括头部,加载命令,各个,动态库等。...具体实现参见 《iOS微信安装包瘦身》2.4 长文本、数据移到外部文件通过对 Mach-O 的了解,可以得知代码里的字符串常量是放在可执行文件的 __cstring ,如果有特别长的字符串、数据等,建议从代码中移除...微信安装包瘦身iOS可执行文件瘦身方法iOS APP可执行文件的组成基于clang插件的一种iOS包大小瘦身方案Xcode中和symbols有关的几个设置Mach-O可执行文件解读 Mach-O 文件格式减小

83640
领券