dsc_extractor 工具的编译及使用
1前言
在iOS逆向中,我们常常需要对dyld_shared_cache_armX类型的文件进行还原,第一个我们经常使用的是dyld_decache工具,但是这个工具并不能用从来还原dyld_shared_cache_arm64文件,也就是64位指令集架构的缓存文件,这个时候dsc_extractor就为你续命了。
2编译
打开终端依次执行以下命令:
cd ~
mkdir dsc_extractor
cd dsc_extractor
wget http://opensource.apple.com/tarballs/dyld/dyld-210.2.3.tar.gz
tar xvf dyld-210.2.3.tar.gz
cd dyld-210.2.3/launch-cache/
touch dsc_extractor.patch
通过上面的操作,我们下载下来了touch dsc_extractor的源码并且解压出来,并在其中创建了一个touch dsc_extractor.patch的空文件,接下来把以下内容复制到该文件里面去。
--- dyld-210.2.3/launch-cache/dsc_extractor.cpp 2012-05-21 02:35:15.000000000 -0400
+++ dyld-210.2.3/launch-cache/dsc_extractor.cpp 2013-07-26 16:05:03.000000000 -0400
@@ -37,6 +37,7 @@
#include <mach-o/arch.h>
#include <mach-o/loader.h>
#include <Availability.h>
+#include <dlfcn.h>
#define NO_ULEB
#include "Architectures.hpp"
@@ -456,7 +457,7 @@
}
-#if 1
+/* #if 1 */
typedef int (*extractor_proc)(const char* shared_cache_file_path, const char* extraction_root_path,
void (^progress)(unsigned current, unsigned total));
@@ -468,7 +469,7 @@
return 1;
}
- void* handle = dlopen("/Developer/Platforms/iPhoneOS.platform/usr/lib/dsc_extractor.bundle", RTLD_LAZY);
+ void* handle = dlopen("/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/usr/lib/dsc_extractor.bundle", RTLD_LAZY);
if ( handle == NULL ) {
fprintf(stderr, "dsc_extractor.bundle could not be loaded\n");
return 1;
@@ -484,7 +485,7 @@
fprintf(stderr, "dyld_shared_cache_extract_dylibs_progress() => %d\n", result);
return 0;
}
-#endif
+/* #endif */
<h3>记住,在+/*endif */后面是还有一行空行的。</h3>
然后执行一下命令:
patch < dsc_extractor.patch
执行完成该命令后,你可以在dsc_extractor.patch文件的同级目录下看到一个dsc_extractor.cpp文件,接下来打开这个文件,要修改里面的内容。如下:
原处:230行
const char* afterSlash = &dirs[1];
修改成:
char* afterSlash = &dirs[1]; 去除const
原处:460行
#if 0
修改成:
#if 1
原处:488行
/* #endif */
修改成:
#endif 放开注释
修改完成后,回到终端,运行
clang++ -o dsc_extractor dsc_extractor.cpp dsc_iterator.cpp
到了这里,dsc_extractor终于编译完成了,你可以在同级目录下看到dsc_extractor的执行文件。你可以把它复制到任何地方然后使用。
3使用
编译dsc_extractor成功后,用iFunBox将iOS 里面的/System/Library/Caches/com.apple.dyld/dyld_shared_cache_arm64复制到OSX的任何位置,然后在终端运行
dsc_extractor完成路径 arm64缓存文件路径 要保存文件的路径
然后终端显示
0/1004
1/1004
2/1004
3/1004
4/1004
5/1004
6/1004
7/1004
这样的文本的时候就成功了