目录

1. 前言   1.1

2. dyld概述   1.2

3. dyld   1.3

1. dyld版本   1.3.1

2. dyld源码   1.3.2

3. dyld加载过程   1.3.3

4. 相关函数   1.3.4

1. NSVersionOfRunTimeLibrary   1.3.4.1

2. NSVersionOfLinkTimeLibrary   1.3.4.2

3. _NSGetExecutablePath   1.3.4.3

4. _dyld_start   1.3.4.4

5. _dyld_get_all_image_infos   1.3.4.5

6. dyld_program_sdk_at_least   1.3.4.6

7. dyld_shared_cache_file_path   1.3.4.7

5. 相关变量   1.3.5

1. gProcessInfo   1.3.5.1

4. libdyld.dylib   1.4

1. 相关函数   1.4.1

1. dlopen   1.4.1.1

1. dlopen_internal   1.4.1.1.1

2. dlopen_preflight   1.4.1.1.2

2. dlsym   1.4.1.2

3. dladdr   1.4.1.3

4. _dyld_image_count   1.4.1.4

5. _dyld_get_image_name   1.4.1.5

6. _dyld_get_image_header   1.4.1.6

7. _dyld_image_slide   1.4.1.7

8. _dyld_register_func_for_add_image   1.4.1.8

9. _dyld_register_func_for_remove_image   1.4.1.9

10. dyld_stub_binder   1.4.1.10

5. 相关内容   1.5

1. dyld_shared_cache   1.5.1

2. 相关环境变量   1.5.2

3. 相关函数   1.5.3

1. getsect   1.5.3.1

1. _getsectbynamefromheader_64   1.5.3.1.1

2. getsegmentdata   1.5.3.2

4. 相关工具   1.5.4

1. dyldinfo   1.5.4.1

5. Mach-O中   1.5.5

6. 附录   1.6

1. 参考资料   1.6.1

iOS逆向开发：dyld动态链接

- 最新版本： v0.5.1

- 更新时间： 20240617

简介

整理关于iOS逆向期间涉及到的dyld动态链接的各种内容。

源码+浏览+下载

本书的各种源码、在线浏览地址、多种格式文件下载如下：

HonKit源码

- crifan/ios_re_dyld_link: iOS逆向开发：dyld动态链接

如何使用此HonKit源码去生成发布为电子书

详见：crifan/honkit_template: demo how to use crifan honkit template and demo

在线浏览

- iOS逆向开发：dyld动态链接 book.crifan.org

- iOS逆向开发：dyld动态链接 crifan.github.io

离线下载阅读

- iOS逆向开发：dyld动态链接 PDF

- iOS逆向开发：dyld动态链接 ePub

- iOS逆向开发：dyld动态链接 Mobi

版权和用途说明

此电子书教程的全部内容，如无特别说明，均为本人原创。其中部分内容参考自网络，均已备注了出处。如发现有侵权，请通过邮箱联系我  admin 艾特 crifan.com ，我会尽快删除。谢谢合作。

各种技术类教程，仅作为学习和研究使用。请勿用于任何非法用途。如有非法用途，均与本人无关。

鸣谢

感谢我的老婆陈雪的包容理解和悉心照料，才使得我 crifan 有更多精力去专注技术专研和整理归纳出这些电子书和技术教程，特此鸣谢。

其他

作者的其他电子书

本人 crifan 还写了其他 150+ 本电子书教程，感兴趣可移步至：

crifan/crifan_ebook_readme: Crifan的电子书的使用说明

关于作者

关于作者更多介绍，详见：

关于CrifanLi李茂 – 在路上

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2024-06-17 16:46:17

dyld概述

- dyld = DYLD  = DYnamic LoaDing

dyld库中的函数

- dyld库中的函数

- dyld库文件：文件位置

- /cores/dyld

- /usr/lib/dyld

- dyld库文件：内部结构

- section

- dyld.__TEXT.__text

- dyld库 内部的

- 函数

- C函数

- NSVersionOfRunTimeLibrary

- NSVersionOfLinkTimeLibrary

- _NSGetExecutablePath

- statfs64

- dyld开头的函数

- dyld_stub_binder

- dyld_program_sdk_at_least

- dyld_shared_cache_file_path

- _dyld开头的函数

- _dyld_start

- _dyld_get_all_image_infos

- 类的函数

- dyld类的函数

- dyld::notifySingle

- dyld::initializeMainExecutable

- dyld::_main

- dyld::registerAddCallback

- ImageLoaderMachO类的函数

- ImageLoaderMachO::doModInitFunctions

- ImageLoaderMachO::doInitialization

- ImageLoader类的函数

- ImageLoader::recursiveInitialization

- ImageLoader::processInitializers

- ImageLoader::runInitializers

- dyldbootstrap类的函数

- dyldbootstrap::start

- dyld3类的函数

