iOS逆向 dyld流程

iOS逆向 dyld流程dyld作为苹果的动态链接器,是苹果操作系统的一个重要组成部分,在系统内容做好程序准备工作之后交由dyld负责余下的工作。因此了解dyld的加载过程对我们的逆向之旅有一定的帮助

欢迎阅读iOS逆向系列(按序阅读食用效果更加)

写在前面

dyld作为苹果的动态链接器,是苹果操作系统的一个重要组成部分,在系统内容做好程序准备工作之后交由dyld负责余下的工作。因此了解dyld的加载过程对我们的逆向之旅有一定的帮助

由于在iOS探索系列已经通过iOS探索 浅尝辄止dyld加载流程dyld有过一定的介绍,本文只会精简介绍一下具体流程

一、_dyld_start

_dyld_start是程序执行的起点,可以通过bt指令查看到

iOS逆向 dyld流程

在汇编中
_dyld_start调用
dyldbootstrap::start

iOS逆向 dyld流程

二、dyldbootstrap::start

dyldbootstrap::start函数中做了一些保护手段,并调用dyld::_main

iOS逆向 dyld流程

三、dyld::_main

iOS逆向 dyld流程

3.1 配置环境变量

只要设置了这两个环境变量参数,在App启动时就会打印相关参数、环境变量信息

iOS逆向 dyld流程

3.2 加载共享缓存库

调用checkSharedRegionDisable函数检查并加载共享缓存库(iOS无法禁用共享缓存库)

iOS逆向 dyld流程

3.3 实例化主程序

调用instantiateFromLoadedImage函数

  • isCompatibleMachO检查machO的兼容性
  • instantiateMainExecutable -> sniffLoadCommands实例化主程序
    iOS逆向 dyld流程

3.4 加载动态库

越狱的插件一般是在这里发光发热的

iOS逆向 dyld流程

3.5 链接主程序

链接主程序和动态库

iOS逆向 dyld流程

接下来就是dyld最重要的部分

3.6 初始化方法

调用initializeMainExecutable初始化方法,这是一个复杂的遍历过程——先处理动态库,再处理主程序

initializeMainExecutable调用runInitializers

iOS逆向 dyld流程

runInitializers调用
processInitializers

iOS逆向 dyld流程

processInitializers调用
recursiveInitialization

iOS逆向 dyld流程

recursiveInitialization调用
notifySingle
doInitialization

iOS逆向 dyld流程

notifySingle先判断
sNotifyObjCInit是否为空,再调用
sNotifyObjCInit回调

iOS逆向 dyld流程

全局搜索,发现是在
registerObjCNotifiers中注册的
sNotifyObjCInit回调

iOS逆向 dyld流程

_dyld_objc_notify_register调用
registerObjCNotifiers

iOS逆向 dyld流程


objc源码中的
_objc_init处调用了
_dyld_objc_notify_register

iOS逆向 dyld流程

作为
_dyld_objc_notify_register的第二个参数,
notifySingle回调被调用也随之调用,然后遍历调用动态库中的
+load方法

iOS逆向 dyld流程


notifySingle之后会调用doInitialization

  • doImageInit会去判断libSystem是否初始化
iOS逆向 dyld流程

doModInitFunctions遍历调用c++构造方法

iOS逆向 dyld流程

3.7 进入主程序

iOS逆向 dyld流程

至此,dyld流程就结束了,接下来就是main函数的舞台

四、dyld流程图

iOS逆向 dyld流程

五、证明

新建动态库,分别在主程序和动态库中添加+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顺序
    iOS逆向 dyld流程
  • 主程序中多个编译单元的执行先后顺序取决于Build Phases -> Compile Sources顺序
    iOS逆向 dyld流程

写在后面

迫于个人的强迫症,还是选择了在iOS逆向系列中加了一篇关于dyld流程的文章,但与iOS探索系列不同的是,这篇文章更加精炼、易于理解

今天的文章iOS逆向 dyld流程分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/21281.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注