ios应用程序加载分析(一)

14,242 阅读1分钟

app启动分析+猜测

首先通过入口函数main断点查看

1.png

2.png nothing ... 通过load入口断点查看

3.png

得到大致的堆栈关键信息 (反向调用信息如下)

dyld - _dyld_start
dyld - dyldbootstrap::sart
dyld - dyld::_main
dyld - dyld::useSimulatorDyld
dyld_sim - start_sim
dyld_sim - dyld::_main
dyld_sim - dyld::initializeMainExecutable
dyld_sim - ImageLoader::runInitializers
dyld_sim - ImageLoader::processInitializers
dyld_sim - ImageLoader::recursiveInitialization
dyld_sim - dyld::notifySingle
libobjc - load_images
...... +(void)load

dyld - _dyld_start 开始追踪源码

4.png

Screen Shot 2022-04-16 at 19.15.26.png

image.png

image.png

image.png

image.png

image.png

image.png

源码量大,头晕,迷失,回到 dyld::_main 1000行的代码里继续分析

dyld::_main 返回result,尝试分析找result的赋值部分

image.png

MachOView俗称烂苹果打开 app可执行文件

Screen Shot 2022-04-16 at 8.30.41 PM.png

发现Executable 关键字

结合上下文跟注释,sMainExecutable --- find entry point for main executable
找 sMainExecutable的赋值

image.png

image.png

image.png

下图参考MachOView查看对照一些符号相关的内容

image.png

image.png

link main executable

image.png

绑定若引用符号表

image.png

run all initializers 程序跑起来了

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

跟libobjc联系了起来

image.png

Screen Shot 2022-04-16 at 9.15.34 PM.png

Screen Shot 2022-04-16 at 9.16.03 PM.png

libdispatch search

image.png

image.png

image.png

Screen Shot 2022-04-16 at 9.33.14 PM.png

image.png

至于libSystem_initializer 是如何调用的,通过汇编查看 -

  • 寄存器查看 - 注意 控制台打印的 rbx寄存器的内容 (libObjc)

image.png

  • 参数情况 (libDyld)

image.png

image.png

  • invoke (libSystem)

image.png

结合之前的正向分析及堆栈反向递推,整个流程如下

image.png 上图一出错误修正 - recursiveInitialization 与 doInitialization 之间的序列线,请参阅[ios应用程序加载分析(二)]里会有分析断层的补充说明

  • 需要了解关键节点:

_dyld_start(dyld) -> doModInitFunctions(dyld) -> libSystem_initializer(libSystem) -> libdispatch_init(libdispatch) -> _objc_init(libobjc) -> registerObjCNotifiers(dyld) :::::: sNotifyObjCMapped = mapped; && sNotifyObjCInit = init; && sNotifyObjCUnmapped = unmapped;

image.png

image.png

[ios应用程序加载分析(二)]