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

文件以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文件的时候,在

通过dyld.cpp的的load函数依次跟进会看到findInSharedCache的相关方法。
在开源的dyld源代码中存在一个名为dsc_extractor.cpp的C++文件。从这个文件的名字可以看出这个文件的可以从动态库共享缓存中萃取出动态库。
通过main函数我们可以看出 通过命令行工具 执行
可以取出动态库。
在main函数上面引入库的地方有一条宏指令 #if0
即默认不编译下面的代码,将#if
上面的代码以及#endif
删除。
编译.cpp文件为可以执行文件

生成的可执行文件

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

抽取framework

抽取完成

笔记来自 www.520it.com 小码哥iOS逆向
网友评论