iOS8越獄後Cydia無法安裝插件 附修復方法

  今天遇到一臺iOS8越獄的機器,Cydia 無法安裝任何插件,仔細詢問原來是因為剛越獄完成後在沒有運行Cydia搬移系統文件的情況下執行瞭“還原並抹除”導致越獄環境的 APT 安裝管理環境出現問題導致,按常理其實重新覆蓋越獄即可,但8系的設備在越獄後是不可以再次越獄的,隻能使用非常規的辦法來解決瞭!

8745632-3.jpg

  設備處理的關鍵點:有afc2服務,能看到root根目錄

  問題處理的難點:首先,設備沒有安裝OPENSSH服務導致無法修改直接放入文件的權限導致直接將缺失的文件放入後無法運行,使用Cydia的Autoinstall的方式安裝同樣和在Cydia內直接安裝deb因為apt的環境問題導致無法安裝的情況,想通過iFile來修改文件的權限卻也沒有安裝iFile,所以幾條路都被堵死,隻能另辟蹊徑!!!



  問題的原因及部分系統原理


  1,文件權限:

  在AFC2服務啟動時,第三方資源管理器是可以看到設備的root根目錄,但是如果是將電腦裡地文件“添加”進設備的,此文件默認的權限為:wheel:root-0644,也就是root用戶的wheel組,運行的權限是當前用戶可讀寫,組權限隻讀,但是都沒有“執行(運行)”的權限,所以直接丟進去的可執行文件(包括權限需求高的文件)是無法執行和打開的

  但是,afc2add 有一個特性就是可以“繼承”權限,也就是說,如果原來設備裡面的文件時什麼權限,那麼你從電腦裡面放入相同的文件去覆蓋它時,原有的權限不變!不一定會是新加的默認 wheel:root-0644 權限

  2,ZIP,TAR 壓縮文件的特性,zip 文件是一種壓縮文件的格式,我們在安裝iFile的時候會附帶安裝處理 zip 的依賴(有些有深度潔癖的人會很不高興認為是垃圾,其實不是開機調用常駐內存的依賴隻是以文件的形式放置於系統內,在需要它是直接調用才會打開的);而 tar 壓縮文件的支持在越獄時就已經預置瞭的,而且deb的安裝包實際上用7-zip打開會發現其實就是tar文件+包安裝信息,它們有個共同點就是在iOS系統內解壓時不會改變壓縮時的原始權限!

  3,iOS的啟動調用

  iOS系統在開機時通常會調用 /Library/LaunchDaemons (不常用的 /Library/LaunchAgents);/System/Library/LaunchDaemons (這裡一般是放的系統服務);如果安裝瞭 Cydia Substrate ,那麼啟動時也會通過plist定義和調用調用加載 /Library/MobileSubstrate/DynamicLibraries 裡面的 dylib 程序

  以上可以看出影響設備啟動的主要是這3個目錄,前2(3)者屬於系統級的開機調用,而Cydia Substrate 的隻有在安裝 Cydia Substrate 的環境後才能生效,且在開機時按住“音量+”鍵可以全部跳過基於它的插件調用,但是系統級的調用是無法跳過的!所以開機白蘋果如果是基於CS環境的插件問題可以按住“音量+”跳過,但是如果是系統級開機調用的程序出現問題卡死的就麻煩瞭!

  4,Cydia 開機自動安裝插件以及DEB安裝的常識

  Cydia安裝後,在 /Library/LaunchDaemons 內防止瞭一個開機調用腳本的plist文件:com.saurik.Cydia.Startup.plist,控制瞭系統在啟動時會運行/bin下的 bash 執行程序和 /usr/libexec/cydia 下的 startup (這個startup實際上是一個賦予瞭可執行權限的 shell 腳本文件)

  內容如下:

  #!/bin/bash

  export PATH=$PATH:/usr/sbin:/usr/bin:/sbin:/bin

  if [[ ! -e /var/lib/cydia/firmware.ver ]]; then

  cache=

  fi

  /usr/libexec/cydia/firmware.sh

  debs=(/var/root/Media/Cydia/AutoInstall/*.deb)

  if [[ ${#debs[@]} -ne 0 && -f ${debs[0]} ]]; then

  dpkg -i "${debs[@]}" 2>/tmp/dpkg.log 1>&2

  rm -f "${debs[@]}"

  cache=

  killall -9 Lowtide AppleTV

  fi

  if [[ ${cache+@} ]]; then

  sbdidlaunch

  su -c uicache mobile

  fi

  iOS8越獄

  debs=(/var/root/Media/Cydia/AutoInstall/*.deb)

  if [[ ${#debs[@]} -ne 0 && -f ${debs[0]} ]]; then

  dpkg -i "${debs[@]}" 2>/tmp/dpkg.log 1>&2

  rm -f "${debs[@]}"

  這段就是指定瞭在開機時檢查 /var/root/Media/Cydia/AutoInstall 目錄下是否有的包文件,如果有救執行 dpkg -i 的安裝命令,而deb的安裝則依賴於dpkg的環境

  5,還原抹除

  iOS的還原並抹除 主要是刪除 /var 目錄下的不是在iOS原生系統白名單以外的全部文件(包括文件夾),

  為什麼說越獄後的機器不要還原抹除的主要原因就是越獄後在第一次運行Cydia 時,Cydia為瞭擴大系統區的可用空間,會將一部分的系統文件搬移到

  /var/stash (其實在Cydia新版,這個目錄也是一個硬鏈接,stash 真正的目錄其實是在 /private/var/db/stash  )那麼在抹除時會將 /private/var/db/stash 文件夾刪除導致系統文件缺失而白蘋果

  但是我今天遇到的和有些人的疑問一樣,那就是我沒有運行過Cydia抹除可以吧,其實也是不行的(至少在沒處理之前是不能直接抹除的),因為初始越獄後預置的基礎性德 apt 的程序包安裝管理會使用 /var/lib 目錄以及此目錄裡面的目錄,這個目錄裡面也放置的全部安裝的程序包插件包的安裝卸載信息,且目錄的權限都具有可執行的權限,如果抹除時會將此文件夾刪除,在次文件夾刪除後 Cydia 在安裝程序時會調用apt來安裝管理下載的deb程序包,此時因為沒有 /var/lib 目錄來存放安裝信息導致安裝失敗,而直接通過利用 afc2 服務的第三方助手工具創建或導入的目錄又會因為權限的問題無法寫入信息文件一樣會失敗!

問題處理的思路


  一般來講如果安裝瞭OPENSSH服務且能夠啟動的情況下,基本問題都能夠處理好(可以執行終端命令,修改權限等等),而如果有iFile也可以解決部分問題,但是如果都沒有就非常麻煩瞭,等於自己把自己的退路斷瞭!

  今天遇到的就是既沒有openssh服務,也沒有安裝 iFile ;那麼該怎麼辦呢?其實我上面寫的原理就是需要利用的原理!

  首先這個問題主要是修復越獄預置的apt環境,那麼就需要越獄程序在越獄時上傳使用的 Cydia.tar 文件,需要用它將完整的文件解壓恢復到iOS系統裡面

  tar的文件需要解壓的環境支持不要緊,因為基本的tar執行程序還在,隻不過怎樣去讓系統執行解壓命令來解壓上傳的tar文件呢?

  那麼我們就需要使用 shell 腳本來調用命令,但是這個shell腳本怎麼去調用呢?其實可以利用/Library/LaunchDaemons 等開機啟動文件夾的plist文件去調用.

  但是如果是自己直接寫的調用shell腳本在傳入設備後會因為權限問題根本無法運行,怎麼辦?上面說過關於afc2add服務的權限繼承特性!我們可以利用它!

  怎麼利用呢?其實很簡單,上面我就提到過Cydia就會在啟動時利用/Library/LaunchDaemons 裡面的 com.saurik.Cydia.Startup.plist 文件去調用 /usr/libexec/cydia 目錄下的 startup 這個shell 腳本,我們可以直接將 startup 文件導出放到本地然後修改這個腳本,將需要的命令添加進去後重新導入覆蓋原來的文件即可保持繼承的權限從而達到可以執行的目的瞭!

處理流程:


  1,找到越獄系統使用的支持本iOS版本的完整 Cydia.tar 壓縮包(在源裡面的 Cydia安裝包僅是Cydia,不含完整的越獄環境目錄結構),因為此壓縮包為整個系統目錄結構,那麼在解壓時一般就是接觸的根目錄,所以我將 Cydia.tar 使用助手工具將其導入放置到root根目錄備用.

  2,將 /usr/libexec/cydia 目錄下的 startup 文件導出,在備份一個原始的文件後(不管幹什麼最好備份一個以防萬一)使用適合的編輯器修改文件,在

  #!/bin/bash

  export PATH=$PATH:/usr/sbin:/usr/bin:/sbin:/bin

  下面添加一行命令代碼:

  tar -xvf ./Cydia.tar

  (這個就是最常用最簡單的一個解壓的終端命令)

  原文件第一行是shell文件的類型註釋,第二行代碼是環境定義,所以必須添加到它們下面

  (關於修改使用的編輯器需要特別註意就是必須要保證編輯和保存後的文件格式編碼不能變,否則亂碼不能執行,建議使用UE或者winhex 等)

  3,將修改好的 startup 文件導入原始位置,提示覆蓋時選擇“是”去覆蓋來保持繼承權限

  4,重啟設備

  5,系統重啟後悔自動解壓剛上傳的 Cydia.tar 來重建結構,完成後apt環境即可修復,可以在Cydia裡面直接安裝插件瞭!

  6,將備份的原始 startup 文件導入覆蓋還原(其實我這次的修復不用還原,因為在解壓 Cydia.tar 時就已經還原為標準的文件瞭,哈哈)

  7,刪除根目錄的已經完成光榮使命的 Cydia.tar 壓縮包文件清掃戰場。

  更多地引申意義

  以上是整個處理過程的原理和流程,其實這個方法可以利用來解決很多的問題,比如可以在安裝iFile時無法安裝依賴時使用7-zip 將iFile的deb安裝包的data.tar文件提取後按上面的辦法來安裝(隻不過如果依賴沒有,那麼iFile在處理文件需要調用依賴程序時會失敗,如如果沒有安裝依賴的zip,使用iFile解壓zip文件時肯定會出錯),

  希望大傢在看這篇教程時能夠用腦去看,搞清楚原理,合理利用並更多地引申到其他的問題的處理,這樣就會達到事半功倍的效果!

  本文轉自CDSQ

Comments are closed.