前言

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

查看二进制文件是否加密

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

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

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

准备敲壳

ssh连上的iPhone

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

  1. $ ssh root@192.168.1.22
  2. root@192.168.1.22的密码:
  3. Dankal-Device-5s:~root#
  4. 复制代码

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

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

获取设备当前的进程

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

  1. Dankal-Device-5s:~root#ps -e
  2. PID TTY TIME CMD
  3. 1 ?? 0:26.19 / sbin / launchd
  4. 21 ?? 0:01.77 / usr / sbin / syslogd
  5. 42 ?? 0:17.65 / usr / libexec / logd
  6. 44 ?? 0:00.08 /System/Library/PrivateFrameworks/MobileSoftwareUpdate.framework/Support/softwareupdated
  7. 1190 ?? 0:08.03 / 变种 /容器/捆绑/应用/ 46316B03 -5DC3- 4534 -8D40-A29FE9315E22 / WeChat.app /微信
  8. 1391 ?? ?? 0:00.17 / usr / local / bin / dropbear -F -R -p 22
  9. 1392 ttys000 0:00.04 -sh
  10. 1401 ttys000 0:00.01 ps -e
  11. 1020 ttys001 0:00.02 login -fp mobile
  12. 1021 ttys001 0:00.06 -SH
  13. 复制代码

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

勾住进程

  1. Dankal-Device- 5 s: ~root #cygcript – p 1190
  2. CY#
  3. 复制代码

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

获取沙盒路径

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

  • [NSHomeDirectory() stringByAppendingString:@"/Documents"]
  • NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)[0]
  1. cy#[NSHomeDirectory()stringByAppendingStrin g: @ “/ Documents” ]
  2. @ “/ var / mobile / Containers / Data / Application / E2ABB23B-EC66-4DA4-AD3E-E14E20D680B5 / Documents”
  3. 复制代码

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

dumpdecrypted.dylib

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

  1. $ cd / Users / bingo / Downloads / dumpdecrypted-master
  2. $ make
  3. `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
  4. `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。Ø
  5. 复制代码

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

拷贝dumpdecrypted.dylib到沙盒路径下

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

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

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

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

  1. Dankal-设备- 5个S: 〜根#CD的/ var /移动/容器/数据/应用/ E2ABB23B-EC66- 4 DA4-AD3E-E14E20D680B5 /文件
  2. Dankal-设备- 5个S:的/ var /移动/容器/数据/应用/ E2ABB23B-EC66- 4 DA4-AD3E-E14E20D680B5 /文档根#DYLD_INSERT_LIBRARIES = dumpdecrypted.dylib “的/ var /容器/捆绑/应用/ 46316B03-5DC3 -4534-8D40-A29FE9315E22 / WeChat.app /微信”
  3. dyld:无法加载插入的库‘dumpdecrypted.dylib’,因为找不到合适的图像。没有找到:
  4. dumpdecrypted.dyli B:所需的代码签名丢失了 “dumpdecrypted.dylib”
  5. 中止陷阱:6
  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

  1. $ scp dumpdecrypted.dylib root@192.168.1.22:/ usr / lib
  2. root@192.168.1.22的密码:
  3. dumpdecrypted.dylib 100%193KB 410.8KB / s 00:00
  4. 复制代码

iOS 10+:

  1. Dankal-Device- 5 s: ldid -S /usr/lib/dumpdecrypted.dylib
  2. 复制代码

*终一砸

  1. 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 /微信”
  2. 马赫Ø解密自卸车
  3. 免责声明:此工具是 只意味着用于安全研究的目的,而不是用于应用饼干。
  4. [+] 在内存中检测到64位ARM二进制文件。
  5. 找到[+]偏移到 cryptid :@ 0 x1000a0ca8(从0 x1000a0000)= ca8
  6. [+]在地址00004000处找到长度为53149696字节的加密数据- 类型 1。
  7. [+]打开/私有的/ var /容器/捆绑/应用/ 46316 B03- 5 DC3- 4534 – 8 D40-A29FE9315E22 / WeChat.app /微信为读数。
  8. [+]阅读标题
  9. [+]检测标题类型
  10. [+]可执行是 一个 FAT图像-搜索为 右架构
  11. [+]正确拱是在偏移58195968中文件
  12. [+]开放WeChat.decrypted 用于写入。
  13. [+]复制文件的未加密开头
  14. [+]将解密的数据转储到文件中
  15. [+]复制未加密的文件剩余部分
  16. [+] 在偏移3780 ca8 处将LC_ENCRYPTION_INFO-> cryptid设置为 0
  17. [+]关闭原始文件
  18. [+]关闭转储文件
  19. Dankal-设备- 5个S:的/ var /移动/容器/数据/应用/ E2ABB23B-EC66- 4 DA4-AD3E-E14E20D680B5 /文件根#
  20. 复制代码

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

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

后话

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