參考:https://xiaozhuanlan.com/topic/7193845260
從越獄嘀略、提取iPA檔敲殼到UI分析注入及反編譯的探索過程
關(guān)于安全
之前唯一做過跟安全有關(guān)的就只有 使用中間人攻擊嗅探傳輸資料洼哎;假設(shè)我們在資料傳輸前編碼加密埋合、接受時 APP 內(nèi)解密取募,用以防止中間人嗅探伦仍;那還有可能被偷走資料嗎颂碧?
答案是肯定的窟却!剖笙,就算沒真的試驗(yàn)過软驰;世界上沒有破不了的系統(tǒng)涧窒,只有時間成本的問題,當(dāng)破解耗費(fèi)的時間精力大于破解成果锭亏,那就可以稱為是安全的纠吴!
How?
都做到這樣了,那還能怎么破慧瘤?就是本篇想記錄的議題 — 「逆向工程 」戴已,敲開你的 APP 研究你是怎么做加解密的;其實(shí)一直以來對這個領(lǐng)域都是懵懵懂懂锅减,只在 iPlayground 2019 上聽過兩堂大大的分享糖儡,大概知道原理還有怎么實(shí)現(xiàn),最近剛好有機(jī)會玩了一下跟大家分享怔匣!
逆了向握联,能干嘛?
查看 APP UI 排版方式每瞒、結(jié)構(gòu)
獲取 APP 資源目錄 .assets/.plist/icon…
竄改 APP 功能重新打包 (EX: 去廣告)
反編譯推測原始程式碼內(nèi)容取得商業(yè)邏輯資訊
dump 出 .h 標(biāo)頭檔 / keycahin 內(nèi)容
實(shí)現(xiàn)環(huán)境
macOS 版本:10.15.3 Catalina
iOS 版本:iPhone 6 (iOS 12.4.4 / 已越獄) *必要
Cydia: Open SSH
越獄的部分
任何版本的 iOS金闽、iPhone 都可以,只要是能越獄的設(shè)備独泞,建議使用舊的手機(jī)或是開發(fā)機(jī)呐矾,以避免不必要的風(fēng)險;可根據(jù)自己的手機(jī)懦砂、iOS 版本參考瘋先生越獄教學(xué)蜒犯,必要時需要將 iOS 降版(認(rèn)證狀態(tài)查詢)再越獄。
我是拿之前的舊手機(jī) iPhone 6 來測試荞膘,原本已經(jīng)升到 iOS 12.4.5 了罚随,但發(fā)現(xiàn) 12.4.5 一直越獄不成功,所幸先降回 12.4.4 然后使用 checkra1n 越獄就成功了羽资!
步驟不多淘菩,也不難;只是需要時間等待!
附上一個自己犯蠢的經(jīng)驗(yàn):下載完舊版 IPSW 檔案后潮改,手機(jī)接上 Mac 狭郑,直接使用 Finder 檔案瀏覽器(macOS 10.5 后就沒有 iTunes 了),在左方 Locations 選擇手機(jī)汇在,出現(xiàn)手機(jī)資訊畫面后翰萨,「Option」按著然后再點(diǎn)「Restore iPhone」就能跳出 IPSW 檔案選擇視窗,選擇剛下載下來的舊版 IPSW 檔案就能完成刷機(jī)降版糕殉。
我本來傻傻的直接按 Restore iPhone…只會浪費(fèi)時間重刷一次最新版而已….
使用 lookin 工具查看別人的 APP UI 排版
我們先來點(diǎn)有趣的前菜亩鬼,使用工具搭配越獄手機(jī)查看別人APP 是怎么排版。
查看工具: 一是 老牌 Reveal (功能更完整阿蝶,需付費(fèi)約 $60 美金/可試用)雳锋,二是騰訊 QMUI Team 制作的 lookin 免費(fèi)開源工具;這邊使用 lookin 作為示范羡洁,Reveal 大同小異玷过。
若沒有越獄手機(jī)也沒關(guān)系,此工具主要是讓你用在開發(fā)中的專案上筑煮,查看 Debug 排版(取代 Xcode 陽春的 inspector)平常開發(fā)也能用到冶匹! 唯有要看別人的 APP 需要使用越獄手機(jī)。
如果要看自己的專案…
可以選擇使用 CocoaPods 安裝咆瘟、斷點(diǎn)插入(僅支援模擬器)、手動導(dǎo)入Framework 到專案诽里、手動設(shè)置袒餐,四種方法。
將專案 Build + Run 起來之后谤狡,就能在 Lookin 工具上選擇 APP 畫面 -> 查看排版結(jié)構(gòu)灸眼。
如果要看別人的APP…
Step 1. 在越獄手機(jī)上打開「Cydia」-> 搜尋「LookinLoader」->「安裝」-> 回到手機(jī)「設(shè)定」->「Lookin」->「Enabled Applications」-> 啟用想要查看的 APP 。
Step 2. 使用傳輸線將手機(jī)連接至 Mac 電腦 -> 打開想要查看的APP -> 回到電腦墓懂,在 Lookin 工具上選擇 APP 畫面 -> ****即可****查看排版結(jié)構(gòu)**焰宣。
Lookin 查看排版結(jié)構(gòu)
可在左側(cè)欄檢視 View Hierarchy、右側(cè)欄對選中的物件進(jìn)行動態(tài)修改捕仔。
對物件的修改也會實(shí)時的顯示在手機(jī) APP 上匕积,如上圖。
就如同網(wǎng)頁的「F12」開發(fā)者工具榜跌,所有的修改僅對 View 有效闪唆,不會影響實(shí)際的資料;主要是拿來 Debug 钓葫,當(dāng)然也可以用來改值悄蕾、截圖,然后騙朋友 XD
使用 Reveal 工具查看 APP UI 排版結(jié)構(gòu)
雖然 Reveal 需要付費(fèi)才能使用础浮,但個人還是比較喜歡 Reveal帆调;在結(jié)構(gòu)顯示上資訊更詳細(xì)奠骄、右方資訊欄位幾乎等同于 XCode 開發(fā)環(huán)境,想做什么即時調(diào)整都可以番刊,另外也會提示 Constraint Error 對于 UI 排版修正非常有幫助含鳞!
這兩個工具在日常開發(fā)自己的 APP 上都非常有幫助!
*了解完流程環(huán)境及有趣的部分之后撵枢,就讓我們進(jìn)入正題吧民晒!
**以下開始都需要越獄手機(jī)配合
提取 APP .ipa 檔案 & 砸殼
所有從 App Store 安裝的 APP,其中的 .ipa 檔案都有 FairPlay DRM 保護(hù) 锄禽,俗稱加殼保護(hù)/相反的去掉保護(hù)就叫「砸殼」潜必,所以單純從 App Stroe 提取 .ipa 是沒有意義的,也用不了沃但。
*另一個工具 APP Configurator 2 只能提取有保護(hù)的檔案磁滚,沒意義就不再贅述,有興趣使用此工具的朋友可以點(diǎn)此查看教學(xué)宵晚。
使用工具+越獄手機(jī)提取砸殼之后的原始 .ipa 檔案:
關(guān)于工具部分起初我使用的是 Clutch 垂攘,但怎么嘗試都出現(xiàn) FAILED 查了下專案 issue,發(fā)現(xiàn)有很多人有同樣狀況淤刃,貌似此工具已經(jīng)不能在 iOS ≥ 12 使用了晒他、另外還有一個老牌工具 dumpdecrypted ,但我沒有研究逸贾。
這邊使用 frida-ios-dump 這個 Python 工具進(jìn)行動態(tài)砸殼陨仅,使用起來非常方便!
首先我們先準(zhǔn)備 Mac 上的環(huán)境:
Mac 本身自帶 Python 2.7 版本铝侵,此工具支援 Python 2.X/3.X灼伤,所以不用在特別安裝 Python;但我是使用 Python 3.X 進(jìn)行操作的咪鲜,如果有遇到 Python 2.X 的問題狐赡,不妨嘗試安裝使用 Python 3 吧!
安裝 pip( Python 的套件源管理器)
使用 pip 安裝 frida:
sudo pip install frida -upgrade -ignore-installed six (python 2.X)
sudo pip3 install frida -upgrade -ignore-installed six (python 3.X)在 Terminal 輸入 frida-ps 如果沒錯誤訊息代表安裝成功疟丙!
Clone AloneMonkey/frida-ios-dump 這個專案
進(jìn)入專案颖侄,用文字編輯器打開 dump.py 檔案
確認(rèn) SSH 連線設(shè)定部分是否正確 (預(yù)設(shè)不用特別動)
User = ‘root’
Password = ‘a(chǎn)lpine’
Host = ‘localhost’
Port = 2222
越獄手機(jī)上的環(huán)境:
安裝 Open SSH :Cydia → 搜尋 → Open SSH →安裝
安裝 Frida 源:Cydia → 來源 → 右上角「編輯」 → 左上角「加入」 → https://build.frida.re
安裝 Frida:Cydia → 搜尋 → Frida → 依照手機(jī)處理器版本安裝對應(yīng)的工具(EX: 我是 iPhone 6 A11,所以是裝 Frida for pre-A12 devices 這個工具)
環(huán)境都弄好之后享郊,開工:
1.將手機(jī)使用 USB 連接到電腦
2.在 Mac 上打開一個 Terminal 輸入 iproxy 2222 22 发皿,啟動 Server。
3.確保手機(jī)/電腦處于相同網(wǎng)路環(huán)境中(EX: 連同個WiFi)
4.再打開一個 Terminal 輸入 ssh root@127.0.0.1拂蝎,輸入 SSH 密碼(預(yù)設(shè)是 alpine)
5.再打開一個 Terminal 進(jìn)行敲殼命令操作穴墅,cd 到 clone 下來的 /frida-ios-dump 目錄下。
輸入 dump.py -l 列出手機(jī)中已安裝/正在執(zhí)行的 APP。
- 找到要敲殼導(dǎo)出的 APP 名稱 / Bundle ID玄货,輸入:
dump.py APP名稱或BundleID -o 輸出結(jié)果的路徑/輸出檔名.ipa
這邊務(wù)必指定輸出結(jié)果的路徑/檔名皇钞,因?yàn)轭A(yù)設(shè)輸出路徑會在 /opt/dump/frida-ios-dump/ 這邊不想把它搬到 /opt/dump 中,所以要指定輸出路徑避免權(quán)限錯誤松捉。
-
輸出成功后就能取得已敲殼的 .ipa 檔案夹界!
image
手機(jī)必須在解鎖情況下才能使用工具
若出現(xiàn)連線錯誤、reset by peer…等原因隘世,可嘗試拔掉重插 USB 連接可柿、重開 iproxy。
7.將 .ipa 檔直接重新命名成 .zip 檔丙者,然后直接右鍵解壓縮檔
會出現(xiàn) /Payload/APP名稱.app
有了原始 APP 檔后我們可以…
1. 提取 APP 的資源目錄
在 APP名稱.app 右鍵 → 「Show Package Contents」就能看到 APP 的資源目錄
2. class-dump 出 APP .h頭文件訊息
使用 class-dump 工具導(dǎo)出全 APP (包含 Framework) .h 頭文件訊息 (僅限 Objective-C复斥,若專案為 Swift 則無效)
nygard/class-dump* 大大的工具我嘗試失敗,一直 failed械媒;最后還是一樣使用 AloneMonkey/MonkeyDev 大大的工具集中改寫過的 class-dump 工具才成功目锭。*
直接從這里 Download MonkeyDev/bin/class-dump 工具
打開 Terminal 直接使用:
./class-dump -H APP路徑/APP名稱.app -o 匯出的目標(biāo)路徑
dump 成功之后就能獲取到整個 APP 的 .h 資訊。
4. 最后也是最困難的 — 進(jìn)行反編譯
可以使用 IDA 和 Hopper 反編譯工具進(jìn)行分析使用纷捞,兩款都是收費(fèi)工具痢虹, Hopper 可免費(fèi)試用(每次 30 分鐘)
我們將取得的 APP名稱.app 檔案直接拉到 Hopper 即可開始進(jìn)行分析。
不過我也就止步于此了主儡,因?yàn)閺倪@開始就要研究機(jī)器碼奖唯、搭配 class-dump 結(jié)果推測方法…等等;需要非常深入的功力才行糜值!
突破反編譯后臭埋,可以自行竄改運(yùn)作重新打包成新的 APP。
逆向工程的其他工具
1.使用 MITM Proxy 免費(fèi)工具嗅探 API 網(wǎng)路請求資訊
2.Cycript (搭配越獄手機(jī)) 動態(tài)分析/注入工具:
在越獄手機(jī)上打開「Cydia」-> 搜尋「Cycript」->「安裝」
在電腦打開一個 Terminal 使用 Open SSH 連線至手機(jī)臀玄,ssh root@手機(jī)IP (預(yù)設(shè)是 alpine)
打開目標(biāo) APP (APP 保持在前景)
在 Terminal 輸入 ps -e | grep **APP Bundle ID **查找正在運(yùn)行的 APP Process ID
使用 cycript -p Process ID 注入工具到正在運(yùn)行的 APP
可使用 Objective-c/Javascript 進(jìn)行調(diào)試控制。
For Example:
**cy#** alert = [[UIAlertView alloc] initWithTitle:@"HIHI" message:@"ZhgChg.li" delegate:nil cancelButtonTitle:@"Cancel" otherButtonTitles:nl]
**cy#** [alert show]
chose(): 獲取目標(biāo)
UIApp.keyWindow.recursiveDescription().toString(): 顯示 view hierarchy 結(jié)構(gòu)資訊
**new Instance(記憶體位置): **獲取物件
exit(0): 結(jié)束
詳細(xì)操作可參考此篇文章畅蹂。
前面介紹過健无,再推一次;在自己的專案日常開發(fā)上也非常好用液斜,建議購買使用 Reveal累贤。
4. MonkeyDev 集成工具,可透過動態(tài)注入竄改 APP 并重新打包成新的 APP
5.ptoomey3/Keychain-Dumper少漆,導(dǎo)出 KeyChain 內(nèi)容
詳細(xì)操作請參考此篇文章臼膏,不過我沒試成功,看專案 issue 貌似也是在 iOS ≥ 12 之后就失效了示损。
總結(jié)
這個領(lǐng)域是個超級大坑渗磅,需要非常多的技術(shù)知識基礎(chǔ)才有可能精通;本篇文章只是粗淺了「體驗(yàn)」了一下逆向工程是什么感覺,如有不足敬請見諒始鱼!僅供學(xué)術(shù)研究仔掸,勿做壞壞的事;個人覺得整個流程工具玩下來蠻有趣的医清,也對 APP 安全更有點(diǎn)概念起暮!