swift-类属性-MachO读取

news2025/1/16 19:08:25

上一篇 swift-类属性 为源码层面类属性结构剖析,接下来从MachO层面验证读取类属性内容

极简类结构

	class IFLPerson2 {
	    var age: Int = 20
	    var heigh: Double = 180
	}

MachO-__swift5_types读取

    var size: UInt = 0
	//__swift5_types section 的pFile
	var ptr = getsectdata("__TEXT", "__swift5_types", &size)
	print("ptr: __swift5_types")
	print(ptr)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

通过 api - getsectdata(“__TEXT”, “__swift5_types”, &size)

读取到 __swift5_types 指针基址

__swift5_types 指针基址 + 存储的内容 对应着 类结构中的 type metadata

也就是 Metadata 结构 首地址

在这里插入图片描述

    // 计算当前链接地址
	var setCommond64Ptr = getsegbyname("__LINKEDIT")
	var linkBaseAddress: UInt64 = 0
	if let vmaddr = setCommond64Ptr?.pointee.vmaddr, let fileOff = 
		setCommond64Ptr?.pointee.fileoff{
	    linkBaseAddress = vmaddr - fileOff
	}
	print("linkBaseAddress: vmaddr - fileOff")
	print(linkBaseAddress)      // 0x100000000
	
	// 减去虚拟基址的结果 -  __swift5_types 左侧的基址
	var offset: UInt64 = 0
	if let unwrappedPtr = ptr{
	    // Int 两次转换 转换为UInt64, 因为没有直接转的方法
	    let intRepresentation = 
	    	UInt64(bitPattern: Int64(Int(bitPattern: unwrappedPtr)))
	    offset = intRepresentation - linkBaseAddress
	    print("offset: intRepresentation - linkBaseAddress")
	    print(offset)
	}

在这里插入图片描述
linkBaseAddress = 4294967296 == 0x100000000,也就是 虚拟偏移基址

offset 31668 == 0x7BB4 也就是 MachO中 __swift5_types 基址

第一个4字节存储的内容

08 F7 FF FF 小端读取 就是 0xFFFFF708

在这里插入图片描述
4294998964 转换成16进制 就是 0x100007BB4

0x100007BB4 - linkBaseAddress: 0x100000000 = 0x7BB4

0x7BB4 + 0xFFFFF708 = 0x1000072BC

0x1000072BC - linkBaseAddress: 0x100000000 = 0x72BC

MachO -__const读取

这里 const 里存储的是 初始化过的常量信息,当然包括类结构初始化metadata结构
在这里插入图片描述

从上一步的 metadata 结构 首地址偏移 4个4字节位置开始为 FieldDescriptor结构地址

0x7BB4 + 0xFFFFF708 = 0x1000072BC

在这里插入图片描述
4294996668 转换为16进制 就是 0x1000072BC

0x1000072BC - 虚拟偏移基址0x100000000 = 0x72BC

在这里插入图片描述

0x72BC 从 50 00 00 80 这个位置开始

在这里插入图片描述

从 50 00 00 80 偏移 4个4字节 得到 1C 07 00 00

内存中为小端模式(高位数据存储到内存低位,低位数据存储到内存高位)存取, 反向读取就是 0x0000071C

基址 0x72CC + 0x0000071C = 0x79E8

也就是前面提到的 metada结构中的 FiledDescriptor结构

在这里插入图片描述

MachO - 类名的读取

在这里插入图片描述

在这里插入图片描述
29360 转换为16进制 -> 0x72B0

0x72B0 就是 类名的地址

FieldRecord读取

在这里插入图片描述

FieldDescriptor 从第一个字节存储的内容 50 FE FF FF

按照FieldDescriptor结构偏移 4个4字节 -> 0x79F8

就是 首个FieldRecord 结构了

在这里插入图片描述

0x79F8 地址结构 按照 FieldRecord 结构 偏移到 第3个4字节处 也就是 0x7A00 FieldName

0x7A00 + 0xFFFFFE90 = 0x100007890

0x100007890 - 虚拟偏移基址0x100000000 = 0x7890

MachO - __swift5_reflstr 读取

在这里插入图片描述

获取FieldDescriptor 指针

在这里插入图片描述

在这里插入图片描述
stride : 前面偏移过的个FieldRecord结构 所占内存大小 为 3个4字节即 12字节的倍数

fieldNameRelactiveAddress: FieldRecord 的 fieldName的地址,

FieldRecord结构中的fieldName 为真正属性name的偏移

所以最终name的读取需要 fieldNameRelactiveAddress + fieldName(为name的偏移)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Alibaba内部传出的面试秘技,秋招offer尽收囊中

又逢“金九银十”,年轻的毕业生们满怀希望与忐忑,去寻找、竞争一个工作机会。已经在职的开发同学,也想通过社会招聘或者内推的时机争取到更好的待遇、更大的平台。 然而,面试人群众多,技术市场却相对冷淡,…

修改Cmder默认命令提示符

