美文网首页
iPhone变砖-记录一次无限菊花圈的不刷机抢救过程

iPhone变砖-记录一次无限菊花圈的不刷机抢救过程

作者: Torrekie | 来源:发表于2020-05-16 06:41 被阅读0次

    起因

    使用越狱机有七年多了,中间也换过几次手机,每次拿到新的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就会在后台启动。

    解压ipa看到Payload目录
    控制dropbear的配置文件
    使用plist编辑器(本人在用macOS所以直接用Xcode做示范了)打开,有一个ProgramArguments数组,展开后有5项,第五项就是对应ssh被打开后的端口设置

    此处把127.0.0.1:22更改为22,保存

    dropbear.plist
    接下来的步骤就是打包了,因为我在使用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.otrlocationcom.exile90.icleanerpro两个插件,dpkg将这两个问题插件进行了自动配置后,提示我重启设备。

    至此,问题基本解决。
    其实没有必要重启,所以我选择重新载入SpringBoard,执行如下命令

    killall SpringBoard
    

    紧接着,随着一声清亮的充电提示音发出,菊花圈成功地消除了下去,输入密码界面显示出来。


    总结

    不管你的设备目前是否发生了问题,请一定要注意在发生问题之前提前做好准备,以便在任何异常发生时可以通过SSH访问手机,执行必要的操作。
    安装插件时发生的错误通常会导致SpringBoard无法正常加载,遇到无限菊花圈不要惊慌,通过APT工具来进行插件管理(Cydia本质上就是一个可视化的APT工具)
    熟练使用bash命令非常重要,当然如果不行的话还是要确保会用apt-get和dpkg,如果无论什么手段都无法挽回,可以及时将设备中重要数据打包导出,刷机处理。

    相关文章

      网友评论

          本文标题:iPhone变砖-记录一次无限菊花圈的不刷机抢救过程

          本文链接:https://www.haomeiwen.com/subject/tdokohtx.html