dsc_extractor的编译和使用

1前言

在iOS逆向中,我们常常需要对dyld_shared_cache_armX类型的文件进行还原,第一个我们经常使用的是dyld_decache工具,但是这个工具并不能用从来还原dyld_shared_cache_arm64文件,也就是64位指令集架构的缓存文件,这个时候dsc_extractor就为你续命了。

2编译

打开终端依次执行以下命令:

1
cd ~
1
mkdir dsc_extractor
1
cd dsc_extractor
1
wget http://opensource.apple.com/tarballs/dyld/dyld-210.2.3.tar.gz
1
tar xvf dyld-210.2.3.tar.gz
1
cd dyld-210.2.3/launch-cache/
1
touch dsc_extractor.patch

通过上面的操作,我们下载下来了touch dsc_extractor的源码并且解压出来,并在其中创建了一个touch dsc_extractor.patch的空文件,接下来把以下内容复制到该文件里面去。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
--- 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 */

记住,在+/endif /后面是还有一行空行的。

然后执行一下命令:

1
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 放开注释

修改完成后,回到终端,运行

1
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
这样的文本的时候就成功了

-------评论系统采用disqus,如果看不到需要翻墙-------------