[iOS Hacker] CFStrings 的运行过程分析

iOS/MacOSX/移动安全 exchen 543浏览 0评论

CFStrings 的运行过程分析

平时我们编写代码的时候,经常会这样写 NSLog(@"test"); ,字符串的内部到底做了些什么?我们来调试分析一下。

一、编写测试代码

编写代码如下:

查看 SDK 路径

编译:

签名:

上传到手机上,运行一下看看效果

二、CFString 的数据结构

NSLog(@”test”) 里的字符串保存在 __TEXT 段里的 __cstring 节里,地址为 0x7FF0 如图:

然后再来看看 __DATA 段里的 cstring 节,里面保存了字符串的数据结构,在 0x8014 处里的数据为 f0 0f 08 00,对应了代码段里的 (0x7FF0+0x4000),0x8018 处里的数据是 4,表示的是字符串的长度,如下图:

三、调试运行过程

在手机用 debugserver 将程序跑起来

lldb 连接成功之后, main 函数下断点,看一下反汇编

查看一下模块的地址,偏移后的地址是 0x0000000000079000

在 0x80fa8 处下断点,然后再看看参数 r0 寄存器

看一下 0x0008100c 内存的数据,可以到了 f0 0f 08 00 这块数据对应代码段里的字符串 “test” 的地址 0x00080ff0,这个地址的计算方法是模块的偏移地址 + (数据段的 cfstring 看到的地址 – 0x4000),相当于 0x79000 + (0xbff0 – 0x400) = 0x00080ff0,(0xbff0 – 0x400) 实际上就是代码段 cstring 看到的地址 0x7ff0

然后看看 0x00080ff0 的内存数据,果然是 “test” 字符串

转载请注明:exchen's blog » [iOS Hacker] CFStrings 的运行过程分析

发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址