苹果的动态库都放在了缓存里,叫动态库共享缓存,从iOS 3.1开始,为了提高性能,绝大部分的系统动态库文件都打包存放到了一个缓存文件中(dyld shared cache)
缓存文件路径:
/System/Library/Caches/com.apple.dyld/dyld_shared_cache_armX
dyld_shared_cache_armX
的X代表ARM处理器指令集架构
v6
iPhone、iPhone3G
iPod Touch、iPod Touch2v7
iPhone3GS、iPhone4、iPhone4S
iPad、iPad2、iPad3(The New iPad)
iPad mini
iPod Touch3G、iPod Touch4、iPod Touch5v7s
iPhone5、iPhone5C
iPad4arm64
iPhone5S、iPhone6、iPhone6 Plus、iPhone6S、iPhone6S Plus
iPhoneSE、iPhone7、iPhone7 Plus、iPhone8、iPhone8 Plus、iPhoneX
iPad5、iPad Air、iPad Air2、iPad Pro、iPad Pro2
iPad mini with Retina display、iPad mini3、iPad mini4
iPod Touch6
所有指令集原则上都是向下兼容的
动态库共享缓存一个非常明显的好处是节省内存
现在的ida、Hopper反编译工具都可以识别动态库共享缓存
在Mac\iOS中,是使用了/usr/lib/dyld程序来加载动态库
dyld的两种说法:
dynamic link editor,动态链接编辑器
dynamicloader,动态加载器
ndyld源码
https://opensource.apple.com/tarballs/dyld/
从动态库共享缓存抽取动态库
可以使用上面下载好的
dyld
源码中的launch-cache/dsc_extractor.cpp
将#if 0前面的代码删除(包括#if 0),把最后面的#endif也删掉编译dsc_extractor.cpp
clang++ -o dsc_extractor dsc_extractor.cpp
-
使用dsc_extractor
./dsc_extractor
动态库共享缓存文件的路径 用于存放抽取结果的文件夹
下面就是提取的动态缓存库里的Mach-O文件,可以把它拖进 Hopper 里进行分析了