Mach-O详解(一) - 破题

news/2024/5/16 6:27:06/文章来源:https://blog.csdn.net/qq_42431419/article/details/126616126

什么是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中的底层结构

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_3493.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

今天来说说Java开发中常用的框架有哪些?

什么是框架 “框架(Framework)”一词最早出现在建筑领域,指的是在建造房屋前期构建的建筑骨架。在编程领域,框架就是应用程序的骨架,开发人员可以在这个骨架上加入自己的东西,搭建出符合自己需求的应用系统…

超全面试汇总——Hadoop(二)

超全面试汇总——Hadoop(二) 谈谈什么是Hadoop?MapReduce分布式计算shuffle流程shuffle阶段的数据压缩机制了解吗MapReduce实现基本SQL操作的原理 1. Join的实现原理2. Group By的实现原理3. Distinct的实现原理 一个文件有上亿url,内存很小…

Python编程快速上手 PDF高清版下载

《Python编程快速上手》PDF高清版免费下载地址内容简介 如今,人们面临的大多数任务都可以通过编写计算机软件来完成。Python是一种解释型、面向对象、动态数据类型的高级程序设计语言。通过Python编程,我们能够解决现实生活中的很多任务。 本书是一本面向实践的Python…

91.(leaflet之家)leaflet态势标绘-进攻方向绘制

听老人家说:多看美女会长寿 leaflet之家总目录(订阅之前建议先查看该博客) 文章末尾处提供保证可运行完整代码包,运行如有问题,可“私信”博主。 效果如下所示: 下面献上完整代码,代码重要位置会做相应解释 <!DOCTYPE html> <html>

HXAPIGate系列——HXAPIGate快速入门

1. HXAPIGate网关简介 HXAPIGate&#xff08;中文名&#xff1a;浩心API网关&#xff09;&#xff0c;其核心能力在于对API微服务的零侵入&#xff0c;使用HXAPIGate代理微服务API接口时&#xff0c;微服务建设只需要进行纯粹的业务代码实现即可&#xff0c;不需要考虑任何权限…

广州地铁将在十三号线、二十一号线新增5个地铁口,位置在这里

作为天选打工人不得不感叹一句&#xff1a; 广州地铁yyds &#xff01;而最近广州地铁有了许多新消息朋友们可不能不知道呀。 近日&#xff0c;广州公共资源交易中心发布了《广州市轨道交通十三号线首期、二十一号线部分车站出入口及零星工程勘察设计服务项目公告简要》&#x…

Dilated Convolution(空洞卷积、膨胀卷积)详解

&#x1f34a;作者简介&#xff1a;秃头小苏&#xff0c;致力于用最通俗的语言描述问题 &#x1f34a;往期回顾&#xff1a;目标检测系列——开山之作RCNN原理详解    目标检测系列——Fast R-CNN原理详解   目标检测系列——Faster R-CNN原理详解 &#x1f34a;近期目标&a…

linux常用的通配符与正则表达式

我们在很多地方都会用到通配符和正则表达式来实现我们的日常操作,提高我们的工作效率。但是很多新伙伴,往往容易将他们弄混。 首先我们需要知道通配符和正则表达式的使用场景: 通配符也叫文件名替换,它主要是作用于匹配文件名,常用命令是ls、find、cp、mv; 正则表达式主要…

视觉SLAM十四讲学习笔记--第七讲视觉里程计学习笔记总结(1)

专栏系列文章如下&#xff1a; 视觉SLAM十四讲学习笔记-第一讲_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习笔记-第二讲-初识SLAM_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习笔记-第二讲-开发环境搭建_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习笔记-第三讲-旋转矩阵和Ei…

Springboot人体健康检测微信小程序毕业设计-附源码012142

摘 要 本文设计了一种基于微信小程序的人体健康检测小程序&#xff0c;主要为人们提供了方便的各项健康检测服务&#xff0c;包括健康数据编辑、健康科普、健康讨论、注册登录功能等&#xff0c;用户能够方便快捷地查看健康科普知识、进行健康数据信息的上传等。人体健康检测微…

