iOS符号绑定的过程分析

iOS程序在加载到内存时候,会有一个符号绑定的过程。有两种方式,一种是Non-Lazy,一种是Lazy(懒加载)。
通过MachOView,可以看出系统的大部分函数都是懒加载。


以NSLog为例

NSLog在MachO的偏移8010个字节,就是NSLog的符号
编写一段代码,功能是通过fishhook Hook NSLog函数

- (void)viewDidLoad {
    [super viewDidLoad];
    //HOOK -- NSLog函数!
    NSLog(@"123");
    //指定交换的函数
    struct rebinding nslog;
    nslog.name = "NSLog";
    nslog.replacement = myNSLog;
    //fishhook 运行的时刻,动态的获取到NSLog的地址。
    nslog.replaced = (void *)&sys_nslog;
    //结构体数组
    struct rebinding rebs[1] = {nslog};
    rebind_symbols(rebs, 1);
}
  1. 运行上边的代码,在NSLog(@"123");打个断点
    控制台打印Demo的Mach-O在内存中的起始位置,0x0000000100bc4000
(lldb) image list
[  0] F7B52DBD-C1FF-3BDD-8220-BCC8493609FB 0x0000000100bc4000 /绝对路径/fishHookDemo.app/fishHookDemo 
  1. 将上边获得的两个地址Mach-O内存中的起始位置和NSLog的便宜位置相加,获得NSLog的符号内存地址
    0x0000000100bc4000 + 8010 = 0x100BCC010
    读一下内存,并且打印一下汇编代码。从汇编代码中看到目前没有绑定NSLog的实际地址。
(lldb) memory read 0x100BCC010
0x100bcc010: b4 a9 bc 00 01 00 00 00 b0 13 8b 94 01 00 00 00  ................
0x100bcc020: a0 7a 59 98 01 00 00 00 20 aa bc 00 01 00 00 00  .zY..... .......
(lldb) dis -s 0x0100bca9b4 // iOS是小端模式,倒着读前八个字节
    0x100bca9b4: ldr    w16, 0x100bca9bc
    0x100bca9b8: b      0x100bca99c
    0x100bca9bc: udf    #0x0
    0x100bca9c0: ldr    w16, 0x100bca9c8
    0x100bca9c4: b      0x100bca99c
    0x100bca9c8: udf    #0xd
    0x100bca9cc: ldr    w16, 0x100bca9d4
    0x100bca9d0: b      0x100bca99c
  1. 然后断点单步走一个,运行NSLog(@"123");重新打印内存和汇编,可以看到NSLog的符号绑定成功。得出结论,NSLog符号为懒加载。
(lldb) memory read 0x100BCC010
0x100bcc010: c0 c2 8b 94 01 00 00 00 b0 13 8b 94 01 00 00 00  ................
0x100bcc020: a0 7a 59 98 01 00 00 00 20 aa bc 00 01 00 00 00  .zY..... .......
(lldb) dis -s 0x01948bc2c0
Foundation`NSLog:
    0x1948bc2c0 <+0>:  sub    sp, sp, #0x20             ; =0x20 
    0x1948bc2c4 <+4>:  stp    x29, x30, [sp, #0x10]
    0x1948bc2c8 <+8>:  add    x29, sp, #0x10            ; =0x10 
    0x1948bc2cc <+12>: adrp   x8, 264921
    0x1948bc2d0 <+16>: ldr    x8, [x8, #0x110]
    0x1948bc2d4 <+20>: ldr    x8, [x8]
    0x1948bc2d8 <+24>: str    x8, [sp, #0x8]
    0x1948bc2dc <+28>: add    x8, x29, #0x10            ; =0x10 
  1. 接下来过掉断点,执行完rebind_symbols,然后进入lldb调试模式,打印内存和汇编,通过fishhook成功的替换掉了NSLog的实现。
    由此可见,fishhook的原理就是先找到符号的实际地址,然后替换掉地址的值。
(lldb) memory read 0x100BCC010
0x100bcc010: 88 9c bc 00 01 00 00 00 b0 13 8b 94 01 00 00 00  ................
0x100bcc020: a0 7a 59 98 01 00 00 00 c4 c9 14 94 01 00 00 00  .zY.............
(lldb) dis -s 0x0100bc9c88
fishHookDemo`myNSLog:
    0x100bc9c88 <+0>:  sub    sp, sp, #0x30             ; =0x30 
    0x100bc9c8c <+4>:  stp    x29, x30, [sp, #0x20]
    0x100bc9c90 <+8>:  add    x29, sp, #0x20            ; =0x20 
    0x100bc9c94 <+12>: mov    x8, #0x0
    0x100bc9c98 <+16>: stur   x8, [x29, #-0x8]
    0x100bc9c9c <+20>: sub    x9, x29, #0x8             ; =0x8 
    0x100bc9ca0 <+24>: str    x0, [sp, #0x10]
    0x100bc9ca4 <+28>: mov    x0, x9

后续
苹果有一个技术叫做共享缓存技术,就是程序中引用系统库的函数整个系统只有一份。
通过上边的分析,我们看到了NSLog的符号地址,使用 dis -s 0x01948bc2c0打印出了NSLog的汇编。结合共享缓存技术,可以猜到在一次系统启动后,任何程序中的0x01948bc2c0地址都是NSLog符号。当我们知道了所有的系统函数的符号地址,是不是能针对某一个app做点什么

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345