iOS10.2下的IPA砸壳
前言
从App Store上下载的ipa里面的二进制文件是经过加密的,class-dump和Hopper Disassembler都需要用到未加密的二进制文件,需要通过砸壳得到。网上敲壳教程还是挺多的,几乎都差不多,但都太旧了都没有更新,例如在iOS10.2下,传统的dumpdecrypted砸壳就会有问题,需要加点其它操作才能敲成功。
查看二进制文件是否加密
使用可以otool
来查看,otool -l 二进制文件路径 | grep -B 2 crypt
-
$ otool -l WeChat.app/WeChat | grep -B 2地穴
-
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
。
-
$ ssh root@192.168.1.22
-
root@192.168.1.22的密码:
-
Dankal-Device-5s:~root#
-
复制代码
这个时候已经顺利获取了iPhone的root权限,root相当于Windows中的管理员,权限*高,可读写。
ssh相关的问题请看之前写过的“iOS10.2 SSH连接越狱设备”,这里就不多阐述。
获取设备当前的进程
iPhone打开微信,后台结束其他APP进程,控制台输入ps ax
或者ps -e
-
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 / 变种 /容器/捆绑/应用/ 46316B03 -5DC3- 4534 -8D40-A29FE9315E22 / WeChat.app /微信
-
…
-
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
勾住进程
-
Dankal-Device- 5 s: ~root #cygcript – p 1190
-
CY#
-
复制代码
看到cy#
的出现就说明,成功勾住了微信的进程。
获取沙盒路径
通过Cycript与进程交互动态获取应用的沙盒路径,输入以下任一行代码。
[NSHomeDirectory() stringByAppendingString:@"/Documents"]
NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)[0]
-
cy#[NSHomeDirectory()stringByAppendingStrin g: @ “/ Documents” ]
-
@ “/ var / mobile / Containers / Data / Application / E2ABB23B-EC66-4DA4-AD3E-E14E20D680B5 / Documents”
-
复制代码
出来显示的字符串即为沙盒品路径。
dumpdecrypted.dylib
敲壳的*重要的东西就是dumpdecrypted.dylib,确保从Github上下载了*新的dumpdecrypted源码,解压后进入dumpdecrypted文件夹的跟目录,make编译dumpdecrypted.dylib。
-
$ 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 /库/框架-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 /库/框架-F`xcrun –sdk iphoneos –show-sdk-path` / System / Library / PrivateFrameworks -arch armv7 -arch armv7s -arch arm64 -dynamiclib – o dumpdecrypted.dylib dumpdecrypted。Ø
-
-
复制代码
结束后会在当前目录中生成dumpdecrypted.dylib,这里有坑,下面会说。
拷贝dumpdecrypted.dylib到沙盒路径下
scp拷贝贝文件到越狱设备的沙盒路径下,沙盒目录刚刚用Cycript动态获取到了,如果设备不支持scp或者出现问题,可以参考“让越狱设备支持scp文件传输”,或者使用iTools等工具实现文件传输,在此不再阐述。
-
$ scp dumpdecrypted.dylib root@192.168.1.22:/ var / mobile / Containers / Data / Application / E2ABB23B-EC66-4DA4-AD3E-E14E20D680B5 / Documents
-
root@192.168.1.22的密码:
-
dumpdecrypted.dylib 100%193KB 242.3KB / s 00:00
-
复制代码
开始敲壳 以上都是准备工作,接下来可以正式砸壳了。
dumpdecrypted.dylib的具体用法是:DYLD_INSERT_LIBRARIES=to/Path/dumpdecrypted.dylib to/bundlePath
-
Dankal-设备- 5个S: 〜根#CD的/ var /移动/容器/数据/应用/ E2ABB23B-EC66- 4 DA4-AD3E-E14E20D680B5 /文件
-
Dankal-设备- 5个S:的/ var /移动/容器/数据/应用/ E2ABB23B-EC66- 4 DA4-AD3E-E14E20D680B5 /文档根#DYLD_INSERT_LIBRARIES = dumpdecrypted.dylib “的/ var /容器/捆绑/应用/ 46316B03-5DC3 -4534-8D40-A29FE9315E22 / WeChat.app /微信”
-
dyld:无法加载插入的库‘dumpdecrypted.dylib’,因为找不到合适的图像。没有找到:
-
dumpdecrypted.dyli B:所需的代码签名丢失了 “dumpdecrypted.dylib”
-
中止陷阱: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
也许一些用户需要*新的.dylib与iOS 10.2 sdk … masbog.com/dumpdecrypt…和一些iOS 10.2教程:拥抱:
*终能找到问题所在我也感到非常神奇与幸运,为了预防站长的服务器挂掉或者链接失效,我已经将.dylib上传到了七牛云上,cdn加速下载链,以防不备之需。
使用方法
拷贝*新的dumpdecrypted.dylib到设备上的/usr/lib
下
-
$ scp dumpdecrypted.dylib root@192.168.1.22:/ usr / lib
-
root@192.168.1.22的密码:
-
dumpdecrypted.dylib 100%193KB 410.8KB / s 00:00
-
复制代码
iOS 10+:
-
Dankal-Device- 5 s: ldid -S /usr/lib/dumpdecrypted.dylib
-
-
复制代码
*终一砸
-
Dankal-设备- 5个S:的/ var /移动/容器/数据/应用/ E2ABB23B-EC66- 4 DA4-AD3E-E14E20D680B5 /文档根#DYLD_INSERT_LIBRARIES = / usr / lib中/ dumpdecrypted.dylib “的/ var /容器/包/应用程序/ 46316B03-5DC3-4534-8D40-A29FE9315E22 / WeChat.app /微信”
-
马赫Ø解密自卸车
-
免责声明:此工具是 只意味着用于安全研究的目的,而不是用于应用饼干。
-
[+] 在内存中检测到64位ARM二进制文件。
-
找到[+]偏移到 cryptid :@ 0 x1000a0ca8(从0 x1000a0000)= ca8
-
[+]在地址00004000处找到长度为53149696字节的加密数据- 类型 1。
-
[+]打开/私有的/ var /容器/捆绑/应用/ 46316 B03- 5 DC3- 4534 – 8 D40-A29FE9315E22 / WeChat.app /微信为读数。
-
[+]阅读标题
-
[+]检测标题类型
-
[+]可执行是 一个 FAT图像-搜索为 右架构
-
[+]正确拱是在偏移58195968中文件
-
[+]开放WeChat.decrypted 用于写入。
-
[+]复制文件的未加密开头
-
[+]将解密的数据转储到文件中
-
[+]复制未加密的文件剩余部分
-
[+] 在偏移3780 ca8 处将LC_ENCRYPTION_INFO-> cryptid设置为 0
-
[+]关闭原始文件
-
[+]关闭转储文件
-
Dankal-设备- 5个S:的/ var /移动/容器/数据/应用/ E2ABB23B-EC66- 4 DA4-AD3E-E14E20D680B5 /文件根#
-
复制代码
查看成果 砸壳完毕,会自动在当前目录生成砸壳后的二进制文件WeChat.decrypted
-
$ ls
-
00000000000000000000000000000000 Ksid MMResourceMgr SafeMode.dat db.globalconfig
-
8 f9f003b02f320ae7f28b1250270eb48 LocalInfo.lst MMappedKV WeChat.decrypted mmupdateinfo.archive
-
复制代码
后话
终于砸壳完毕,说难也不难,从App Store上下载的ipa就这样被砸掉了壳,可见所谓的Apple Store给ipa穿上的战衣也不过如此,并没有多么安全。敲壳后的二进制文件就可以做一些好玩的东西了,比如dump出头文件等,接下来的文章会慢慢记录。