第一部分 概念篇
第1章 iOS逆向工程簡(jiǎn)介
軟件逆向工程涯竟,指的是通過(guò)分析一個(gè)程序或系統(tǒng)的功能啸澡、結(jié)構(gòu)或行為飞崖,將它的技術(shù)實(shí)現(xiàn)或細(xì)節(jié)推導(dǎo)出來(lái)的過(guò)程丹弱。
1.1 iOS逆向工程的要求
最好能非常熟悉iOS的硬件構(gòu)成德撬、iOS系統(tǒng)的運(yùn)行原理,還要具備豐富的iOS開(kāi)發(fā)經(jīng)驗(yàn)躲胳。(充分非必要條件)但有兩個(gè)必要條件強(qiáng)烈的好奇心和鍥而不舍的精神蜓洪。
1.2 iOS應(yīng)用逆向工程的作用
基于iOS逆向工程技術(shù),可以在不破壞城墻的前提下坯苹,選擇任意高緯度地點(diǎn)進(jìn)入低緯度城堡隆檀,巧取而不強(qiáng)奪,通過(guò)監(jiān)視甚至改變App的運(yùn)行邏輯,從而達(dá)到獲取核心信息恐仑,了解軟件原理等戰(zhàn)術(shù)目的泉坐。
1.2.1 安全相關(guān)的iOS逆向工程
1.評(píng)定安全等級(jí)
2.逆向惡意軟件
3.檢查軟件后門(mén)
4.取出軟件使用限制
1.2.2開(kāi)發(fā)相關(guān)的iOS逆向工程
1.逆向系統(tǒng)API
2.借鑒別的軟件
1.3 iOS應(yīng)用逆向工程的過(guò)程
一般來(lái)說(shuō),軟件逆向工程可以看做 系統(tǒng)分析 和 代碼分析 兩個(gè)階段的有機(jī)結(jié)合裳仆。
在系統(tǒng)分析階段腕让,應(yīng)在不同的條件下運(yùn)行目標(biāo)程序,在程序中改進(jìn)型各種各樣的操作歧斟,觀察程序的行為特征纯丸,同時(shí)尋找我們感興趣的功能點(diǎn)。還可以瀏覽文件系統(tǒng)静袖,觀察程序顯示的圖片觉鼻、程序的配置文件存放的位置,數(shù)據(jù)庫(kù)文件中存放了哪些信息队橙,有沒(méi)有加密等特征滑凉。
完成了系統(tǒng)分析之后,就該對(duì)App的二進(jìn)制文件進(jìn)行代碼分析了喘帚。通過(guò)逆向工程可以推倒出這個(gè)App的設(shè)計(jì)思路、內(nèi)部算法和實(shí)現(xiàn)細(xì)節(jié)咒钟,但這是一個(gè)非常復(fù)雜的過(guò)程吹由。(難點(diǎn))
1.4 iOS 應(yīng)用逆向工程的工具
四大類(lèi):監(jiān)測(cè)工具、反匯編工具(disassembler)朱嘴、調(diào)試工具(debugger)倾鲫,以及開(kāi)發(fā)工具
1.4.1 監(jiān)測(cè)工具
起到嗅探、監(jiān)測(cè)萍嬉、記錄目標(biāo)程序行為的工具統(tǒng)稱(chēng)為監(jiān)測(cè)工具乌昔,這些工具通常可以記錄并顯示目標(biāo)程序的某些操作壤追,如UI變化磕道、網(wǎng)絡(luò)活動(dòng)、文件訪問(wèn)等行冰。常用工具有Reveal溺蕉、snoop-it、introspy
1.4.2 反匯編工具
IDA 逆向工程中最常用的利器之一
Hopper
把二進(jìn)制文件反匯編之后悼做,就要閱讀成成的匯編代碼了疯特,這是iOS逆向工程中最具挑戰(zhàn),也是最有意思的部分肛走。
1.4.3 調(diào)試工具 Xcode LLDB
1.4.4 開(kāi)發(fā)工具
越獄iOS 基于Xcode iOSOpenDev
偏命令行的 Theos
2.1 iOS 系統(tǒng)結(jié)構(gòu)
Cydia 的 iFile 可以獲取到文件管理
還可以在AFC2服務(wù)的幫助下漓雅,通過(guò)iFunBox 等PC端軟件訪問(wèn)iOS權(quán)系統(tǒng)文件
因?yàn)橐阈械膶?duì)象來(lái)自于iOS,所有能夠訪問(wèn)iOS全系統(tǒng)文件是開(kāi)展iOS逆向工程的首要前提。
2.1.1 iOS 目錄結(jié)構(gòu)簡(jiǎn)介
Filesystem Hierarchy Standard (FHS) 和 hier(7)為iOS目錄結(jié)構(gòu)的設(shè)計(jì)標(biāo)準(zhǔn)
./: 根目錄
./bin: binary 的簡(jiǎn)寫(xiě)邻吞,存放提供用戶(hù)級(jí)基礎(chǔ)功能的二進(jìn)制文件组题,如ls、ps等
./boot: 存放能使系統(tǒng)成功啟動(dòng)的所有文件吃衅。iOS中此目錄為空往踢。
./dev device 的簡(jiǎn)寫(xiě),存放BSD設(shè)備文件徘层。每個(gè)文件代表系統(tǒng)的一個(gè)塊設(shè)備或字
符設(shè)備峻呕,一般來(lái)說(shuō),塊設(shè)備 以塊為單位傳輸數(shù)據(jù)趣效,如硬盤(pán)瘦癌;而字符設(shè)備 以字符為單位傳輸數(shù)據(jù),如調(diào)制解調(diào)器跷敬。
./sbin: system binaries 的簡(jiǎn)寫(xiě)讯私,存放提供系統(tǒng)級(jí)基礎(chǔ)功能的二進(jìn)制文件,如netstat西傀、reboot等
./etc: Et Cetera 的簡(jiǎn)寫(xiě)斤寇,存放系統(tǒng)腳本及配置文件,如passwd拥褂、hosts等娘锁。在iOS中,/etc是一個(gè)符號(hào)鏈接饺鹃,實(shí)際指向/private/etc.
./lib: 存放系統(tǒng)庫(kù)文件莫秆、內(nèi)核模塊及設(shè)備驅(qū)動(dòng)等。iOS此陌路為空悔详。
./mnt: mount 的簡(jiǎn)寫(xiě)镊屎,存放臨時(shí)的文件系統(tǒng)掛載點(diǎn)。iOS中此目錄為空茄螃。
./private: 存放兩個(gè)目錄缝驳,分別是/private/etc 和 /private/var。
./tmp: 臨時(shí)目錄责蝠。在iOS中党巾, /tmp是一個(gè)符號(hào)鏈接,實(shí)際指向/private/var/tmp
./usr: 包含了大多數(shù)用戶(hù)工具和程序霜医。/usr/bin 包含那些/bin 和 /sbin 中未出現(xiàn)的基礎(chǔ)功能齿拂,如nm、killall等肴敛; /usr/include 包含所有的標(biāo)準(zhǔn)C頭文件署海;/usr/lib存放庫(kù)文件
./var: variable 的簡(jiǎn)寫(xiě),存放一些經(jīng)常更改的文件吗购,比如日志、用戶(hù)數(shù)據(jù)砸狞、臨時(shí)文件等捻勉。其中/var/mobile 和 /var/root 分別存放了 moblie 用戶(hù)和 root 用戶(hù)的文件,是重點(diǎn)關(guān)注的目錄刀森。
作為iOS開(kāi)發(fā)者 不必太過(guò)于關(guān)注系統(tǒng)底層踱启,多關(guān)注些iOS獨(dú)有目錄。
./ Application: 存放所有的系統(tǒng)App和來(lái)自于Cydia的App研底,不包括StoreApp
./Developer: 如果一臺(tái)設(shè)備來(lái)接X(jué)code后被制定為吊事用機(jī)埠偿,Xcode就會(huì)在ios中生成這個(gè)目錄,其中包含有一些吊事需要的工具和數(shù)據(jù)
./Library: 存放一些提供系統(tǒng)支持的數(shù)據(jù)榜晦,其中./Library/MobileSubstrate下存放了所欲基于CydiaSubstrate 的插件
./System/Library: iOS文件系統(tǒng)中最重要的目錄之一冠蒋,存放大量系統(tǒng)組件,其目錄結(jié)果
對(duì)于該目錄乾胶,在逆向工程的初學(xué)階段抖剿,需要重點(diǎn)關(guān)注的有:
./System/Library/Fremeworks 和 System/Librery/PrivateFrameworks:存放iOS中的各種framework,其中出現(xiàn)在SDK文檔里的只是冰山一角,還有數(shù)不清的未公開(kāi)功能等待我們?nèi)ネ诰颉?/p>
./System/Library/CoreServices里的SpringBoard.app: iOS桌面管理器(類(lèi)似于Windows的explorer),是用戶(hù)與系統(tǒng)交流的最重要中介
./User:用戶(hù)目錄识窿,實(shí)際指向/var/mobile
這個(gè)目錄里存放大量用戶(hù)數(shù)據(jù)
./var/mobile/Media/DCIM 下存放照片
./var/mobile/Media/Recordings下存放錄音文件
./var/mobile/Library/SMS下存放短信數(shù)據(jù)庫(kù)
./var/mobile/Library/Mail/下存放郵件數(shù)據(jù)
另外一個(gè)非常重要的子目錄是/var/mobile/Conteiners,存放StoreApp斩郎。值得注意的是,App的可執(zhí)行文件在bundle與App中的數(shù)據(jù)目錄被分別存放
在/var/mobile/Conteiners/Bundle和/var/mobile/Containers/Bundle 和 /var/mobile/Containers/Data這兩個(gè)不同目錄下
2.1.2 iOS文件權(quán)限簡(jiǎn)介