dumpdecrypted去壳

一、造锤

1. 下载dumpdecrypted的源码

源码下载地址是“https://github.com/stefanesser/dumpdecrypted/archive/master.zip”,下载后请将其解压至你习惯的位置,例如为“/Users/snakeninny/Code/”,解压后生成“/Users/snakeninny/Code/dumpdecrypted-master/”

2. 确认你的iDevice系统版本

打开设置,点击通用

3. 修改Makefile中的SDK字段

dumpdecrypted必须使用与iOS版本相同的SDK版本编译,才能正常工作。打开终端(Terminal,输入   xcrun --sdk iphoneos --show-sdk-path

查看输出,看看目前的默认SDK是什么版本,例如笔者的是“/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS7.1.sdk”


这里分2种情况:

i. 如果你使用的iOS版本同以上输出的SDK版本符合(例如使用的正是iOS 7.0.4),则无需对dumpdecrypted工程中的文件作任何改动;

ii. 如果你使用的iOS版本同以上输出的SDK版本不符,则需要更改Makefile中的

SDK=`xcrun --sdk iphoneos --show-sdk-path` iOS版本相同的SDK版本。如果你只有一个SDK,去https://developer.apple.com/downloads/index.action下载旧版本的Xcode,然后把里面的SDK提取出来。提取出了旧版的SDK后,把它们放在新版SDK相同的目录下,然后将SDK=`xcrun --sdk iphoneos --show-sdk-path`改为 

SDK=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.X.sdk

SDK=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.X.sdk

,即iOS版本需要与SDK版本相同。注意,5.1SDK编译出的dylib是向下兼容的,可以用于iOS5.06.1SDK同理。

4. 修改Makefile中的GCC_UNIVERSAL字段和dumpdecrypted.c

如果你的iOS/SDK版本是7.0,则goto "这里继续:"。如果并不是7.0,则需要修改Makefile中的GCC_UNIVERSAL字段和dumpdecrypted.c。将Makefile中的

GCC_UNIVERSAL=$(GCC_BASE) -arch armv7 -arch armv7s -arch arm64

改为    GCC_UNIVERSAL=$(GCC_BASE) -arch armv7 -arch armv7s

,再将dumpdecrypted.c76行的

if (lc->cmd ==LC_ENCRYPTION_INFO || lc->cmd == LC_ENCRYPTION_INFO_64)

改成    if(lc->cmd == LC_ENCRYPTION_INFO)

,保存。这里继续:接着直接cd“/Users/snakeninny/Code/dumpdecrypted-master/”下,然后输入“make”并回车,生成“/Users/snakeninny/Code/dumpdecrypted-master/dumpdecrypted.dylib”

5. 太麻烦?直接下载编译好的文件

https://github.com/iosre/Ready2Rock/blob/master/dumpdecrypted_5.dylib

https://github.com/iosre/Ready2Rock/blob/master/dumpdecrypted_6.dylib

https://github.com/iosre/Ready2Rock/blob/master/dumpdecrypted_7.dylib

打开链接后,点击“Raw”即可下载。

二、砸壳

1. dumpdecrypted.dylib通过scpiFunBox等工具拷贝至iOS,位置随意。

2. 定位App的可执行文件


3. 开始砸壳

cddumpdecrypted.dylib所在的目录,例如笔者是“/var/tmp/” 

DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib  /var/mobile/Applications/ /SOHUVideo.app/ SOHUVideo

回车,坐等砸壳。如果出现如下报错:

dyld: could not load inserted library 'dumpdecrypted.dylib' because no suitable image found.  Did find:       

 dumpdecrypted.dylib: stat() failed with errno=1

Trace/BPT trap: 5

则说明因沙盒的原因,dumpdecrypted.dylib不能在当前目录下工作。以笔者的经验来看,将dumpdecrypted.dylib拷贝到App目录下的任一文件夹后,在那里重新运行砸壳命令即可,如下所示:


如果出现如下报错:

dyld: could not load inserted library 'dumpdecrypted.dylib' because no suitable image found.  Did find:

        dumpdecrypted.dylib: mach-o, but wrong architectur

Trace/BPT trap: 5

复制代码

则说明dumpdecrypted.dylib与待砸App可执行文件的处理器架构不匹配,不满足DYLD_INSERT_LIBRARIES的执行条件,不能在当前设备上砸壳。这句话是什么意思呢?我们都知道iPhone 4的处理器是armv7架构,iPhone 5armv7s架构,iPhone 5sarm64架构,每种架构的处理器对arm指令是向下兼容的,也就是说,一个只含有armv7指令的可执行文件是可以在iPhone 455s上执行的,一个只含有armv7s指令的可执行文件可以在iPhone 55s上执行。但这种规则不适用于dylib——iOS上运行的dylib必须跟当前处理器的架构一样,即armv7架构的dylib只能在iPhone 4上使用,在iPhone 55s上是得不到加载的。那么举例来说,对于一个iPhone 5s,其可用的dumpdecrypted.dylib文件中必须含有arm64架构的部分,否则根本得不到加载;进一步,DYLD_INSERT_LIBRARIES要求命令中的dylibexe拥有相同架构,即arm64dylib必须对应arm64exe,否则就会出现上面的报错。而对于绝大多数App来说,为了缩小其exe体积,exe中一般是不含有arm64架构的部分的,也就是说,这些AppiPhone 5s上不能通过这种方式砸壳。同时,因为很多常用工具对arm64的支持性还不好,所以我们也不建议大家使用arm64机器作为越狱调试机。

当命令执行成功后,当前目录下会多出一个SOHUVideo.decrypted文件,表明这个App的壳被砸掉了。

你可能感兴趣的:(ios逆向编程)