iOS10.2下的ipa砸壳

前言

从 App Store 上下载的 ipa 里面的二进制文件是经过加密的,class-dump 和 Hopper Disassembler 都需要用到未加密的二进制文件,需要通过砸壳得到。网上敲壳教程还是挺多的,几乎都差不多,但都太旧了都没有更新,例如在 iOS10.2 下,传统的 dumpdecrypted 砸壳就会有问题,需要加点其它操作才能敲成功。

查看二进制文件是否加密

可以使用 otool 来查看,otool -l 二进制文件路径 | grep -B 2 crypt

1
2
3
4
5
6
7
8
9
10
11
12
$ otool -l WeChat.app/WeChat | grep -B 2 crypt
cmd LC_ENCRYPTION_INFO
cmdsize 20
cryptoff 16384
cryptsize 49463296
cryptid 1
--
cmd LC_ENCRYPTION_INFO_64
cmdsize 24
cryptoff 16384
cryptsize 53149696
cryptid 1

cryptid 为1时说明被加密,为0时则是未加密。可以看到微信已经被加密了,第一个对应的是较老的 armv7 架构,后者则是 arm64 架构。被加密的二进制文件直接拿起来就撸是没用的,需要先敲壳。

准备敲壳

ssh 连上的 iPhone

确保 iPhone 和 Mac 在同一个网段,我的 iPhone 的 IP 地址为 192.168.1.22。OpenSSH 的 root 密码默认为 alpine

1
2
3
$ ssh root@192.168.1.22
root@192.168.1.22's password:
Dankal-Device-5s:~ root#

这个时候已经顺利获取了 iPhone 的 root 权限,root 相当于 Windows 中的 administrator,权限最高,可读写。

ssh 相关的问题请看之前写过的《iOS10.2 SSH连接越狱设备》,这里就不多阐述。

获取设备当前的进程

iPhone 打开微信,后台结束其他 APP 进程,控制台输入 ps ax 或者 ps -e

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Dankal-Device-5s:~ root# ps -e
PID TTY TIME CMD
1 ?? 0:26.19 /sbin/launchd
21 ?? 0:01.77 /usr/sbin/syslogd
42 ?? 0:17.65 /usr/libexec/logd
44 ?? 0:00.08 /System/Library/PrivateFrameworks/MobileSoftwareUpdate.framework/Support/softwareupdated
...
1190 ?? 0:08.03 /var/containers/Bundle/Application/46316B03-5DC3-4534-8D40-A29FE9315E22/WeChat.app/WeChat
...
1391 ?? 0:00.17 /usr/local/bin/dropbear -F -R -p 22
1392 ttys000 0:00.04 -sh
1401 ttys000 0:00.01 ps -e
1020 ttys001 0:00.02 login -fp mobile
1021 ttys001 0:00.06 -sh

找到微信的的进程,记住 PID 为 1190,Bundle 路径/var/containers/Bundle/Application/46316B03-5DC3-4534-8D40-A29FE9315E22/WeChat.app/WeChat

勾住进程

1
2
Dankal-Device-5s:~ root# cycript -p 1190
cy#

看到 cy# 的出现就说明,成功勾住了微信的进程。

获取沙盒路径

通过 Cycript 与进程交互动态获取应用的沙盒路径,输入以下任一行代码。

  • [NSHomeDirectory() stringByAppendingString:@"/Documents"]

  • NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)[0]

1
2
cy# [NSHomeDirectory() stringByAppendingString:@"/Documents"]
@"/var/mobile/Containers/Data/Application/E2ABB23B-EC66-4DA4-AD3E-E14E20D680B5/Documents"

显示出来的字符串即为沙盒路径

dumpdecrypted.dylib

敲壳的最重要的东西就是 dumpdecrypted.dylib,确保从 Github 上下载了最新的 dumpdecrypted 源码 ,解压后进入 dumpdecrypted 文件夹的跟目录,make 编译 dumpdecrypted.dylib。

1
2
3
4
$ cd /Users/bingo/Downloads/dumpdecrypted-master
$ 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

结束后会在当前目录中生成 dumpdecrypted.dylib,这里有坑,下面会说。

拷贝 dumpdecrypted.dylib 到沙盒路径下

scp 拷贝文件到越狱设备的沙盒路径下,沙盒目录刚刚用 Cycript 动态获取到了,如果设备不支持 scp 或者出现问题,可以参考《让越狱设备支持scp文件传输》,或者使用 iTools 等工具实现文件传输,在此不再阐述。

1
2
3
$ scp dumpdecrypted.dylib root@192.168.1.22:/var/mobile/Containers/Data/Application/E2ABB23B-EC66-4DA4-AD3E-E14E20D680B5/Documents
root@192.168.1.22's password:
dumpdecrypted.dylib 100% 193KB 242.3KB/s 00:00

开始敲壳

以上都是准备工作,接下来可以正式砸壳了。

dumpdecrypted.dylib 的具体用法是:DYLD_INSERT_LIBRARIES=to/Path/dumpdecrypted.dylib to/bundlePath

