今天我們進入逆向開發中另一個部分--越獄知識的講解。如果你對此篇博客有所期待,說明你很可能已經在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 root@192.168.21.133
默認的密碼是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 root@192.168.2.10:/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 root@192.168.2.2:/System/Library/Frameworks
步驟3: 執行copy libReveal.dylib到越獄的手機上
scp -r /Users/apple/Desktop/libReveal.plist root@192.168.2.2:/Library/MobileSubstrate/DynamicLibraries/
步驟4: 本地創建libReveal.plist,編輯文件
copy libReveal.plist文件到越獄手機中
scp -r /Users/apple/Desktop/libReveal.plist root@192.168.2.2:/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底層有一個全新的認識,謝謝大家!!!