Swift ARM64:URL与String的内存存储及参数传递技术问询
Swift字符串与URL内存逆向分析答疑
问题1:内存地址0x600002908000指向什么内容?如何查看其具体数据?
- 该地址属于Swift堆内存区域,大概率是
URL对象内部关联的absoluteString对应的Swift字符串实例,或是底层CoreFoundation(CFURL)结构体绑定的字符串存储。 - 查看数据的具体操作:
- LLDB原始内存查看:执行命令
x -c 32 0x600002908000,32字节足够覆盖Swift字符串头部+初始内容,可直接读取原始内存字节。 - 对象解析输出:用
po 0x600002908000尝试解析为Swift对象,若为字符串会直接输出内容;如果是CoreFoundation对象,执行po (CFStringRef)0x600002908000强制转换解析。 - 结构体布局分析:Swift字符串的
StringObject头部包含长度(带标志位)、元数据指针、字符存储指针,用x -t 0x600002908000查看类型化内存,或结合frame variable -L定位变量关联的内存结构。
- LLDB原始内存查看:执行命令
问题2:swift.string.init返回的引用在内存中指向什么?如何查看其内容?
String.init返回的是Swift字符串实例的引用:若为长字符串则指向堆上的StringObject结构体;短字符串会触发小字符串优化,直接在栈上存储字符数据。StringObject结构通常包含:- 长度字段:带编码标志位(比如前缀
D代表UTF-16编码的长字符串,实际长度为字段值去掉最高位标志后的数值) - 元数据指针:指向
String类型的元数据信息 - 字符存储指针:指向堆上的实际字符数组(长字符串)或栈上的字符缓冲区(短字符串)
- 长度字段:带编码标志位(比如前缀
- 查看内容的具体操作:
- 直接输出字符串:LLDB中执行
po $rax(假设返回值存在rax寄存器),直接打印字符串内容。 - 解析头部结构:执行
x -c 24 0x<返回的引用地址>,读取长度、标志和字符指针字段。例如长度字段为0xd000000000000006时,去掉最高位的0xd(即D标志),实际长度为6,编码为UTF-16。 - 查看原始字符数据:拿到字符存储指针后,UTF-16编码用
x -s 2 0x<字符指针>、UTF-8编码用x -s 1 0x<字符指针>读取原始字符字节。
- 直接输出字符串:LLDB中执行
内容的提问来源于stack exchange,提问作者Chris Birch
相关产品推荐
相关产品推荐