- dyld3::dladdr

- dyld3::AllImages::dlopen

- dyld3::OverflowSafeArray

- dyld3::MachOFile::forEachLoadCommand

- dyld3::MachOFile::getUuid

- dyld4类的函数

- dyld4::RuntimeState::initialize

- dyld4::APIs::_libdyld_initialize

- 全局变量

- dyld`_main_thread

- dyld`initialPoolContent

- gProcessInfo

- dyld4::gProcessInfo

- dyld::gProcessInfo

- 相关

- libdyld.dylib 动态库

- 文件位置

- /usr/lib/system/libdyld.dylib

- 内部函数

- dlopen

- dlopen_internal

- dlopen_preflight

- dladdr

- _dyld_image_count

- _dyld_get_image_name

- _dyld_get_image_header

- _dyld_image_slide

- _dyld_register_func_for_add_image

- _dyld_register_func_for_remove_image

- __dyld_private ?

- getsectdata

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2024-03-20 10:21:28

dyld

- dyld头文件位置： mach-o/dyld.h

- 导入头文件

#import <mach-o/dyld.h>

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2024-03-25 10:12:54

dyld版本

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2024-03-20 10:11:52

dyld源码

- dyld源码

- 离线下载

- https://opensource.apple.com/tarballs/dyld/

- dyld-1125.5

- zip : https://github.com/apple-oss-distributions/dyld/archive/refs/tags/dyld-1125.5.zip

- tag.gz : https://github.com/apple-oss-distributions/dyld/archive/refs/tags/dyld-1125.5.tar.gz

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2024-03-20 10:19:20

dyld加载过程

iOS的app启动过程

- iOS的app启动过程

- 概述

- 详细

- iOS的app启动的不同阶段

- Pre-main 阶段

- main 阶段

- iOS的app启动调用函数

dyld加载过程

- dyld2 vs dyld3

- dyld加载过程

- 图

- 文字版

- 图

dyld加载过程1

(lldb) bt

* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 23.2

* frame #0: 0x000000018d124174 libdyld.dylib`dladdr

frame #1: 0x000000010b0bfbac AwemeCore`___lldb_unnamed_symbol13025$$AwemeCore + 80

frame #2: 0x000000018d041c38 libobjc.A.dylib`CALLING_SOME_+initialize_METHOD + 20

frame #3: 0x000000018d04742c libobjc.A.dylib`initializeNonMetaClass + 644

frame #4: 0x000000018d0471f8 libobjc.A.dylib`initializeNonMetaClass + 80

frame #5: 0x000000018d047ba8 libobjc.A.dylib`initializeAndMaybeRelock(objc_class*, objc_object*, mutex_tt<false>&, bool) + 284

frame #6: 0x000000018d05450c libobjc.A.dylib`lookUpImpOrForward + 700

frame #7: 0x000000018d0448a8 libobjc.A.dylib`object_setClass + 104

frame #8: 0x000000018d29da70 CoreFoundation`_CFRuntimeCreateInstance + 580

frame #9: 0x000000018d2bcb74 CoreFoundation`__CFStringCreateImmutableFunnel3 + 1944

frame #10: 0x000000018d2bcef8 CoreFoundation`CFStringCreateWithCString + 92

frame #11: 0x000000018d29f610 CoreFoundation`__CFInitialize + 812

frame #12: 0x0000000104fddfac dyld`ImageLoaderMachO::doImageInit(ImageLoader::LinkContext const&) + 248

frame #13: 0x0000000104fde580 dyld`ImageLoaderMachO::doInitialization(ImageLoader::LinkContext const&) + 40

frame #14: 0x0000000104fd95d0 dyld`ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, char const*, ImageLoader::InitializerTimingList&, ImageLoader::UninitedUpwards&) + 548

frame #15: 0x0000000104fd953c dyld`ImageLoader::recursiveInitialization(ImageLoader::LinkContext const&, unsigned int, char const*, ImageLoader::InitializerTimingList&, ImageLoader::UninitedUpwards&) + 400

frame #16: 0x0000000104fd8334 dyld`ImageLoader::processInitializers(ImageLoader::LinkContext const&, unsigned int, ImageLoader::InitializerTimingList&, ImageLoader::UninitedUpwards&) + 184

frame #17: 0x0000000104fd83fc dyld`ImageLoader::runInitializers(ImageLoader::LinkContext const&, ImageLoader::InitializerTimingList&) + 92

frame #18: 0x0000000104fca3d0 dyld`dyld::initializeMainExecutable() + 136

frame #19: 0x0000000104fcedb4 dyld`dyld::_main(macho_header const*, unsigned long, int, char const**, char const**, char const**, unsigned long*) + 4616

frame #20: 0x0000000104fc9208 dyld`dyldbootstrap::start(dyld3::MachOLoaded const*, int, char const**, dyld3::MachOLoaded const*, unsigned long*) + 396

