欢迎阅读iOS逆向系列(按序阅读食用效果更加)c++
dyld
做为苹果的动态连接器,是苹果操做系统的一个重要组成部分,在系统内容作好程序准备工做以后交由dyld
负责余下的工做。所以了解dyld
的加载过程对咱们的逆向之旅有必定的帮助bootstrap
因为在iOS探索系列已经经过iOS探索 浅尝辄止dyld加载流程对dyld
有过必定的介绍,本文只会精简介绍一下具体流程缓存
_dyld_start
是程序执行的起点,能够经过bt指令
查看到 bash
_dyld_start
调用
dyldbootstrap::start
dyldbootstrap::start
函数中作了一些保护手段,并调用dyld::_main
微信
只要设置了这两个环境变量参数,在App启动时就会打印相关参数、环境变量信息 函数
调用checkSharedRegionDisable
函数检查并加载共享缓存库(iOS没法禁用共享缓存库) post
调用instantiateFromLoadedImage
函数ui
isCompatibleMachO
检查machO的兼容性instantiateMainExecutable -> sniffLoadCommands
实例化主程序
越狱的插件通常是在这里发光发热的 spa
连接主程序和动态库 操作系统
接下来就是dyld最重要的部分
调用initializeMainExecutable
初始化方法,这是一个复杂的遍历过程——先处理动态库,再处理主程序
initializeMainExecutable
调用runInitializers
runInitializers
调用
processInitializers
processInitializers
调用
recursiveInitialization
recursiveInitialization
调用
notifySingle
和
doInitialization
notifySingle
先判断
sNotifyObjCInit
是否为空,再调用
sNotifyObjCInit
回调
registerObjCNotifiers
中注册的
sNotifyObjCInit
回调
_dyld_objc_notify_register
调用
registerObjCNotifiers
objc源码
中的
_objc_init
处调用了
_dyld_objc_notify_register
_dyld_objc_notify_register
的第二个参数,
notifySingle
回调被调用也随之调用,而后遍历调用动态库中的
+load
方法
在notifySingle
以后会调用doInitialization
doImageInit
会去判断libSystem
是否初始化doModInitFunctions
遍历调用c++构造方法
至此,dyld流程就结束了,接下来就是main函数的舞台
新建动态库,分别在主程序和动态库中添加+load方法
和c++构造方法
+ (void)load {
NSLog(@"主程序——load");
}
__attribute__((constructor)) void funcCooci(){
printf("主程序——c++");
}
复制代码
Framework(Feng)——load
Framework(Feng)——c++
主程序——load
主程序——c++
复制代码
事实证实动态库
先于主程序
执行+load方法
和c++构造方法
General -> Framework, Libraries, and Embedded Content
顺序
Build Phases -> Compile Sources
顺序
迫于我的的强迫症,仍是选择了在iOS逆向系列中加了一篇关于dyld流程的文章,但与iOS探索系列不一样的是,这篇文章更加精炼、易于理解