dsc_extractor 工具的编译及使用

2018-04-11  本文已影响376人  77168ddcf2c6

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

上一篇下一篇

猜你喜欢

热点阅读