iOS逆向-dyld shared cache 动态库共享缓存-(抽取framework)

请注意,本文编写于 390 天前,最后修改于 191 天前,其中某些信息可能已经过时。

从iOS3.1开始,为了提高性能,绝大部分的系统动态库都打包存档到了一个缓存文件中。

动态库共享缓存

缓存文件存放在

dyld
dyld

文件以dyld_shared_cache_开头后面是处理器指令集的架构名称。从5s以后的设备都是arm64架构,5和5c位armv7s,3gs到4s位armv7,iphone以及3g是armv6。

动态库共享缓存的一个非常明显的好处是节省内存。例如当我们运行多个依赖UIKit.framework的程序的时候,不需要每一个app都在内存中加载一次UIKit,而系统会调用dyld程序在动态库共享缓存中查找UIKit,如果查找到只需要一个指针指向UIKit所存在的内存即可,这样就节省了每个app都加载一次UIKit的产生的内存空间。

从动态库共享缓存文件中取出单个的动态库方法:

当我们查找UIKit生成的Mach-O文件的时候,在

路径
路径
是找不到UIKit的Mach-O文件的。而MacOS/iOS是使用dyld程序去加载动态的。apple已经将dyld源代码开源了。

通过dyld.cpp的的load函数依次跟进会看到findInSharedCache的相关方法。

在开源的dyld源代码中存在一个名为dsc_extractor.cpp的C++文件。从这个文件的名字可以看出这个文件的可以从动态库共享缓存中萃取出动态库。

通过main函数我们可以看出 通过命令行工具 执行

萃取
萃取
可以取出动态库。

在main函数上面引入库的地方有一条宏指令 #if0 即默认不编译下面的代码,将#if上面的代码以及#endif删除。

编译.cpp文件为可以执行文件

clang++编译
clang++编译

按照main函数中的指令提示输入指令

main函数中的提示
main函数中的提示

抽取framework

抽取framework
抽取framework

抽取完成

抽取出的单个framework
抽取出的单个framework

笔记来自 www.520it.com 小码哥iOS逆向

Comments

添加新评论