frame #21: 0x0000000104fc9038 dyld`_dyld_start + 56

==

- dyld`_dyld_start

- dyld`dyldbootstrap::start

- dyld`dyld::_main

- dyld`dyld::initializeMainExecutable

- dyld`ImageLoader::runInitializers

- dyld`ImageLoader::processInitializers

- dyld`ImageLoader::recursiveInitialization

- dyld`ImageLoaderMachO::doInitialization

- dyld`ImageLoaderMachO::doImageInit

- ...

- libdyld.dylib`dladdr

dyld加载过程2

- _dyld_start

- dyldbootstrap: : start

- dyld: : _main

- dyld: : initializeMainExecutable

- ImageLoader::runInitializers

- ImageLoader::processInitializers

- ImageLoader::recursiveInitialization

- Dyld ::notifySingle

- libobjC.a. dylib load_images

- +[ViewController load]

dyld加载过程3

(lldb) bt

* thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 6.1

* frame #0: 0x0000000102495310 libAwemeDylib.dylib`_logos_method$_ungrouped$NSString$stringByAppendingString$(self="https://", _cmd="stringByAppendingString:", aString=0x0000000000000000) at AwemeDylib.xm:175:29

frame #1: 0x0000000108532cf8 AwemeCore`___lldb_unnamed_symbol3548$$AwemeCore + 520

...

frame #38: 0x00000001c2ecf60c FrontBoardServices`-[FBSSerialQueue _performNextFromRunLoopSource] + 28

frame #39: 0x00000001bdcd0a00 CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 24

frame #40: 0x00000001bdcd0958 CoreFoundation`__CFRunLoopDoSource0 + 80

frame #41: 0x00000001bdcd00f0 CoreFoundation`__CFRunLoopDoSources0 + 180

frame #42: 0x00000001bdccb23c CoreFoundation`__CFRunLoopRun + 1080

frame #43: 0x00000001bdccaadc CoreFoundation`CFRunLoopRunSpecific + 464

frame #44: 0x00000001c7c6b328 GraphicsServices`GSEventRunModal + 104

frame #45: 0x00000001c1dd863c UIKitCore`UIApplicationMain + 1936

frame #46: 0x000000010efec094 AwemeCore`awemeMain + 200

frame #47: 0x0000000102267ca4 Aweme`___lldb_unnamed_symbol21$$Aweme + 12

frame #48: 0x00000001bdb54360 libdyld.dylib`start + 4

- libdyld.dylib`start 开始的调用顺序

- app相关逻辑：Aweme ___lldb_unnamed_symbol21$$Aweme、AwemeCore awemeMain

- 然后才是其他系统常见函数

- UIKitCore`UIApplicationMain

- ...

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2024-03-25 09:58:10

相关函数

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2024-03-20 10:11:52

NSVersionOfRunTimeLibrary

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2024-03-20 10:11:52

NSVersionOfLinkTimeLibrary

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2024-03-20 10:11:52

_NSGetExecutablePath

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2024-03-20 10:11:52

_dyld_start

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2024-03-20 10:11:52

_dyld_get_all_image_infos

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2024-03-20 10:11:52

dyld_program_sdk_at_least

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2024-03-20 10:11:52

dyld_shared_cache_file_path

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2024-03-20 10:11:52

相关变量

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2024-03-20 10:11:52

gProcessInfo

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2024-03-20 10:11:52

libdyld.dylib

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2024-03-20 10:11:52

相关函数

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2024-03-20 10:11:52

dlopen

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2024-03-20 10:11:52

dlopen_internal

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2024-03-20 10:11:52

dlopen_preflight

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2024-03-20 10:11:52

dlsym

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2024-03-20 10:11:52

dladdr

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2024-03-20 10:11:52

_dyld_image_count

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2024-03-20 10:11:52

_dyld_get_image_name

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2024-03-20 10:11:52

_dyld_get_image_header

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2024-03-20 10:11:52

_dyld_image_slide

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2024-03-20 10:11:52

_dyld_register_func_for_add_image

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2024-03-20 10:11:52

_dyld_register_func_for_remove_image

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2024-03-20 10:11:52

dyld_stub_binder

反汇编代码

