Mach-O详解(一) - 破题
什么是Mach-O
Mach-O: Mach Object
布拉布拉…,概念没意思,反正就是一可执行文件
ios中的常见的.o .a .dylib Framework dyld dsym 都是Mach-O
抽象概念
是一种可执行文件,用于目标代码,动态库,内核转储
每个Mach-O文件包括一个Mach-O头,一系列的载入命令,多个块
Mach Header: 描述 Mach-O 的CPU架构、文件类型、加载命令等信息
Magic Number 32位/64位架构
File Type 文件类型 - 其实就是可执行文件
Number of Load Commands 加载的Commands有多少个命令
Size of Load Commands 加载命令的内存大小
Flags 标识 系统加载有没有关系/链接/两级命名空间(通过两级命名空间将符号编码成 对象:符号 的两级名字,这样不同的动态库就避免了符号冲突)…
Load Commands: 描述文件中数据等具体组织结构,不同数据类型使用不同等加载命令表示
其实就是一张包含很多内容的表,内容包括区域的位置、符号表、动态符号表等
LC_SEGMENT_64 将文件中(32位或64位)的段映射到进程地址空间中
当然了,点开 LC_SEGMENT_64,还会看见更细节的内容,命令的执行需要依赖一些记录信息 代码 常量 其他数据类型等等 比如 LC_SEGMENT_64 类型的加载命令
VM Address 虚拟地址
VM Size 虚拟地址大小
File Offset 文件偏移
File size 文件大小
Maximum VM Protection 就是最大能使用的大小,因为不能操作物理内存,系统会分配一个最大的进程空间,只能通过虚拟空间 + offset的方式去映射物理内存,永远不会超过系统分配的边界
Number of Sections 加载进内存的section数量
LC_DYLD_INFO_ONLY 动态链接相关信息
LC_SYMTAB 符号地址
LC_DYSYMTAB 动态符号表地址
LC_LOAD_DYLINKER dyld加载
LC_UUID 文件的UUID
LC_VERSION_MIN_MACOSX 支持最低的操作系统版本
LC_SOURCE_VERSION 源代码版本
LC_MAIN 设置程序主线程的入口地址和栈大小
LC_LOAD_DYLIB 依赖库的路径,包含三方库
LC_FUNCTION_STARTS 函数起始地址表
LC_CODE_SIGNATURE 代码签名
Data: Data中每一个段(Segment)的数据保存在此,段用来存放数据和代码
Data 区主要就是负责代码和数据记录的
Mach-O 是以 Segment 这种结构来组织数据的, 一个 Segment 可以包含 0 个或多个 Section
Segment 中 section 就可以被解读为是代码,常量或者一些其他的数据类型
在装载在内存中时,也是根据 Segment 做内存映射的
TEXT.text: 机器码
TEXT.cstring: 硬编码的字符串
TEXT.const: 初始化过的常量
DATA.data: 初始化过的可变的(静态/全局)数据
DATA.const: 没有初始化过的常量
DATA.bss: 没有初始化过的 (静态/全局)变量
DATA.common: 没有初始化过的符号声明
Section64(__TEXT,__text) 存放的就是代码的指令 汇编指令
Section64(__TEXT,cstring) 存放的就是硬编码的字符串
Section64(__DATA_CONST,__objc_classlist) OC中的类都记录在此section
Section64(__TEXT,__swift5_types) swift中的类都记录在此section 包含结构体 enumor 或者 类的descriptor(地址信息)
操作一番,稍微看下具体mach-o 与 实际代码中关系
目前操作的是swift代码,此篇博客重在初步感知下Mach-O,所以具体swift的类结构暂不涉及
此后会专门写博客探究源码层面的结构
拿出计算器,当前是arm架构,小端模式
得到一个地址 , 此时发现前缀是个 0x100000000 这样的地址
在ios中,这个地址是 常量数据的存放地址, 验证一下
通过lldb调试,image list,读取镜像,得到虚拟偏移首地址,这里跟 上面Mach-O PageZero中记录的虚拟内存首地址 不一样,只是此处恰好相等而已
现在用计算器中的值 减去Mach-O中读取的虚拟首地址, 得到0x3E0C,
上Mach-O Segments部分 常量Section里看下
这里读出的偏移地址 0x00AC 与 前面得到的 0x3E0C 相加,得到 0x3EB8
这个结果 加上 刚才app启动时,lldb - image list拿到的偏移地址 0x100000000
(再次注意 -
这个值跟Mach-O中 虚拟首地址不一样,只是恰好相等了而已,Mach-O中的那个值是固定的,而此处的之个虚拟首地址值每次启动app都会变,就是所谓的ASLR,随机偏移地址)
得到 0x100003EB8, 回到调试,打开汇编,读下寄存器
— 失败,刚才调试,类没有定义方法,临时加了一个 test_func(), 只好复刻下上面的操作,有的时候,事情总出点纰漏,出错不怕,能补漏就好
复习一遍
__swift5_types 中的 基址 + 相对地址
减去 PageZero中记录的虚拟地址首地址 得到 0x3DFC
上面得到的 0x0012 的 (基址0x3E30 + ASLR(app启动内存随机偏移 0x100000000) + 4字节偏移 + 得到的0x0012) = 0x3E46
具体是不是这样呢,时间关系,下一篇博客我通过寄存器验证,然后紧接着从验证结果入手,分析swift中的底层结构
Mach-O详解(一) - 破题相关推荐
- 青少年编程scratch一级-熟悉编程软件(答案及详解+线上题库答题)
线上题库答题+自动评卷 https://blog.csdn.net/zhengzyx2040/article/details/118388826 scratch一级-熟悉编程软件试题 [熟悉编程软件] ...
- 匈牙利算法——最大匹配问题详解(附模板题)
基本概念转自 https://blog.csdn.net/dengheCSDN/article/details/77619308 匈牙利算法是由匈牙利数学家Edmonds于1965年提出,因而得名. ...
- 国际人工智能联合会理事会主席杨强详解JDD赛题玄机
11.11剁手结束了,就算你没剁手,女朋友.媳妇们剁了没?现在,一个机会摆在你的面前,一个改变命运的时刻就要到来,让你天天剁手都不再畏惧! 京东金融于11月6日正式启动首届"JDD-2017 ...
- C puzzles详解【13-15题】
第十三题 int CountBits(unsigned int x){int count=0;while(x){count++;x = x&(x-1);}return count;} 知识点讲 ...
- 【数据结构和算法笔记】递归详解(附题)
一个递归模型由递归出口(3)和递归体(2)组成 递归转为非递归: 任何能正确执行的递归算法都能转换成功能等价的非递归算法 ●尾递归算法可以通过循环或者迭代的方式转换为等价的非递归算法 ●不是尾递归的 ...
- 攻防世界杂项(misc)--新手练习区(详解十二道题完结,附件做题过程中使用到的各种工具和网站)
攻防世界杂项(misc)–新手练习区(详解) 第一题:this_is_flag 题目描述:Most flags are in the form flag{xxx}, for example:flag{ ...
- 2013第四届蓝桥杯JavaA组省赛真题详解
蓝桥杯历年省赛真题汇总及题目详解 蓝桥杯历年决赛试题汇总及试题详解 目录 第一题:世纪末的星期 第二题:振兴中华 第三题:梅森素数 第四题:颠倒的价牌 第五题:三部排序 第六题:逆波兰表达式 第七题: ...
- C语言学习笔记—P13(操作符详解<1>+图解+题例)
目录 前言:●由于作者水平有限,文章难免存在谬误之处,敬请读者斧正,俚语成篇,恳望指教! --By 作者:新晓·故知 操作符详解<1>: 题例: 1. 操作符分类: 算术操作符 移位操作 ...
- Popular Cows POJ - 2186(tarjan算法)+详解
题意: 每一头牛的愿望就是变成一头最受欢迎的牛.现在有 N头牛,给你M对整数(A,B),表示牛 A认为牛B受欢迎.这种关系是具有传递性的,如果 A认为 B受欢迎, B认为 C受欢迎,那么牛 A也认为牛 ...
最新文章
- 张仰彪第二排序法_C语言中的最常用的两种排序算法你知道吗?
- VoIP败家子的游戏
- Mobile first! Wijmo 5 + Ionic Framework之:Hello World!
- TensorFlow创建tensor语句
- MySQL中left join、right join与inner join的区别
- 安卓欢迎界面和activity之间的跳转问题
- require.js的基本用法
- 【转】[caffe]深度学习之图像分类模型AlexNet解读
- UML学习总结(2)——StartUML 各种类图的例子
- Flask—10-项目部署(02)
- 静态编译和动态编译的区别【转】
- 安卓蓝牙键盘按键映射_键盘按键映射器安卓版
- 前后端分离单页面应用(SPA)项目示例(Vue+ElementUI+Axios+Django+MySql)
- RXJS Operators
- 中南大学计算机学院2021复试名单,中南大学2021各学院研究生拟录取名单链接汇总!...
- python pymysql mysql保存表情符
- 带你打开C语言的大门
- 华宇智能数据官网全新上线,赋能行业数字化转型
- 红盟过客 我与linux的故事
- 深度解析|硬盘协议大全,终于搞明白SCSI、IDE、FC、SATA……
热门文章
- Hello C++(十四)——C++类成员函数调用分析
- 毕业设计-基于微信小程序的学生自我评价系统
- 关于Statement和Prestatement区别
- 夜光带你走进JavaScript(四十六)擅长的领域
- ElementUI框架引入和使用
- html字段后面加个红星,数字报纸HTML版本
- 西部数据移动硬盘计算机无法识别,西数移动硬盘无法识别,没有盘符,插上电脑假死!!急急急!!100分!!...
- python 网页游戏 渲染_WebRender:让网页渲染如丝顺滑
- linux下c语言聊天室程序,纯C语言Socket实现聊天室
- 论提高班毕业生为何愿意继续深造