(附源码)ssm医药销售管理系统 毕业设计 042322

SSM医药销售管理系统 摘 要 随着社会的发展&#xff0c;社会的方方面面都在利用信息化时代的优势。互联网的优势和普及使得各种系统的开发成为必需。 本文以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法&#xff0c;它主要是采SSM技术和mysql数据库来完成对系统的…

[JavaEE系列] Thread类的基本用法

文章目录线程创建第一类: 继承 Thread 类继承 Thread 类, 重写 run 方法使用匿名内部类, 继承 Thread 类, 重写 run 方法第二类: 实现 Runnable 接口实现 Runnable 接口, 重写 run 方法使用匿名内部类, 实现 Runnable 接口, 重写 run 方法第三类: 使用 lambda 表达式启动线程比…

java基于springboot+vue的在线求助系统

随着时代的发展&#xff0c;越来越多的人需要帮助&#xff0c;尤其是对一些孤寡老人和婴幼儿&#xff0c;儿童来说因为身体机能的缺陷等因素&#xff0c;更是希望得到更多的人的帮助。更让需要帮助的能够在线求助&#xff0c;为了让想要帮助别人的人能够在线看到别人的需求&…

17.EC实战 开发板开发环境搭建、程序烧录及运行代码过程

文章目录 前言EC源代码下载并搭建编译环境固件烧录程序的执行前言 去年的博文 基于ITE12.4代码的编译环境搭建 ,本文将在此基础上进行实战练习,基于我们之前做的EC开发板,EC芯片使用的是ITE8987,本教程将实现开发板开发环境搭建、程序烧录及运行代码过程。 首先介绍一下开…

Django简介(基本操作命令|目录结构|小白三板斧)

文章目录一、Django框架简介二、Django基本操作命令三、命令行与Pycharm操作的区别四、Django目录结构五、Django小白必会三板斧一、Django框架简介 1.版本问题1.X&#xff1a;同步 现在都不使用了同步速度慢2.X&#xff1a;同步 现在基本都使用同步速度慢3.X&#xff1a;异步…

zookeeper核心源码分析

zookeeper server单机启动流程 (1) 加载zookeeper配置文件zoo.cfg(2) 创建Jetty Admin Server监听&#xff08;监听zk server&#xff09;(3) 创建ServerCnxnFactory&#xff08;默认是NIO&#xff0c;可以配置为Netty&#xff09;(4) ServerCnxnFactory启动(5) 第一次启动zk …

smile——Java机器学习引擎

资源 https://haifengl.github.io/ https://github.com/haifengl/smile 介绍 Smile(统计机器智能和学习引擎)是一个基于Java和Scala的快速、全面的机器学习、NLP、线性代数、图形、插值和可视化系统。 凭借先进的数据结构和算法,Smile提供了最先进的性能。Smile有很好的文档…

22-08-30 西安JUC(03) Callable接口、阻塞队列4套方法、ThreadPool线程池

Callable接口 1、为什么使用Callable接口 Thread和Runnable 都有的缺点&#xff1a;启动子线程的线程 不能获取子线程的执行结果&#xff0c;也不能捕获子线程的异常 从java5开始&#xff0c;提供了Callable接口&#xff0c;是Runable接口的增强版。用Call()方法作为线程的执…

【Go-Lua】Golang嵌入Lua代码——gopher-lua

Lua代码嵌入Golang Go版本&#xff1a;1.19 首先是Go语言直接调用Lua程序&#xff0c;并打印&#xff0c;把环境跑通 package mainimport lua "github.com/yuin/gopher-lua"func main() {L : lua.NewState()defer L.Close()// goerr : L.DoString(print("go g…

WebRTC系列-SDP之setLocalDescription(2)

文章目录 1. setLocalDescription整体流程总结2.几个channel的含义3. 音频流水线的建立3.1 signal线程流程3.2 work线程流程在上一章从源码的角度分析了WebRTC的setLocalDescription的代码调用流程及相关函数,这一章从一张图总结其核心函数调用;同时多上篇遗留的多个channal关…