修改Cmder默认命令提示符常规操作第二种方法我的方法参考常规操作 打开在Cmder目录下的vendor文件夹,编辑里面的clink.lua文件找到local lambda “λ”,将“λ”修改为“$”,如图(图片来源:https://www.jianshu.com/…

11月“图无处不在”线上直播 - Neo4j宣布下一代图数据平台Neo4j 5上线

中国北京,2022年11月10日—— 图技术的领导者Neo4j 宣布下一代可用于云端的图数据平台Neo4j 5上线。在传统数据库的基础上,扩大了原生图的性能优势,同时在本地、云、混合云或多云部署中实现更高可扩展性,从而使企业能够更快地创建…

Java 集合---尚硅谷Java入门视频学习

问题:什么时候需要一个容纳数据的容器,也就是集合对象? Java集合框架中就包含了对不确定个数的数据处理的集合类问题:如果只是为了容纳数据,可以是直接使用数组,为什么要学习集合? 数组使用起来…

【论文阅读】多模态模型CoCa

Introduction 在这项工作中,我们统一了单编码器、双编码器和编码器-解码器范式,并训练了一个包含三种方法优点的图像-文本基础模型。我们提出了对比Captioner模型(CoCa),该模型采用经过对比损失和captioning损失训练的编码器-解码器架构。如图…

C语言源代码系列-管理系统之职工工资管理系统

往期文章分享点击跳转>《导航贴》- Unity手册,系统实战学习点击跳转>《导航贴》- Android手册,重温移动开发 👉关于作者 众所周知,人生是一个漫长的流程,不断克服困难,不断反思前进的过程。在这个过…

数据存储策略——lsm-tree

文章目录一、背景二、lsm-tree简介三、lsm-tree设计思想四、lsm-tree原理1.写操作2.读操作3.有序表持久化4.后台压缩五、lsm-tree的应用六、lsm-tree优缺点分析总结一、背景 由于传统机械磁盘的原理,它在读写时有个寻道的操作,在读写时都需要消耗一个寻…

基于PHP+MySQL网上报名系统的设计与实现

一直以来如何更好的实现校园现代化和信息化是当前很多高校一直探索的问题,随着时代的发展,高校内各类考试和报名也越来越多,如何通过互联网直接进行在线报名是本系统研究的一个重点内容。 本系统是一个网上报名系统,为了能够更加灵…

[计算机毕业设计]机器学习的数据驱动股票价格预测

前言 📅大四是整个大学期间最忙碌的时光,一边要忙着准备考研,考公,考教资或者实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过…

财政政策与货币政策(下)

财政政策与货币政策(下) – 潘登同学的宏观经济学笔记 文章目录财政政策与货币政策(下) -- 潘登同学的宏观经济学笔记粘性价格下的货币经济总供给曲线总供给曲线斜率与价格粘性菲利普斯曲线的消失货币政策的“动态不一致”财政政策与货币政策的配合财政主导 vs. 货币主导恶性通…

【学习记录】实例分割的发展与区别

【学习记录】实例分割的发展与区别 参考于《The Evolution Of Instantce Segmentation》 文章目录【学习记录】实例分割的发展与区别发展历程RCNNFast RCNNMultipath NetworkFaster RCNNMask RCNN发展历程 RCNN 开发集成了RCNN技术产生了AlexNet,以及使用选择性搜索…

浅谈App的启动优化

1. 应用启动的方式 在Android中,应用启动一般可分为三种:冷启动、温启动、热启动。 那么什么是冷启动、温启动和热启动呢?下面我们来简单看一下它们的定义: 冷启动:当启动应用时,后台没有该应用的进程。这…

Allegro导入导出设计数据操作指导

Allegro导入导出设计数据操作指导 Allegro有个非常好用的功能,就是支持设计数据的导入和导出,让协同设计变得更加方便,具体操作如下 以下面的设计数据为例,需要把这些数据导入到另外一个版本中 点击file-export-subdrawing Options所有的项目都勾选起来 Find选择需要导…

linux笔记(7):东山哪吒D1H使用framebuffer控制HDMI直线

文章目录1.测试流程和结果1.1 使能HDMI1.2 framebuffer操作流程1.3 测试结果2.测试过程详述2.1 编译源码2.2上传可执行文件2.3修改文件的权限,执行文件3.源码解释3.1 HDMI使用的颜色格式是ARGB4.源码工程链接这部分linux笔记是记录我入门的过程,内容基本…

【Flutter】【widget】Table 表格widget

文章目录前言一、Table 是什么?二、使用步骤1.Table 基础使用2.宽度3.设置边框4.TableCell设置单元格式widget等其他设置总结前言 Table 表格widget,其实很少使用到的,等有需要的时候在查看该widget 一、Table 是什么? 表格widg…

Trino源码Gitlab CICD单测环境建设

在中大型公司,由于对Presto源码的定制魔改量越来越大,会随着时间推移而增大出现冷门bug的概率,所以建立一套自动测试机制,在魔改源码合入主分支时可以自动触发test case,通过特定单测的执行失败,来更清晰的…

多云管理产品组合VMware Aria,开启多云管理新篇章

今年8月份,VMware Explore美国大会上宣布了多云管理产品组合VMware Aria,宣布之后,市场上关注度非常高,而且受到了热捧。Aria这个名字动听且贴切,中文意思是 “咏叹调”,也就是说要用统一的、一致的曲调来歌…

big.LITTLEDynamIQ

最近看到了DynamIQ,于是来了解一下什么是DynamIQ? 前言 首先要知道DynamIQ,那么你肯定得知道big.LITTLE。因为DynamIQ可以说是big.LITTLE新一代或者是升级版。 那么在这之前你肯定得知道什么是big.LITTLE? 然后知道了后你就会…

旋转框目标检测mmrotate v0.3.1 训练DOTA数据集(三)——配置文件优化技巧

1、 目标检测比赛中的tricks DOTAv2遥感图像旋转目标检测竞赛经验分享(Swin Transformer Anchor free/based方案) 目标检测比赛中的tricks(已更新更多代码解析) 水下目标检测算法赛解决方案分享 | 2020年全国水下机器人&#xf…

基于布谷鸟搜索混合灰狼优化算法求解单目标优化问题(AGWOCS)

👨‍🎓个人主页:研学社的博客 💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜…