一、共享缓存机制
苹果为了节约内存以及提高加载速度,将系统的动态库放在内存的一块特殊位置,然后将这块内存共享给其他的应用。这块区域就是动态库共享缓存(dyld shared cache
)
二、PIC技术(位置代码独立)
编译的时候,符号地址。dyld加载的时候,将符号地址和真实地址绑定
- 由于有了共享缓存,那么我们所调用的系统函数在编译时刻是没法确定其内存地址。
- 所以苹果采用了PIC技术。在MachO文件DATA段建立两张表,懒加载和非懒加载表,利用存放指向外部函数的指针(符号)!
- 当我们首次调用懒加载表内的函数时,DYLD会对该函数进行绑定。
三、符号绑定过程分析
- 符号表,分两种,一种非懒加载表、一种懒加载表
-
获取 offset
0x00008010
-
image list
获取所有模块列表,然后找到 内存地址(MachO的首地址)0x0000000100754000
- 获取符号地址:
0x0000000100754000
+ offset(0x00008010
) =0x10075C010
-
memory read 0x10075C010(内存地址)
读内存
-
iOS小端模式,从右往左读
0x010075a574
-
dis -s 0x010075a574
看汇编
- 第二个断点重复操作
- 第三个断点重复操作,已经执行了
rebind_symbols
四、通过符号找到字符串
-
Section64(_DATA,_la_symbol_ptr) -> Lazy Symbol Pointers
和Dynamic Symbol Table -> Indirect Symbols
是对应的
-
000000B2
换成十进制 178,对应为Symbol Table -> Symbols
中的角标
-
000000D7
对应为String Table
偏移值 -
000000D7
+0000D3D0
=0xD4A7
网友评论