在iOS逆向工程初學(xué)階段蜈敢,我們的目標(biāo)主要是 Application撕氧、Dynamic Library(以下簡(jiǎn)稱dylib)和 Daemon這三類二進(jìn)制文件腐宋,對(duì)它們的了解越深入无蜂, 逆向工程就會(huì)越順利伺糠。這三類文件分工不同,其目錄 結(jié)構(gòu)和文件權(quán)限也有一些區(qū)別酱讶。
Application
Application就是我們最熟悉的App了退盯。了解下面的幾個(gè)App相關(guān)概念,是
開(kāi)始逆向工程前的必備工作。
bundle:概念來(lái)源于NeXTSTEP,是一個(gè)按某種標(biāo)準(zhǔn)結(jié)構(gòu)來(lái)組織的目錄渊迁,其中包含了二進(jìn)制文件及運(yùn)行所需的資源慰照。正向開(kāi)發(fā)中常見(jiàn)的App和framework都是以bundle的形式存在的;在越獄iOS中常見(jiàn)的PreferenceBundle琉朽,可以看成是一種依附于Settings的App毒租,結(jié)構(gòu)與App類似,本質(zhì)也是bundle箱叁。Framework也是bundle墅垮,但framework的bundle中存放的是一個(gè)dylib,而不是可執(zhí)行文件耕漱。
App目錄結(jié)構(gòu):App目錄的以下三個(gè)部分比較重要:
- Info.plist:Info.plist記錄了App的基本信息算色,如bundle identifier、可執(zhí)行文件名螟够、圖標(biāo)文件名等灾梦。其中bundle identifier會(huì)在后續(xù)章節(jié)的CydiaSubstrate中成為 tweak的重要配置信息〖梭希可以通過(guò)Xcode查看它的值若河,也可以通過(guò)Xcode自帶的命令行工具plutil查看它的值。
- 可執(zhí)行文件:同樣可以通過(guò)Xcode和plutil兩種方式來(lái)查看Info.plist寞宫,定位可執(zhí)行文件萧福。也可以通過(guò)Xcode自帶的命令行工具plutil查看它的值“Executable File”。
- lproj目錄:proj目錄下存放的是各種本地化的字符串(.strings)辈赋,是iOS逆向工程的重要線索鲫忍,也可以用plutil查看。
系統(tǒng)App VS StoreApp:/Applications/目錄存放系統(tǒng)App和從Cydia下載的App(我們把來(lái)自Cydia的App視為系統(tǒng)App)炭庙。而/var/mobile/Containers/目錄存放的則是StoreApp饲窿。雖然兩者都是App,但它們?cè)谌缦路矫娲嬖谥恍┎顒e:
- 目錄結(jié)構(gòu):數(shù)據(jù)目錄的位置不同:StoreApp的數(shù)據(jù)目錄在/var/mobile/Containers/Data/下焕蹄,以mobile權(quán)限運(yùn)行的系統(tǒng)App的數(shù)據(jù)目錄在/var/mobile/下,而以root權(quán)限運(yùn)行的系統(tǒng)App的數(shù)據(jù)目錄在/var/root/下阀溶。
- 安裝包格式與權(quán)限:Cydia App的安裝包格式一般是deb腻脏,StoreApp的 安裝包格式一般是ipa。其中deb是來(lái)自Debian的安裝 包格式银锻,由Cydia作者saurik移植到iOS中永品,它的屬主 用戶和屬主組一般是root和admin,能夠以root權(quán)限運(yùn) 行击纬;而ipa是蘋(píng)果為iOS推出的專屬App安裝包格式鼎姐, 屬主用戶和屬主組都是mobile,只能以mobile權(quán)限運(yùn) 行。
- 沙盒(sandbox):iOS中的沙盒就是一種訪問(wèn)限制機(jī)制炕桨,我們可以把它看作是權(quán)限的一種表現(xiàn)形式饭尝,授權(quán)文件(entitlements)也是沙盒的一部分。它是iOS最核心的安全組件之一献宫≡科剑總的來(lái)說(shuō),沙盒會(huì)將App的文件訪問(wèn)范圍限制在這個(gè)App內(nèi)部姊途,一個(gè)App一般不知道其他App的存在涉瘾,更別說(shuō)訪問(wèn)它們了;沙盒還會(huì)限制App的功能捷兰,例如對(duì)iCloud接口的調(diào)用就必須經(jīng)過(guò)沙盒的允許立叛。
Dynamic Library
在Xcode工程里導(dǎo)入的各種framework,鏈接的各種lib贡茅,其實(shí)本質(zhì)都是dylib秘蛇。如果把焦點(diǎn)轉(zhuǎn)移到越獄iOS中,Cydia里的各種tweak無(wú)一不是以dylib的形式工作的友扰,正是這些tweak的存在讓我們能夠隨意定制自己的iOS彤叉。在逆向工程中,我們會(huì)頻繁接觸各種dylib村怪,因此有必要了解一些相關(guān)知識(shí)秽浇。
在iOS中,lib分為static和dynamic兩種甚负,其中staticlib在編譯階段成為App可執(zhí)行文件的一部分柬焕,會(huì)增加可執(zhí)行文件的大小。因?yàn)锳pp尺寸變大梭域,啟動(dòng)時(shí)需要加載的內(nèi)容變多斑举,所以可能會(huì)導(dǎo)致App啟動(dòng)變慢。dylib則相對(duì)“智能”一些病涨,它不會(huì)改變可執(zhí)行文件的大小富玷,只有當(dāng)App需要用到這個(gè)dylib時(shí),iOS才會(huì)把它加載進(jìn)內(nèi)存既穆,成為App進(jìn)程的一部分赎懦。
值得一提的是,dylib雖然充斥在iOS的各個(gè)角落幻工,是逆向工程的重要目標(biāo)類型励两,但其本身并不是可執(zhí)行文件,不能獨(dú)立運(yùn)行囊颅,只能為別的進(jìn)程服務(wù)当悔,而且它們寄生在別的進(jìn)程里傅瞻,成為了這個(gè)進(jìn)程的一部分。因此盲憎,dylib的權(quán)限是由它寄生的那個(gè)App決定的嗅骄,同一個(gè)dylib寄生在系統(tǒng)App和StoreApp里時(shí)的權(quán)限是不同的。
例如焙畔,你寫(xiě)了一個(gè)Instagram的tweak掸读,用來(lái)把喜歡的圖片保存在本地,如果保存目錄是/var/mobile/Containers/Data/下App對(duì)應(yīng)的Documents目錄宏多,那么因?yàn)镮nstagram是一個(gè)StoreApp儿惫,這樣的操作是沒(méi)有問(wèn)題的,tweak能夠正常工作伸但。而如果保存目錄是/var/mobile/Documents肾请,那么在興高采烈地保存了一大堆美圖,準(zhǔn)備回頭細(xì)細(xì)品味時(shí)更胖,你就會(huì)發(fā)現(xiàn)/var/mobile/Documents里啥圖片也沒(méi)有——操作都被sandbox給禁掉了铛铁。
Daemon
Daemon為后臺(tái)運(yùn)行而生,給用戶提供了各種“守護(hù)”却妨,如imagent保障了iMessage的正確收發(fā)饵逐,mediaserverd處理了幾乎所有的音頻、視頻彪标,syslogd則用于記錄系統(tǒng)日志等倍权。
iOS中的daemon主要由一個(gè)可執(zhí)行文件和一個(gè)plist文件構(gòu)成。iOS的根進(jìn)程是launchd捞烟,它會(huì)在開(kāi)機(jī)時(shí)檢查/System/Library/LaunchDaemons和/Library/LaunchDaemons下所有格式符合規(guī)定的plist文件薄声,然后啟動(dòng)對(duì)應(yīng)的daemon。