概要
从iOS3.1开始,为了提高性能,绝大部分的系统动态库文件都打包存放到了一个缓存文件中(dyld shared cache),缓存文件路径:/System/Library/Caches/com.apple.dyld/dyld_shared_cache_armX
指令架构图显示
指令架构图说明动态缓存图显示
共用缓存图 动态共享缓存图两者相比的好处是,共用的一些信息内容可以存放到共享缓存中,例如一些header文件信息等
动态库的加载
在Mac、iOS中,是使用了/usr/lib/dyld程序来加载动态库dyld,有两种叫法
dyld:dynamic link editor,动态链接编辑器
dyld:dynamic loader,动态加载器
从动态库共享缓存抽取动态库
1.首先在手机获取下来动态库,方式有如下:
穿越 iPhone firmware. Such as: https://ipsw.me/
通过越狱设备. 路径: /System/Library/Caches/com.apple.dyld/dyld_shared_cache_arm64
2.从源码中获取dsc_extractor二进制命令
使用dyld源码中的launch-cache/dsc_extractor.cpp,将#if 0前面的代码删除或者注释,把后面#endif 也删除,然后变编译dsc_extractor.cpp
clang++ -o dsc_extractor dsc_extractor.cpp
如果没有报错,直接到抽取动态库文件这一步,如果报错请遵循相关错误解决
错误一:$ ./dsc_extractor dyld_shared_cache_arm64 arm64Error: dyld shared cache code signatureforpage 0 is incorrect.dyld_shared_cache_extract_dylibs_progress() =>-1
这个错误说明dsc_extractor.bundle Can't work on Xcode10,So the dsc_extractor.bundle is the Xcode9 version.then modify the ./dyld/launch-cache/dsc_extractor.cpp
#if 0
#if 1
//test program
#include<stdio.h>
#include<stddef.h>
@@ -644,7 +644,7 @@ int main(int argc, const char* argv[])
}
//void* handle = dlopen("/Volumes/my/src/dyld/build/Debug/dsc_extractor.bundle", RTLD_LAZY);
//下面这里的Xcode更改成为10版本以下的
void* handle = dlopen("/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/usr/lib/dsc_extractor.bundle", RTLD_LAZY);
void* handle =dlopen("dsc_extractor.bundle", RTLD_LAZY);
if( handle ==NULL) {
fprintf(stderr,"dsc_extractor.bundle could not be loaded\n");
return1;
3.抽取动态库文件
./dsc_extractor 动态库共享缓存文件的路径 用于粗放结果目录
导出图
网友评论