小谷秃头合集c++
小谷最近生病了几天,借此机会也研究了下符号~bootstrap
今天来小叙一下符号。(这个东西你们应该都不会陌生~)缓存
小谷说下本身的理解吧~安全
符号
的概念比较广,咱们开发中,编写的函数、变量
等等均可以成为符号
。这个时候不得不提一下符号表
markdown
咱们经过烂苹果(MachOView)
能够知道:MachO
中有个总表·Symbol Table·(符号表)
,符号都被保存在这里.闭包
还有个他的子集,叫·Indirect Symbol Table·(间接符号表)
,保存的是间接符号
(咱们一般使用的NSLog
就属于间接符号
,有时候咱们也称他为外部符号
).函数
还有String table
,保存的是符号的名称
.工具
这几张表的联系,我一会会说~post
说到绑定,不得不提一嘴
dyld
ui
dyld
的加载流程(应用程序的启动~)不知道你们有没有看过
dyld的加载流程
(我直接就阐述下吧。兄弟们有时间能够去看看,验证下)
首先, dyld(dynamic linker,动态连接器)
最开始的地方,_dyld_start
而后经过 dyldbootstrap::start
进入dyld
的main
函数
主要流程开始了~
配置所需环境、重定向dyld
(因为应用程序运行时都在内存中(磁盘中的镜像(因此咱们一般都会说image
)),因为苹果的安全协议,出现了一个ASLR
,因此须要重定向
)
加载共享缓存
(这个其实不用多说了。咱们用到了系统的库,有可能以前已经加载过了~)
实例化主程序
(以前会判断是dyld
或者dyld3
.都是同样的。dyld3
是苹果为了提升效率新增的,采用的是回调函数模式(一般也成为闭包模式
))
加载动态库
(以前一篇博客,动态库的注入,你们也已经了解了,其实首先加载的是注入的动态库。)
连接主程序,绑定符号
(这个是很关键的~,这个操做的主要是非懒加载中的符号
,一会说到的,dyld_stub_binder
就是这一步操做绑定的,在load
方法以前)
而后就是初始化方法:initializeMainExecutable
(剩下的就是调用,连接objc_init之类的了,而后调用load,而后c++,而后main了,这就很少说了~)
NSLog
举例吧(直接写代码)// 咱们都知道NSLog是外部符号,在间接符号表里面~
NSLog(@" 第一次调用外部符号~ ");
NSLog(@" 第二次调用外部符号~ ");
复制代码
因为
dyld_stub_binder
是在很早以前就加载好了(上面提到的~).外部符号的绑定看来是经过dyld_stub_binder
,下次再调用时候就不须要在次绑定了
MachOView
中观察到:在绑定以前NSLog
中已经有值了,这个称为NSLog的桩
兄弟们应该都用过
fishhook
技术
fishhook
有一句:log.name = "NSLog";
那么经过字符串,如何找到的这个函数呢?
咱们先看看fishhook
的官方解释
是否是有点小懵逼。小谷陪兄弟们看一下~
MachOView
。以NSLog
举例~(他用的close
,其实流程差很少~)这样是否是清楚不少了~
关于
脱符号和恢复符号
,我就简单说一下。
恢复符号
的原理主要是经过OC方法的动态性
。
符号
去掉了,可是保存在methodlist
里面的方法,用到类
都会存在的(若是没有就么有办法调用了~)有个工具叫作,
restore-symbol
就是经过方法名和类名称
,而后生成符号表插入到MachO
的。
逆向安防
的话,大多数都是用的工具-比较方便,可是我感受仍是要稍微懂一点原理比较好点~