一、造锤
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.1版SDK编译出的dylib是向下兼容的,可以用于iOS5.0,6.1版SDK同理。
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.c第76行的
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通过scp或iFunBox等工具拷贝至iOS,位置随意。
2. 定位App的可执行文件
3. 开始砸壳
cd到dumpdecrypted.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 5是armv7s架构,iPhone 5s是arm64架构,每种架构的处理器对arm指令是向下兼容的,也就是说,一个只含有armv7指令的可执行文件是可以在iPhone 4、5、5s上执行的,一个只含有armv7s指令的可执行文件可以在iPhone 5和5s上执行。但这种规则不适用于dylib——在iOS上运行的dylib必须跟当前处理器的架构一样,即armv7架构的dylib只能在iPhone 4上使用,在iPhone 5和5s上是得不到加载的。那么举例来说,对于一个iPhone 5s,其可用的dumpdecrypted.dylib文件中必须含有arm64架构的部分,否则根本得不到加载;进一步,DYLD_INSERT_LIBRARIES要求命令中的dylib和exe拥有相同架构,即arm64的dylib必须对应arm64的exe,否则就会出现上面的报错。而对于绝大多数App来说,为了缩小其exe体积,exe中一般是不含有arm64架构的部分的,也就是说,这些App在iPhone 5s上不能通过这种方式砸壳。同时,因为很多常用工具对arm64的支持性还不好,所以我们也不建议大家使用arm64机器作为越狱调试机。
当命令执行成功后,当前目录下会多出一个SOHUVideo.decrypted文件,表明这个App的壳被砸掉了。