libdyld.dylib`dyld_stub_binder:

->  0x18d122dc0 <+0>:   stp    x29, x30, [sp, #-0x10]!

0x18d122dc4 <+4>:   mov    x29, sp

0x18d122dc8 <+8>:   sub    sp, sp, #0xf0             ; =0xf0

0x18d122dcc <+12>:  stp    x0, x1, [x29, #-0x10]

0x18d122dd0 <+16>:  stp    x2, x3, [x29, #-0x20]

0x18d122dd4 <+20>:  stp    x4, x5, [x29, #-0x30]

0x18d122dd8 <+24>:  stp    x6, x7, [x29, #-0x40]

0x18d122ddc <+28>:  stp    x8, x9, [x29, #-0x50]

0x18d122de0 <+32>:  stp    q0, q1, [x29, #-0x80]

0x18d122de4 <+36>:  stp    q2, q3, [x29, #-0xa0]

0x18d122de8 <+40>:  stp    q4, q5, [x29, #-0xc0]

0x18d122dec <+44>:  stp    q6, q7, [x29, #-0xe0]

0x18d122df0 <+48>:  ldr    x0, [x29, #0x18]

0x18d122df4 <+52>:  ldr    x1, [x29, #0x10]

0x18d122df8 <+56>:  bl     0x18d1246e4              ; _dyld_fast_stub_entry(void*, long)

0x18d122dfc <+60>:  mov    x16, x0

0x18d122e00 <+64>:  ldp    x0, x1, [x29, #-0x10]

0x18d122e04 <+68>:  ldp    x2, x3, [x29, #-0x20]

0x18d122e08 <+72>:  ldp    x4, x5, [x29, #-0x30]

0x18d122e0c <+76>:  ldp    x6, x7, [x29, #-0x40]

0x18d122e10 <+80>:  ldp    x8, x9, [x29, #-0x50]

0x18d122e14 <+84>:  ldp    q0, q1, [x29, #-0x80]

0x18d122e18 <+88>:  ldp    q2, q3, [x29, #-0xa0]

0x18d122e1c <+92>:  ldp    q4, q5, [x29, #-0xc0]

0x18d122e20 <+96>:  ldp    q6, q7, [x29, #-0xe0]

0x18d122e24 <+100>: mov    sp, x29

0x18d122e28 <+104>: ldp    x29, x30, [sp], #0x10

0x18d122e2c <+108>: add    sp, sp, #0x10             ; =0x10

0x18d122e30 <+112>: br     x16

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2024-03-25 10:08:51

相关内容

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2024-03-20 10:11:52

dyld_shared_cache

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2024-03-20 10:11:52

相关环境变量

- dyld相关环境变量

- DYLD_LIBRARY_PATH

- DYLD_PRINT_STATISTICS

- DYLD_PRINT_LIBRARIES

- DYLD_INSERT_LIBRARIES

- DYLD_IMAGE_SUFFIX

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2024-03-20 10:20:14

相关函数

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2024-03-20 10:11:52

getsect

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2024-03-20 10:11:52

_getsectbynamefromheader_64

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2024-03-20 10:11:52

getsegmentdata

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2024-03-20 10:11:52

相关工具

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2024-03-20 10:11:52

dyldinfo

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2024-03-20 10:11:52

Mach-O中

- Mach-O中有关dyld的内容

- Header的flag

- MH_DYLDLINK

- LC_开头的dyld相关的Load Command

- LC_DYLD_CHAINED_FIXUPS

- LC_DYLD_EXPORTS_TRIE

- LC_LOAD_DYLINKER

- /usr/lib/dyld

- LC_DYLD_INFO

- LC_DYLD_INFO_ONLY

- LC_DYLD_ENVIRONMENT

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2024-03-20 10:17:54

附录

下面列出相关参考资料。

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2024-03-20 10:08:57

参考资料

- 【未解决】iOS反越狱检测：strcmp

- 【未解决】研究抖音越狱检测逻辑：___lldb_unnamed_symbol13025即sub_5BABB5C

- 【已解决】Xcode的lldb中动态调试objc_msgSend第二个参数函数名或属性值

- 【记录】分析和研究：当stringByAppendingString参数为空时的AwemeCore相关函数代码段

- 【已解决】研究抖音越狱检测逻辑：open_dprotected_np

- 【未解决】研究抖音是否实现了Method Swizzling的Hook检测

- IOS APP startup optimization (VII) : Detailed analysis of dyLD loading process - Moment For Technology (mo4tech.com)

- iOS逆向攻防实战 - 掘金 (juejin.cn)

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2024-03-25 10:12:00

Table of Contents

前言

dyld概述

dyld

dyld版本

dyld源码

dyld加载过程

相关函数

NSVersionOfRunTimeLibrary

NSVersionOfLinkTimeLibrary

_NSGetExecutablePath

_dyld_start

_dyld_get_all_image_infos

dyld_program_sdk_at_least

dyld_shared_cache_file_path

相关变量

gProcessInfo

libdyld.dylib

相关函数

dlopen

dlsym

dladdr

_dyld_image_count

_dyld_get_image_name

_dyld_get_image_header

_dyld_image_slide

_dyld_register_func_for_add_image

_dyld_register_func_for_remove_image

dyld_stub_binder

相关内容

dyld_shared_cache

相关环境变量

相关函数

getsect

getsegmentdata

相关工具

dyldinfo

Mach-O中

附录

参考资料