前言
之前一直采用Clutch对ipa包进行砸壳,后来发现Clutch在某些iOS版本下砸壳会失效,故而放弃了Clutch而采用dumpdecrypted。本篇文章就是记录用dumpdecrypted砸壳的过程以及其中的注意点。
准备工作
砸壳需要的东西:
- dumpdecrypted
- 越狱的iOS设备
- OpenSSH(Cydia)
- iFile(Cydia)
- Cycript(Cydia)
- XCode
- Command Line Tools
编译dumpdecrypted
从Github上下载最新的dumpdecrypted源码,在命令行中进入进入源码的目录下,输入make进行编译生成dumpdecrypted.dylib。这里有一点需要注意,编译时依赖的XCode的SDK版本需要兼容iOS越狱设备的系统版本。比如,我当前XCode的SDK版本是iOS10.0,而我的越狱设备的系统版本是iOS 9.3.1,按照当前配置编译出来的dumpdecrypted.dylib在设备上进行砸壳是会失败的。那如何知道Xcode当前的SDK版本呢?我们可以在命令行中输入命令:xcrun –sdk iphoneos –show-sdk-path。
1
| /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.0.sdk
|
若SDK版本不兼容怎么办?可以在这里下载过往版本的SDK。把下载的SDK替换当前SDK的位置,当然别忘了把当前SDK备份,或者用xcode-select命令指定一个活动的XCode。最后再make,成功,输出如下:
1 2 3 4 5 6 7
| $ make `xcrun --sdk iphoneos --find gcc` -Os -Wimplicit -isysroot `xcrun --sdk iphoneos --show-sdk-path` -F`xcrun --sdk iphoneos --show-sdk-path`/System/Library/Frameworks -F`xcrun --sdk iphoneos --show-sdk-path`/System/Library/PrivateFrameworks -arch armv7 -arch armv7s -arch arm64 -c -o dumpdecrypted.o dumpdecrypted.c `xcrun --sdk iphoneos --find gcc` -Os -Wimplicit -isysroot `xcrun --sdk iphoneos --show-sdk-path` -F`xcrun --sdk iphoneos --show-sdk-path`/System/Library/Frameworks -F`xcrun --sdk iphoneos --show-sdk-path`/System/Library/PrivateFrameworks -arch armv7 -arch armv7s -arch arm64 -dynamiclib -o dumpdecrypted.dylib dumpdecrypted.o $ ls Makefile dumpdecrypted.c dumpdecrypted.o README dumpdecrypted.dylib
|
再看目录下多出了两个文件:dumpdecrypted.o
和dumpdecrypted.dylib
,其中dumpdecrypted.dylib
是我们用来砸壳的锤子。
配置iOS越狱设备
进入越狱设备的Cydia中下载安装OpenSSH、Cycript、iFile。在越狱设备上安装上需要砸壳的APP。
在Mac命令行中通过SSH连接iOS设备,这里必须确保iOS设备与mac电脑处于同一无线网络下,OpenSSH的默认密码是alpine。
1 2
| // 192.168.xx.xx为iOS设备在wifi下的IP地址 ssh root@192.168.xx.xx
|
连接成功后,需要找到砸壳APP的bundle id了,我们可以把除砸壳APP的所有其他APP关掉,在命令行中输入:ps -e命令。以微信为例,我们可以看到微信的bundle id为WeChat。
知道了bundle id,我们就可以通过Cycript找到微信Documents路径,在命令行中输入:cycript -p WeChat,再输入:NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES)[0]。
记下bundle id和Documents的路径,后面会用到。
砸壳
将dumpdecrypted.dylib拷贝到iOS越狱设备上,这里可以用像iTools、iFunBox工具,我用的是scp命令将其传到iOS设备。
1 2 3
| $ scp dumpdecrypted.dylib root@192.168.xxx.xxx:/usr/lib root@192.168.xxx.xxx's password: dumpdecrypted.dylib 100% 81KB 81.0KB/
|
注意,若你的设备是iOS 9.3以上,可能会在后面的砸壳中出现错误,所以,推荐将dumpdecrypted.dylib
传到/usr/lib目录下。
在命令行中切换到/usr/lib目录下,输入砸壳命令:DYLD_INSERT_LIBRARIES=”dumpdecrypted.dylib的路径” “app的Bundle id的路径”
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| root mach-o decryption dumper DISCLAIMER: This tool is only meant for security research purposes, not for application crackers. [+] detected 32bit ARM binary in memory. [+] offset to cryptid found: @0xd5a90(from 0xd5000) = a90 [+] Found encrypted data at address 00004000 of length 3047424 bytes - type 1. [+] Opening /private/var/mobile/Applications/EBBD26E9-DDBA-481E-9403-84D159436889/HBGC.app/HBGC for reading. [+] Reading header [+] Detecting header type [+] Executable is a FAT image - searching for right architecture [+] Correct arch is at offset 16384 in the file [+] Opening HBGC.decrypted for writing. [+] Copying the not encrypted start of the file [+] Dumping the decrypted data into the file [+] Copying the not encrypted remainder of the file [+] Setting the LC_ENCRYPTION_INFO->cryptid to 0 at offset 4a90 [+] Closing original file [+] Closing dump file
|
到此,砸壳工作就完成了。这里还有一点说明,StoreApp对沙盒以外的其他大多数目录没有写权限。除了/usr/lib外,你还可以把dumpdecrypted.dylib拷贝到Documents目录下操作。如果不放在Documents目录下,可能会出现下面的问题:
1 2 3 4 5
| FunMaker-5: /var/mobile/Containers/Data/Application/D41C4343-63AA-4BFF-904B-2146128611EE/Documents root FunMaker-5: /var/mobile/Containers/Data/Application/D41C4343-63AA-4BFF-904B-2146128611EE/Documents root FunMaker-5:/var/tmp root dyld: could not load inserted library 'dumpdecrypted.dylib' because no suitable image found. Did find: dumpdecrypted.dylib: stat() failed with errno=1
|