1
2
3
4
5
6
7
Dankal-Device-5s:~ root# cd /var/mobile/Containers/Data/Application/E2ABB23B-EC66-4DA4-AD3E-E14E20D680B5/Documents
Dankal-Device-5s:/var/mobile/Containers/Data/Application/E2ABB23B-EC66-4DA4-AD3E-E14E20D680B5/Documents root# DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib "/var/containers/Bundle/Application/46316B03-5DC3-4534-8D40-A29FE9315E22/WeChat.app/WeChat"
dyld: could not load inserted library 'dumpdecrypted.dylib' because no suitable image found. Did find:
dumpdecrypted.dylib: required code signature missing for 'dumpdecrypted.dylib'
Abort trap: 6

很明显砸壳失败了,这跟说好的不一样!为什么别人砸壳成功了,而我却砸失败了?重复试了几次都不成功。

于是开始找问题,首先怀疑我的设备的 CPU 架构不对,打开 iTools 可以明显看到是 iPhone 5s、arm64、已越狱,没毛病,如果是 32位处理器的话应该是越狱不成功的。

再找问题,怀疑是 yalu02 越狱的时候出了问题,重启再越狱了一遍,还是一样的问题。

继续寻找,设备不支持吗?网上搜索 “iPhone5s 砸壳失败”,很失望,没有相关的资料,搜到的全是真的手机壳的相关问题。

最后,怀疑是越狱本身就有问题,毕竟 iOS 10.2 是非完美越狱。于是搜 “iOS 10.2 dumpdecrypted 失败”,终于摸索到相关文章,真的不容易啊,卡了一天,终于找到了解决方案。学会定位问题与使用搜索引擎对于程序员来说还是很重要的!

正确砸壳

dumpdecrypted 对系统 ios 9.3.2 以上的版本砸壳失败,会报错 Killed: 9解决方案

当然,我们现在是 iOS 10.2,上面的解决方案可能还有问题,最后找到正确的解决方法,就是另外下载 dumpdecrypted.dylib,链接来自上面解决方案的页面下的评论。

masbog

maybe some user need latest .dylib with iOS 10.2 sdk… https://masbog.com/dumpdecrypt/11 and some tutorial for iOS 10.2 :hugging:

最终能找到问题所在我也感到非常神奇与幸运,为了预防站长的服务器挂掉或者链接失效,我已经将 .dylib 上传到了七牛云上,cdn加速下载链,以防不备之需。

使用方法

拷贝最新的 dumpdecrypted.dylib 到设备上的 /usr/lib

1
2
3
$ scp dumpdecrypted.dylib root@192.168.1.22:/usr/lib
root@192.168.1.22's password:
dumpdecrypted.dylib 100% 193KB 410.8KB/s 00:00

iOS 10+:

1
Dankal-Device-5s: ldid -S /usr/lib/dumpdecrypted.dylib

最终一砸

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Dankal-Device-5s:/var/mobile/Containers/Data/Application/E2ABB23B-EC66-4DA4-AD3E-E14E20D680B5/Documents root# DYLD_INSERT_LIBRARIES=/usr/lib/dumpdecrypted.dylib "/var/containers/Bundle/Application/46316B03-5DC3-4534-8D40-A29FE9315E22/WeChat.app/WeChat"
mach-o decryption dumper
DISCLAIMER: This tool is only meant for security research purposes, not for application crackers.
[+] detected 64bit ARM binary in memory.
[+] offset to cryptid found: @0x1000a0ca8(from 0x1000a0000) = ca8
[+] Found encrypted data at address 00004000 of length 53149696 bytes - type 1.
[+] Opening /private/var/containers/Bundle/Application/46316B03-5DC3-4534-8D40-A29FE9315E22/WeChat.app/WeChat for reading.
[+] Reading header
[+] Detecting header type
[+] Executable is a FAT image - searching for right architecture
[+] Correct arch is at offset 58195968 in the file
[+] Opening WeChat.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 3780ca8
[+] Closing original file
[+] Closing dump file
Dankal-Device-5s:/var/mobile/Containers/Data/Application/E2ABB23B-EC66-4DA4-AD3E-E14E20D680B5/Documents root#

查看成果

砸壳完毕,会自动在当前目录生成砸壳后的二进制文件 WeChat.decrypted

1
2
3
$ ls
00000000000000000000000000000000 Ksid MMResourceMgr SafeMode.dat db.globalconfig
8f9f003b02f320ae7f28b1250270eb48 LocalInfo.lst MMappedKV WeChat.decrypted mmupdateinfo.archive

后话

终于砸壳完毕,说难也不难,从 App Store 上下载的 ipa 就这样被砸掉了壳,可见所谓的 Apple Store 给 ipa 穿上的战衣也不过如此,并没有多么安全。敲壳后的二进制文件就可以做一些好玩的东西了,比如 dump 出头文件等,接下来的文章会慢慢记录。

  • 本文作者: Bingo
  • 本文链接: https://blog.bingo.ren/23.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!