越獄詳解與除錯--逆向開發
今天我們進入逆向開發中另一個部分--越獄知識的講解。如果你對此篇部落格有所期待,說明你很可能已經在iPhone越獄上有所研究啦。閱讀本篇部落格可能花費大家20分鐘-30分鐘,請大家耐心閱讀,會有所收穫!!!
概述
人們對於iPhone手機越獄有很多不同的訴求,有的是因為開發軟體需要開放的平臺,有的控制慾較強需要對iPhone裝置全部控制的需求,有的是需要安裝私人的iPhone應用。
1.1 定義原理
越獄(jailBreak)通過iOS系統的安全啟動鏈的漏洞,禁止掉信任鏈條中的負責驗證的元件,從而拿到iOS系統中的最大許可權Root許可權
當啟動iOS裝置時,系統首先從只讀的ROM中讀取初始化的指令--系統的載入程式,其中引導ROM包括了蘋果官方授權的公鑰,會驗證底層的啟動器LLB的簽名,一旦通過了此次驗證,就會啟動系統。LLB會做一些基礎性的工作,進一步驗證第二級載入程式iBoot。當iBoot啟動之後,裝置就可以進入到了恢復模式或者啟動核心。在iBoot驗證之後核心簽名也合法性之後,整個的啟動程式開始進入到了正規:載入驅動的程式、檢測到裝置、啟動系統來守護程序。其中整個信任鏈會確保所有的系統元件都是由蘋果的官方寫入、分發、簽名,不能夠來自第三方機構。下面是一個過程圖幫助大家理解:
越獄的工作原理就是攻擊這一信任鏈。越獄工具的所有作者都需要找到信任鏈上的漏洞,進一步禁止信任鏈負責驗證的元件,最後拿到系統最大許可權Root許可權來完成越獄。
1.2 分類
越獄分為完美越獄和非完美越獄之分。
- 完美越獄:破解iOS系統漏洞後,系統每次重啟都會自動呼叫注入的惡意程式碼,達到破壞安全信任鏈的驗證,從而拿到Root許可權。
- 非完美越獄:當越獄系統之後,並沒有完全的破解掉安全鏈認證,導致部分資訊和功能的應用不佳。例如關機後必須要越獄軟體來引導開機……這樣越獄就叫做“不完美越獄”
1.3 安裝外掛
最好手機是iPhone 5s對應的系統是iOS 9.0,因為是最穩定的。
OpenSSH與USB連線
2.1 OpenSSH
2.1 概述
通過OpenSSH外掛來連線手機,目的是遠端控制或者傳送檔案。
連線手機使用Wifi連線手機,ssh 使用者名稱@手機的IP地址 例如$ssh [email protected]
預設的密碼是alpine
iOS下有兩個使用者:Root、Mobile
- Root使用者:最高許可權的使用者,可以訪問任何檔案包括Mobile使用者的許可權
- Mobile使用者:普通使用者,只能訪問該使用者目錄下的檔案/var/Mobile
修改賬戶登入密碼
- Root使用者可以修改所有使用者的密碼
- $passwd命令來修改密碼
2.2 OpenSSH與SSH
OpenSSH是SSH(Secure Shee)協議的免費開源的實現。SSH協議可以用來遠端控制或者在計算機之間來傳送檔案。
- SSH是一種網路協議,目的是用於計算機之間的加密登入,由芬蘭學者設計SSH協議,將登入資訊全部加密,成為了網際網路安全的一個基本解決方案,目前成為了Linux的標準配置。
- OpenSSH 是一款軟體,應用也是非常廣泛。
下面是SSH登入過程:
- 中間人攻擊:上面登入過程存在一種隱患,如果有人冒犯伺服器,將生成的虛假公鑰傳送給客戶端,那麼它將獲得客戶端連線伺服器的密碼。
對於SSH其他操作命令如下圖
如果對於SSH許可權操作,每次都要輸入密碼使用者名稱比較麻煩如下圖:
免密碼登入也稱為“公鑰登入”,原理是使用者將自己的公鑰儲存在遠端主機上。登入的時候,遠端主機會向用戶手機發送一段隨機字串,使用者用自己的私鑰加密後,然後再發回來。遠端主機用事先儲存的公鑰進行解密,如果成功了,證明使用者是可信的,直接允許登入,不要再求傳送密碼
檢視是否儲存公鑰私鑰密碼,並刪除原本的密碼,用於公鑰儲存起來
最終檢視結果,完美實現,不需要再次輸入密碼
- cofig檔案配置SSH登入的別名
2.2 USB連線
蘋果有個服務,叫做usbmuxd,這個服務主要用於在USB協議上實現TCP連線。
對於USB連線,有如下命令
對於一些操作,需要將電腦檔案拷貝到手機,通過指令
砸殼+IDA分析
2.1 砸殼
砸殼--軟體脫殼:是對軟體加殼的逆操作,把軟體上的殼去掉(解密)
應用砸殼(加密):提交給AppStore的app,都是經過官方保護而加密的,這樣就可以保證在AppStore裡面下載的應用都是經過蘋果稽核授權的。經過AppStore加密的應用無法通過Hopper等反編譯靜態分析,也沒有辦法Class-dump。逆向開發中需要對加密的二進位制檔案進行解密才可以做靜態分析,這個過程就是砸殼(脫殼)
應用砸殼(解密):
- 靜態砸殼:是在已經都掌握和了解到了殼應用的加密演算法以及邏輯後在不執行殼應用程式的前提下將程式進行解密。靜態砸殼難度是比較大,而且加密發現應用被破解之後可能會更改用更高階和複雜的加密技術。
- 動態砸殼:是從執行在程序記憶體空間中的可執行程式映像image入手,將記憶體中的內容進行轉儲(dump)處理來實現砸殼技術。這種相對簡單點,並且不需要關心使用哪一種加密技術。
2.2 砸殼技術
AppStore的應用使用到了FairPlay DRM數字版權保護加密技術。
FairPlay保護的檔案具有加密容器檔案,其使用AES進行加密,解密所需要的主金鑰也是以加密的方式儲存在容器當中。解密主金鑰所需要的金鑰稱之為“使用者金鑰”。如果當用戶使用iTunes登入新裝置時,裝置緊接著向Apple伺服器請求版權,最後獲得使用者金鑰。在試圖使用檔案時,儲存在檔案當中的主金鑰隨後與使用者金鑰匹配,如果成功了就允許使用,反之不允許使用。
2.2.1 Clutch砸殼--技術方案1
如果我們從AppStore下載的應用在IDA分析之前,需要對ipa進行破殼解密, 使用Clutch, 其原理是在應用執行時把記憶體資料按照一定的格式來匯出,其實質就是去除數字化認證的過程.
步驟1: 下載Clutch
有兩種方式: 1 可執行檔案 2. 工程需要編譯從而獲得可執行檔案
步驟2: 下載PP助手,用越獄的手機連線Mac電腦,開啟工具->檔案管理->系統->usr->bin 將可執行檔案放到bin目錄下
步驟3: 開啟越獄手機的cydia,下載Open SSH,越獄的手機和電腦在同一wifi,得到ip地址為192.168.2.10
步驟4: 開啟終端:
- 輸入ssh root @192.168.2.10,輸入完成之後,輸入密碼,密碼預設都是alpine,如果不是,需要刪除OpenSSH重新來安裝
- 密碼輸入正確之後, cd到可執行檔案放在手機中的位置cd /usr/bin
- 給Clutch加許可權防止許可權不夠chmod a+x Clutch
步驟5: 終端輸入Clutch -d 1, 如果要砸殼其他應用,選擇對應的id, 然後將破解的包匯出來
2.2.2 class-dump+ cycript + dumpdecrypted--技術方案2
步驟1: 下載class-dump
步驟2: 將雙擊下載好的class-dump-3.5.dmg,複製其中的
步驟3: 在Finder選擇前往->前往資料夾->/usr/local/sbin/進入目錄, 將class-dump放進去
步驟4: 給class-dump賦予執行條件sudo chmod 777 /usr/local/sbin/class-dump
步驟5: 下載dumpdecrypted,然後cd到解壓到目錄下, 輸入make,會編譯出dumpdecrypted.o和dumpdecrypted.dylib
步驟6: 用到dumpdecrypted.dylib,開始砸殼,終端用ssh連線越獄手機
步驟7: 檢視當前裝置執行的程序, 連線好之後,終端輸入ps -e
步驟8: 找到要砸殼的應用後, 記錄程序id和應用路徑,終端輸入cycript -p 程序id,等待直到出現cy#後,輸入命令,打出沙盒路徑,如下
步驟9: 儲存好沙盒路和應用路徑(沙盒路徑不是應用路徑,沙盒路徑有Document),將下載好的dumpdecrypted.dylib放到沙盒路徑中
//在終端中輸入下面程式碼,記住scp 後的第一部分是你放在電腦中的dumpdecrypted.dylib的路徑 第二部分是步驟5記錄的應用沙盒地址,請替換成自己的 scp /Users/xieyujia/Desktop/ios/逆向工程/dumpdecrypted-master/dumpdecrypted.dylib [email protected]:/var/mobile/Containers/Data/Application/0EA4E809-E663-4E7B-AB91-2B7CFA2B0AB3/Documents/
步驟10: 將dumpdecrypted.dylib放到沙盒路徑,重新連線ssh,然後cd到砸殼應用路徑
//後面的路徑是應用路徑 而不是沙盒路徑 DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/containers/Bundle/Application/B8416315-EF7E-4464-8F7F-4C1B92CBF1AF/WeChat.app/WeChat
等待執行完之後,可以看到Document下生成了個.decrypted檔案----這是破解後的可執行的檔案.
利用PP助手找到對應的.decrypted檔案,匯出到電腦中.
步驟11: 用class-dump破解裡面程式碼, 輸入
//第一個路徑是.decrypted檔案的路徑,第二個路徑是匯出.h檔案的路徑 class-dump -H /Users/xieyujia/Desktop/ios/逆向工程/WeChat.decrypted -o /Users/xieyujia/Desktop/ios/逆向工程/head
步驟12: 沒有app沒有上傳到appStore就不會被加密, 就不需要砸殼, 可以將.decrypted路徑改為.app路徑
2.3 IDA工具靜態分析
2.3.1 需要下載IDA工具
大家可以去下載破解版本: https://pan.baidu.com/s/1ulQ-svw4n3i2bbV-4Fhyqg#list/path=%2F, 密碼為5sm3
2.3.2 下載完之後,解壓檔案
2.3.3 使用64位版本,點選new,選擇要分析的應用
我們就可以通過上面來檢視原始碼
Theos及Tweak
Theos是越獄開發的一個工具包, 可以建立Tweak專案,動態的hook第三方程式
github位置https://github.com/theos/theos
3.1 Theos
3.1.1 安裝
步驟1: 安裝依賴庫
安裝Theos之前要首先安裝dpkg、fakeroot和ldid三個依賴庫
$ brew install ldid fakeroot $ brew install --from-bottle https://raw.githubusercontent.com/Homebrew/homebrew-core/7a4dabfc1a2acd9f01a1670fde4f0094c4fb6ffa/Formula/dpkg.rb $ brew pin dpkg
步驟2: 在/opt目錄下,clone專案原始碼
git clone --recursive https://github.com/theos/theos.git
步驟3: 下載之後修改theos許可權
sudo chown -R $(id -u):$(id -g) theos
步驟4: 修改環境變數
開啟 ~/.bash_profile檔案,新增兩行程式碼
export THEOS=/opt/theos export PATH=/opt/theos/bin/:$PATH
完成配置後,檢視是否成功
➜ theos git:(master) ✗ echo $THEOS /opt/theos
拓展: 如果安裝過了omyzsh,可能上面配置不成功
加下面一行程式碼
source ~/.bash_profile
3.2 Tweak及工作原理
Cydia Substrate 是越獄後cydia外掛/軟體(指theos開發的tweak)執行的基礎依賴庫. 它提供了軟體執行公開庫,用於動態替換記憶體的程式碼.所以首先要安裝好Cydia Substrate.
Cydia Substrate包括了MobileHooker, MobileLoader以及safe mode部分
1. MobileHooker
MobileHooker 是用來覆蓋並替換系統的方法,也就是前面說的掛鉤(Hooking)
主要有以下兩個函式
void MSHookMessageEx(Class class, SEL selector, IMP replacement, IMP *result); void MSHookFunction(voidfunction,void replacement,void** p_original);
MSHookMessageEx是作用於Objective-C函式
MSHookFunction作用於C和C++函式
2. MobileLoader
MobileLoader是將Tweak外掛注入到第三方的應用程式中
啟動的時候,MobileLoader根據/Library/MobileSubstrate/DynamicLibraries/目錄下的plist檔案所指定的範圍內,有範圍通過dlopen函式載入同名的dylib
.plist檔案的作用也就是指定tweak外掛的作用物件
3. safe mode
- 在appStore下載的程式參差不齊,tweak的本質在於dylib, 寄生在別人程式的程序裡面
- Cydia Substrate 引入了safe mode(安全模式) 在安全模式下所有的第三方dylib(基於Cydia Substrate的)都會遭到禁用, 這樣就會有利於查詢錯誤,進行修復
逆向攻防除錯
4.1 Reveal
Reveal是一個特別強大的UI分析工具, 通過它可以很直觀的檢視app頁面的UI佈局.
安裝Reveal: http://revealapp.com、
除錯過程
步驟1: 開啟軟體Reveal, 找libReveal.dylib以及Reveal.framework
步驟2: 執行copy Reveal.framework到越獄手機上
scp -r /Users/apple/Desktop/Reveal.framework [email protected]:/System/Library/Frameworks
步驟3: 執行copy libReveal.dylib到越獄的手機上
scp -r /Users/apple/Desktop/libReveal.plist [email protected]:/Library/MobileSubstrate/DynamicLibraries/
步驟4: 本地建立libReveal.plist,編輯檔案
copy libReveal.plist檔案到越獄手機中
scp -r /Users/apple/Desktop/libReveal.plist [email protected]:/Library/MobileSubstrate/DynamicLibraries/
步驟5: 重新啟動手機,開啟jianshu app
通過此軟體怎麼找到app裡面的Bundle identifier呢?
步驟1: 連線越獄手機後,開啟終端:輸入
cd /private/var/mobile/Containers/Bundle/Application
步驟2: 檢視所有app的資原始檔: ls
步驟3: 右建應用程式,顯示包內容,找到可執行檔案
步驟4: 查詢資原始檔名
find . -name 'Hugo*'
找到名為紅色內容
步驟5: 進入IFile(Cydia裡面有)
紅色內容即為要找的東西.
4.2 DebugServer
4.2.1 debugSever
debugSever執行在iOS程式中,預設是位於Developer/usr/bin目錄下
debugSever給app瘦身
lipo -thin arm64(這裡對應你的iOS裝置的結構) (未經處理的debugServer的路徑) -output (新的debugserver的儲存路徑)
首先會根據你自己的iOS裝置確定手機對應的ARM 5s以上的手機都是arm64
4.2.2 debugSever使用
啟動程序,開啟port埠
debugserver backend ip:port /path/to/excutable
附加程序
debugserver ip:port -a "processname"
4.3 LLDB手動砸殼
步驟1: 開啟debugSever,並且依附到微信App程序,port = 12346
步驟2: Mac電腦對映本地port12346到手機12346
步驟3: Mac電腦進入LLDB狀態下, 通過debugSever
process connect connect://127.0.0.1:12346
步驟4: 然後去找到MachO收地址,通過image list
步驟5: 利用otool -l來工具檢視MachO檔案
從上面可以看出,MachO檔案是加密的(cryptid = 1), 從cryptoff開始加密,大小為cryptsize
步驟6: 利用memory read讀出加密
Memory read —force —outfile ./decrypted.bin —binary —count xxx 記憶體地址
步驟7: 記憶體中的dump出來的檔案進行寫入原先加密的MachO檔案上
步驟8: 將cryptid = 1改為0
步驟9: 驗證利用Classdump是否砸殼成功,如下圖,成功砸殼
總結
今天講述的內容非常多,都是關於越獄的知識講解,以及用到的外掛,希望大家認真的看此篇文章,相信會被大家理解iOS底層有一個全新的認識,謝謝大家!!!&n