起因
使用越狱机有七年多了,中间也换过几次手机,每次拿到新的iOS设备的时候想到的第一件事就是越狱,然后装上一些经典的插件。
昨天给手机安装iCleaner Pro的时候不小心锁屏了,等我要解锁时手机就突然注销,然后菊花圈一直在转,见此情况我也只能强制关机,重新启动到未越狱的状态;但是再次尝试越狱后还是会发生无限转圈的错误。
我把我这次的修复过程贴出来给大伙做个参考,虽然技术力不算太高但是仍然有用,想到曾经遇到这种问题我就直接刷机了居然感觉还有点亏,也给各位打个小小的预防针
设备情况
本人使用的iPhone 6s 64G iOS10.2,Yalu越狱,去年花了好久才从闲鱼上淘到的一部无锁无ID的iOS10设备,对正在阅读本篇文章的iOS10用户可能比较有帮助。
这个方法利用了Yalu的特性,因此我不能保证doubleH3lix这些是否也具备相同特性。
解决思路
考虑到是在安装插件的过程中发生的错误,因此我决定通过SSH来找到是什么地方出的问题,第一时间想到了爱思助手自带的打开SSH通道功能
爱思助手SSH通道开启后窗口正常的流程就是打开终端直接使用ssh命令连接到设备,但是这里出现的问题也很明显,根本无法连接,控制台返回如下:
(base) TorrekietekiMacBook-Pro:~ Torrekie$ ssh root@127.0.0.1:1025
ssh: Could not resolve hostname 127.0.0.1:1025: nodename nor servname provided, or not known
(注:准备发文章时发现这里是我操作错误了,正确方法应该将端口填写在-p参数,即“ssh root@127.0.0.1 -p 1025”)
既然爱思助手的这个功能行不通,那就只能另辟蹊径了
在iOS10 Yalu越狱的设备上,一般不会被推荐安装OpenSSH
,这是因为Yalu自带了一个叫做Dropbear
的东西起到了替代OpenSSH
的作用
但是在Yalu的默认设置里面,它的ssh通道是仅面向本地(本机)的,我们并不能从另外一个设备去访问。
因此我们要对yalu102的ipa文件稍作修改,来实现局域网内的访问
重启恢复到未越狱状态后,我卸载了手机上已经安装的yalu102,并在电脑上找到yalu102的ipa文件,解压,找到dropbear.plist
文件(/Payload/yalu102.app/dropbear.plist
)
这个文件就用于控制dropbear
的启动项,在用户执行越狱操作之后,dropbear
就会在后台启动。
控制dropbear的配置文件
使用plist编辑器(本人在用macOS所以直接用Xcode做示范了)打开,有一个
ProgramArguments
数组,展开后有5项,第五项就是对应ssh被打开后的端口设置
此处把127.0.0.1:22
更改为22
,保存
接下来的步骤就是打包了,因为我在使用macOS操作,要避免“归档实用工具”在打包时插入
__MACOSX
文件夹,所以使用zip命令将已经修改好的文件打包
cd 你解压的位置
zip yalu.ipa * -r
正常返回如下
(注意查杀.DS_Store
文件,这里因为忘了而不小心打包进去)
(base) TorrekietekiMacBook-Pro:yl Torrekie$ zip yalu.ipa * -r
adding: Payload/ (stored 0%)
adding: Payload/.DS_Store (deflated 95%)
adding: Payload/yalu102.app/ (stored 0%)
adding: Payload/yalu102.app/_CodeSignature/ (stored 0%)
adding: Payload/yalu102.app/_CodeSignature/CodeResources (deflated 77%)
adding: Payload/yalu102.app/AppIcon20x20@2x.png (stored 0%)
adding: Payload/yalu102.app/0.reload.plist (deflated 19%)
adding: Payload/yalu102.app/AppIcon20x20@3x.png (deflated 0%)
adding: Payload/yalu102.app/launchctl (deflated 70%)
adding: Payload/yalu102.app/AppIcon60x60@2x.png (deflated 2%)
adding: Payload/yalu102.app/AppIcon29x29@2x.png (deflated 0%)
adding: Payload/yalu102.app/AppIcon40x40@3x.png (deflated 2%)
adding: Payload/yalu102.app/AppIcon29x29~ipad.png (stored 0%)
adding: Payload/yalu102.app/AppIcon40x40@2x.png (deflated 1%)
adding: Payload/yalu102.app/AppIcon29x29@3x.png (deflated 1%)
adding: Payload/yalu102.app/AppIcon60x60@3x.png (deflated 2%)
adding: Payload/yalu102.app/Base.lproj/ (stored 0%)
adding: Payload/yalu102.app/Base.lproj/Main.storyboardc/ (stored 0%)
adding: Payload/yalu102.app/Base.lproj/Main.storyboardc/UIViewController-BYZ-38-t0r.nib (deflated 34%)
adding: Payload/yalu102.app/Base.lproj/Main.storyboardc/BYZ-38-t0r-view-8bC-Xf-vdC.nib (deflated 44%)
adding: Payload/yalu102.app/Base.lproj/Main.storyboardc/Info.plist (deflated 42%)
adding: Payload/yalu102.app/Base.lproj/LaunchScreen.storyboardc/ (stored 0%)
adding: Payload/yalu102.app/Base.lproj/LaunchScreen.storyboardc/01J-lp-oVM-view-Ze5-6b-2t3.nib (deflated 41%)
adding: Payload/yalu102.app/Base.lproj/LaunchScreen.storyboardc/UIViewController-01J-lp-oVM.nib (deflated 33%)
adding: Payload/yalu102.app/Base.lproj/LaunchScreen.storyboardc/Info.plist (deflated 42%)
adding: Payload/yalu102.app/reload (deflated 59%)
adding: Payload/yalu102.app/AppIcon40x40@2x~ipad.png (deflated 1%)
adding: Payload/yalu102.app/AppIcon76x76@2x~ipad.png (deflated 2%)
adding: Payload/yalu102.app/AppIcon83.5x83.5@2x~ipad.png (deflated 2%)
adding: Payload/yalu102.app/yalu102 (deflated 70%)
adding: Payload/yalu102.app/AppIcon29x29@2x~ipad.png (deflated 0%)
adding: Payload/yalu102.app/AppIcon40x40~ipad.png (stored 0%)
adding: Payload/yalu102.app/AppIcon20x20~ipad.png (stored 0%)
adding: Payload/yalu102.app/dropbear.plist (deflated 13%)
adding: Payload/yalu102.app/tar (deflated 43%)
adding: Payload/yalu102.app/bootstrap.tar (deflated 64%)
adding: Payload/yalu102.app/AppIcon20x20@2x~ipad.png (stored 0%)
adding: Payload/yalu102.app/Info.plist (deflated 35%)
adding: Payload/yalu102.app/PkgInfo (stored 0%)
adding: Payload/yalu102.app/AppIcon76x76~ipad.png (deflated 1%)
命令执行正常的情况下,你可以在这个文件夹里面看到yalu.ipa,就是我们刚刚打包完成的文件。
下一步把这个ipa安装到设备
(我使用的签名工具是AltDeploy,其他工具亦可)
AltDeploy窗口
安装完成后,前往iPhone>设置>Wi-Fi,查看手机当前所在局域网所分配的内网IP
记住这个IP,接下来执行越狱操作,可以看见又开始无限转圈了
确保电脑与手机处在同网络下,我们ssh到手机,以root身份登录,目标位置就是刚刚记下的内网IP
(root默认密码alpine
,建议各位登录后使用passwd
命令及时修改)
ssh root@目标位置
连接成功,说明dropbear正常工作
(base) TorrekietekiMacBook-Pro:yl Torrekie$ ssh root@172.31.16.77
The authenticity of host '172.31.16.77 (172.31.16.77)' can't be established.
ECDSA key fingerprint is SHA256:pSCKq7g3Qr86I6cxP6IVFNM+LCrkf3cSozdKgP22mpM.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '172.31.16.77' (ECDSA) to the list of known hosts.
root@172.31.16.77's password:
iPhone:~ root#
我首先做的一件事情是刷新一下软件源,不管有没有用,总还是一个好习惯
apt-get update
apt-get可以正常工作,说明我们可以对插件执行下一步操作
当然我首先想到的是用
apt-get remove
卸载我刚刚安装的插件,不过因为我也没有记住这个插件的ID,所以只能另辟蹊径(插件的ID可以在每个插件的预览页面底端找到)
(尽量不要下载明显被修改ID的插件,从作者官方源下载是首选)
被明显修改BundleID的插件例
所以接下来我计划使用APT自带的检查工具来查找是否有哪些插件的安装配置不正常,结果dpkg自己的配置都有问题
apt-get check
iPhone:/var/mobile/Documents/CyDown root# apt-get check
E: dpkg was interrupted, you must manually run 'dpkg --configure -a' to correct the problem.
不过大部分情况下,dpkg错误都会提示让你执行dpkg --configure -a
,执行完之后通常也确实能自动修复一些问题,它能够检查出有哪些地方错了并告诉你
iPhone:/var/mobile/Documents/CyDown root# dpkg --configure -a
Setting up net.85819.ios.otrlocation (6.1.1-2) ...
No matching processes were found
/System/Library/LaunchDaemons/com.apple.AOSNotification.plist: The specified service path was not in the service cache
/Library/LaunchDaemons/com.apple.AOSNotification.plist: No such file or directory
/Library/LaunchDaemons/com.apple.icloud.findmydeviced.plist: No such file or directory
/System/Library/LaunchDaemons/com.apple.icloud.findmydeviced.plist: service already loaded
/System/Library/LaunchDaemons/com.apple.icloud.fmflocatord.plist: service already loaded
---------------------------
Please reboot your device!
---------------------------
Setting up com.exile90.icleanerpro (7.8.0) ...
如控制台返回所示,我在发生问题之前正在安装net.85819.ios.otrlocation
和com.exile90.icleanerpro
两个插件,dpkg将这两个问题插件进行了自动配置后,提示我重启设备。
至此,问题基本解决。
其实没有必要重启,所以我选择重新载入SpringBoard,执行如下命令
killall SpringBoard
紧接着,随着一声清亮的充电提示音发出,菊花圈成功地消除了下去,输入密码界面显示出来。
总结
不管你的设备目前是否发生了问题,请一定要注意在发生问题之前提前做好准备,以便在任何异常发生时可以通过SSH访问手机,执行必要的操作。
安装插件时发生的错误通常会导致SpringBoard无法正常加载,遇到无限菊花圈不要惊慌,通过APT工具来进行插件管理(Cydia本质上就是一个可视化的APT工具)
熟练使用bash命令非常重要,当然如果不行的话还是要确保会用apt-get和dpkg,如果无论什么手段都无法挽回,可以及时将设备中重要数据打包导出,刷机处理。
网友评论