春节回来,发现我的 iphone 6plus 关机了, 我的ios 系统是 15.8.5, 采用的是 dopamine 越狱, 属于无根越狱, 每次重启就需要重新越狱。所以特别坑。
当我充好电,打开手机,点击 dopamine 发现弹出 dopamine 不可用, 并且我手机桌面上的 sileo 也不见了. sileo 是dopamine 越狱后的一个包管理平台.
然后我用爱思助手重新越狱,发现失败了,跟之前是一个情况, 于是我想到之前我的手机里装了巨魔, 我直接通过巨魔来安装 dopamine.ipa. 于是打开巨魔,选择 install from url,
输入 https://github.com/opa334/Dopamine/releases/download/2.4.7/Dopamine.ipa.
这个安装包在 https://github.com/opa334/Dopamine/releases/tag/2.4.7
安装好后,打开 dopamine, 点击越狱, 过程全自动, 等待一段时间后,会自动重启, 重启后桌面出现了 sileo 和 dopamine, 并且进入 sileo 后, 之前装的 ssh 还有各种插件都还可以正常使用. 所以这里记录一下
当手机意外重启后,或者没电重启后, 可以直接通过巨魔来安装 dopamine.ipa. 并且之前的所以数据都还在, 并且还不用重装.
或者也可以在windows 上把dopamine.ipa 下载好, 然后打开爱思助手,将ipa 拖到这个手机目录下

然后手机上装个 filza app,在 /var/mobile/Media/Downloads 目录下就可以找到从爱思助手上拖入的文件.
于是抓包. 结果如下, 主要就是这个 -96参数

因为之前还原过安卓端的算法, 知道这是一个魔改的白盒 AES 的算法. 并且结果是标准的base64. 所以我们直接 hook base64 看看
1 | /var/jb/usr/sbin/frida-server -l 0.0.0.0:6666 # 启动 frida-server 监听 6666 端口 |
7885 是pid,
然后将这段代码贴进 handles 中,因为结果特别多,所以我们只过滤需要的信息. 并且打印堆栈.
1 | { |
然后继续 hook
1 | /home/chilly/xxxx/ios_frida_env/bin/frida-trace -H 172.31.101.83:6666 2092 -m "-[NSData base64EncodedStringWithOptions:]" |
结果如下
可以看到调用堆栈, 上层调用了 encryptDataBase64String 函数, 我们用 frida hook 一下 encryptDataBase64String 这个函数. 如下给出 hook 代码
1 | function hook() { |
1 | /home/chilly/zhipu/ios_frida_env/bin/frida -H 172.31.101.83:6666 -n osxxxunixxxxxRelexxx -l hook_encryptDataBase64String.js |
结果如下
可以看到入参是 32 字节, 这让我想到了安卓, 入参也是 32 字节。我验证了一下, 跟android 一样, 这个入参就是url, headers 中几个字段拼接起来做标准md5 生成的.
要注意 0x64626137, 转成hex 是 dba7 也就是md5 的32字符的前4个字符.
那主动rpc call 调用一下算法看看
1 | if (ObjC.available) { |
结果如下
可以看到 当入参是 md5, -96的结果已经出来了. 可以 rpc 调用算法了.
我们这里试试看 chomper 还原该算法. 这里我直接给出代码, 部分已脱敏
1 | import os |
看看 chomper 跑出的结果

跟抓包结果完全一致。 这是最理想的, 因为当输入固定,输出也是固定的,算法内部没有时间戳,随机数参与计算. 这样就很好验证算法结果。