swift-类属性-MachO读取

上一篇 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的偏移)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 您可以通过以下步骤配置汇编语言环境: 1. 安装 Xcode 开发工具,可以在 App Store 中下载安装。 2. 打开终端,输入以下命令安装 Homebrew 包管理器: `/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"` 3. 使用 Homebrew 安装 NASM 汇编器: `brew install nasm` 4. 编写汇编代码,使用 NASM 编译器将代码编译成可执行文件: `nasm -f macho64 -o hello.o hello.asm` 5. 使用 ld 链接器将可执行文件链接成可执行程序: `ld -macosx_version_min 10.7. -lSystem -o hello hello.o` 6. 运行程序: `./hello` 希望这些步骤能够帮助您成功配置汇编语言环境。 ### 回答2: 要配置Mac笔记本的汇编语言环境,可以按照以下步骤进行: 第一步,安装Xcode。Xcode是苹果公司开发的一种集成开发环境(IDE),它包含了Mac OS和iOS开发所需的各种工具和库。前往App Store,搜索并下载Xcode,安装完成后打开应用程序。 第二步,安装命令行工具。在打开的Xcode应用程序中,点击菜单栏中的"Xcode",选择"Preferences"。在弹出的窗口中,选择"Locations"标签,在"Command Line Tools"下拉菜单中选择最新版本的命令行工具,并点击"Install"按钮进行安装。 第三步,安装汇编语言编译器。打开终端(Terminal)应用程序,在命令行中输入"brew install nasm",然后按下回车键。这将使用Homebrew包管理器自动下载和安装NASM(Netwide Assembler)编译器,它是一种常用的汇编语言编译器。 第四步,创建汇编源文件。在任意文本编辑器中创建一个新文件,并将其保存为".asm"扩展名的文件。例如,可以命名为"hello.asm"。 第五步,编写汇编源代码。在创建的汇编源文件中,使用汇编语言编写你想要的代码。例如,可以使用标准的x86汇编语言编写一个简单的"Hello, World!"程序。 第六步,编译和运行程序。在终端中,使用"nasm -f macho64 -o hello.o hello.asm"命令将汇编源文件编译为一个目标文件。然后,使用"ld -o hello -e _main hello.o"命令将目标文件链接为可执行文件。最后,使用"./hello"命令运行程序。 通过以上步骤,你就可以在Mac笔记本上成功配置汇编语言环境,并编写、编译和运行汇编语言程序了。请注意,汇编语言是一种底层的编程语言,对于初学者可能有一定的学习曲线,建议在学习之前阅读相关的教程和文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值