iOS逆向安防从入门到秃头--MachO中的符号

小谷秃头合集c++

  • 小谷最近生病了几天,借此机会也研究了下符号~bootstrap

  • 今天来小叙一下符号。(这个东西你们应该都不会陌生~)缓存

1. 符号的定义

1.1. 什么是符号

  • 小谷说下本身的理解吧~安全

    • 其实符号的概念比较广,咱们开发中,编写的函数、变量等等均可以成为符号
  • 这个时候不得不提一下符号表markdown

    • 咱们经过烂苹果(MachOView)能够知道:MachO中有个总表·Symbol Table·(符号表),符号都被保存在这里.闭包

    • 还有个他的子集,叫·Indirect Symbol Table·(间接符号表),保存的是间接符号(咱们一般使用的NSLog就属于间接符号,有时候咱们也称他为外部符号).函数

    • 还有String table ,保存的是符号的名称.工具

1.png

这几张表的联系,我一会会说~post

2. 符号绑定

说到绑定,不得不提一嘴dyldui

2.1. dyld的加载流程(应用程序的启动~)

不知道你们有没有看过dyld的加载流程(我直接就阐述下吧。兄弟们有时间能够去看看,验证下

  • 首先, dyld(dynamic linker,动态连接器)最开始的地方,_dyld_start

  • 而后经过 dyldbootstrap::start进入dyldmain函数

  • 主要流程开始了~

  1. 配置所需环境、重定向dyld(因为应用程序运行时都在内存中(磁盘中的镜像(因此咱们一般都会说image)),因为苹果的安全协议,出现了一个ASLR,因此须要重定向
  1. 加载共享缓存(这个其实不用多说了。咱们用到了系统的库,有可能以前已经加载过了~)
  1. 实例化主程序(以前会判断是dyld或者dyld3.都是同样的。dyld3是苹果为了提升效率新增的,采用的是回调函数模式(一般也成为闭包模式))
  1. 加载动态库(以前一篇博客,动态库的注入,你们也已经了解了,其实首先加载的是注入的动态库。)
  1. 连接主程序,绑定符号(这个是很关键的~,这个操做的主要是非懒加载中的符号,一会说到的,dyld_stub_binder就是这一步操做绑定的,在load方法以前)
  1. 而后就是初始化方法:initializeMainExecutable(剩下的就是调用,连接objc_init之类的了,而后调用load,而后c++,而后main了,这就很少说了~)
  • 原本想给你们展现代码的,感受其实不重要,这流程就够用了~

2.2. 符号绑定

    1. 咱们用NSLog举例吧(直接写代码)
// 咱们都知道NSLog是外部符号,在间接符号表里面~
    
    NSLog(@" 第一次调用外部符号~ ");
    
    NSLog(@" 第二次调用外部符号~ ");
复制代码
    1. 我直接画了个简易的流程图(要是一步步写,文章就太长了,图片解决一切~)

2.png

因为dyld_stub_binder是在很早以前就加载好了(上面提到的~).外部符号的绑定看来是经过dyld_stub_binder,下次再调用时候就不须要在次绑定了

    1. 咱们从MachOView中观察到:在绑定以前NSLog中已经有值了,这个称为NSLog的桩

3.png

3. 经过字符串查找符号

兄弟们应该都用过fishhook技术

4.png

fishhook有一句:log.name = "NSLog";

  • 那么经过字符串,如何找到的这个函数呢?

  • 咱们先看看fishhook的官方解释

5.png

是否是有点小懵逼。小谷陪兄弟们看一下~

  • 我经过MachOView。以NSLog举例~(他用的close,其实流程差很少~)

6.png

这样是否是清楚不少了~

4. 脱符号

关于脱符号和恢复符号,我就简单说一下。

7.png

5. 恢复符号

恢复符号的原理主要是经过OC方法的动态性

  • 虽然符号去掉了,可是保存在methodlist里面的方法,用到都会存在的(若是没有就么有办法调用了~)

8.png

有个工具叫作,restore-symbol就是经过方法名和类名称,而后生成符号表插入到MachO的。

6. 总结

    1. 其实作逆向安防的话,大多数都是用的工具-比较方便,可是我感受仍是要稍微懂一点原理比较好点~
    1. 这篇博客可能不是特别的细,就当给兄弟们开个口子。
    1. 最后但愿和兄弟们共同进步~😆
相关文章
相关标签/搜索