ios应用程序加载分析(一)
2022-07-05 本文已影响0人
erlich
app启动分析+猜测
首先通过入口函数main断点查看
nothing ... 通过load入口断点查看
得到大致的堆栈关键信息 (反向调用信息如下)
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 开始追踪源码
image.png image.png image.png image.png image.png image.png image.png image.png源码量大,头晕,迷失,回到 dyld::_main 1000行的代码里继续分析
dyld::_main 返回result,尝试分析找result的赋值部分
image.png
MachOView俗称烂苹果打开 app可执行文件
image.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 image.png image.pnglibdispatch search
image.png
image.png
image.png
image.png
image.png
至于libSystem_initializer 是如何调用的,通过汇编查看 -
- 寄存器查看 - 注意 控制台打印的 rbx寄存器的内容 (libObjc)
- 参数情况 (libDyld)
- invoke (libSystem)
结合之前的正向分析及堆栈反向递推,整个流程如下
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;