iOS逆向 dyld流程

作者: 编程怪才_凌雨画 | 来源:发表于2020-11-21 15:20 被阅读0次

写在前面

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

一、_dyld_start

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

在汇编中_dyld_start调用dyldbootstrap::start

二、dyldbootstrap::start

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

三、dyld::_main

3.1 配置环境变量

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

3.2 加载共享缓存库

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

3.3 实例化主程序

调用instantiateFromLoadedImage函数

  • isCompatibleMachO检查machO的兼容性
  • instantiateMainExecutable -> sniffLoadCommands实例化主程序

3.4 加载动态库

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

3.5 链接主程序

链接主程序和动态库

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

3.6 初始化方法

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

initializeMainExecutable调用runInitializers

runInitializers调用processInitializers

processInitializers调用recursiveInitialization

recursiveInitialization调用notifySingledoInitialization

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++构造方法

3.7 进入主程序

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

四、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顺序
  • 主程序中多个编译单元的执行先后顺序取决于Build Phases -> Compile Sources顺序

写在后面

想了解更多逆向相关知识不妨动动小手,添加一下咱们的交流群642363427来为你的技术多添一份光彩。

相关文章

  • iOS逆向 dyld流程

    写在前面 dyld作为苹果的动态链接器,是苹果操作系统的一个重要组成部分,在系统内容做好程序准备工作之后交由dyl...

  • iOS dyld加载流程

    dyld加载的详细流程可以参考文章 iOS dyld加载流程[https://www.jianshu.com/p...

  • iOS 逆向开发15:DYLD加载流程

    iOS 逆向开发 文章汇总[https://www.jianshu.com/p/a9b3c5ecc8aa] 目录 ...

  • iOS应用加载流程

    在iOS领域我们谈应用加载流程,就不得不谈一下dyld。概述:DYLD(the dynamic link edit...

  • iOS逆向-14:dyld

    dyld 动态链接器:加载所有的库和可执行文件 这里主要分析一下最新的dyld-832.7.3版本首先看一下+lo...

  • iOS底层探索 -- objc与dyld关联分析

    引子 在我们之前探索dyld流程时,我们发现其实dyld和objc_init()之间是存在联系的。 iOS底层探索...

  • Dyld的加载流程分析

    引言: 众所周知,我们的iOS应用是通过Dyld进行加载的,那么Dyld是如何加载我们的应用的,它的流程是怎样的,...

  • iOS底层-dyld加载分析

    引言: 众所周知,我们的iOS应用是通过Dyld进行加载的,那么Dyld是如何加载我们的应用的,它的流程是怎样的,...

  • iOS dyld与objc的关联

    本文的主要目的是理解dyld与objc是如何关联的 在上一篇文章iOS dyld流程分析[https://www....

  • dyld加载流程

    dyld加载流程 配置环境变量依赖DYLD(dyld)dyld(the dynamic link editor)是...

网友评论

    本文标题:iOS逆向 dyld流程

    本文链接:https://www.haomeiwen.com/subject/dfceiktx.html