iOS逆向之文件系統(tǒng)

前言

作為一名iOS開發(fā)者,長期以來和macOS、iOS系統(tǒng)打交道,對iOS和macOS系統(tǒng)并不陌生。在開發(fā)中,我們也經(jīng)常訪問甚至修改MacOS的某些目錄,每個(gè)系統(tǒng)目錄都有其特殊的功能定位。而iOS系統(tǒng)源自macOS,在很多方面iOS都和macOS很相似,筆者借助最近公司內(nèi)逆向的機(jī)會,系統(tǒng)的學(xué)習(xí)&梳理了下iOS的系統(tǒng)目錄及其結(jié)構(gòu),順便總結(jié)了常見的文件目錄的特殊定位。希望本篇文章能夠讓讀者有所收獲。

iOS系統(tǒng)目錄

iOS源自macOS,而macOS又基于Unix系統(tǒng)內(nèi)核,因此其目錄結(jié)構(gòu)與UNIX系統(tǒng)相同。
iOS系統(tǒng)包含兩類目錄,一類是保留的UNIX傳統(tǒng)目錄,另一類是iOS/macOS特有的目錄。

iOS設(shè)備越獄后可以用工具對iOS文件系統(tǒng)目錄一探究竟。下圖是筆者使用iFunbox查看的越獄后iPhone設(shè)備的目錄結(jié)構(gòu)。

iOS文件系統(tǒng)目錄

UNIX傳統(tǒng)目錄

  • /bin:“binary” 的簡稱。存放提供用戶級基礎(chǔ)功能的二進(jìn)制文件。如 cat、chomod、chown等。

  • /sbin:“system binaries” 的簡稱。提供系統(tǒng)級基礎(chǔ)功能的二進(jìn)制文件,如mount、reboot等。

  • /dev:“device” 的簡稱。存放BSD設(shè)備文件。

  • /etc:“EtCetera” 的簡稱。存放系統(tǒng)腳本及配置文件。如passwd、hosts等。iOS中此目錄是一個(gè)符號鏈接,實(shí)際指向/private/etc

  • /boot:存放能使系統(tǒng)成功啟動的所有文件,iOS中此目錄為空。

  • /lib:存放系統(tǒng)文件、內(nèi)核模塊及設(shè)備驅(qū)動等。iOS中此目錄為空。

  • /mnt:“mount” 的簡稱。存放臨時(shí)的文件系統(tǒng)掛載點(diǎn)。iOS中此目錄為空。

  • /tmp:臨時(shí)文件存放目錄。在iOS中,此目錄是一個(gè)符號鏈接,實(shí)際指向/private/var/tmp。macOS中,也是一個(gè)符號鏈接,實(shí)際指向/private/tmp。

  • /usr:“unix software resource”的簡稱。存放大量的工具和第三方程序。

    • 其中,/usr/lib 目錄存放了各種dylib(動態(tài)鏈接庫)。

    • /usr/include 目錄存放了所有的標(biāo)準(zhǔn)C頭文件。

    • /usr/bin目錄存放著一些后期安裝的用戶命令,如zip、unzip等。iOS逆向動態(tài)調(diào)試用到的debugserver也將是放到此目錄。

  • /var:“variable” 的簡稱。存放經(jīng)常變化的文件,如日志文件。其中,/var/mobile和/var/root分別存放了mobile用戶和root用戶的文件,是非常重要的目錄。在iOS中,此目錄是一個(gè)符號鏈接,實(shí)際指向/private/var/tmp。

發(fā)現(xiàn):上面說的/etc和/var的文件鏈接,最終都是指向了/private下的某個(gè)文件夾。

iOS特有目錄

  • /Applications:存放所有系統(tǒng)應(yīng)用以及從Cydia安裝的應(yīng)用,但不包括從App Store下載安裝的應(yīng)用。

  • /Developer:當(dāng)設(shè)備連接到Xcode時(shí),此目錄下會存放一些開發(fā)調(diào)試相關(guān)的文件和工具,如debugserver。

  • /Library:存放一些提供系統(tǒng)支持的數(shù)據(jù),其中的/Library/MobileSubstrate/DynamicLibraries 是越獄開發(fā)者最感興趣的目錄,里面存放了所有基于CydiaSubstrate的插件。

  • /System:僅包含一個(gè)Library子目錄,是iOS文件系統(tǒng)中最重要的目錄之一,存放著大量的系統(tǒng)組件。其中,/System/Library/CoreServices 里面的SpringBoard.app 是iOS桌面管理器,是用戶與系統(tǒng)交互的重要媒介;/System/Library/Frameworks 和 /System/Library/PrivateFrameworks 目錄存放iOS系統(tǒng)中的公開及私有框架。總之,/System是系統(tǒng)中最重要的目錄,一般情況下輕易不要修改他。

  • /User:用戶目錄,實(shí)際指向/var/mobile。這個(gè)目錄下存放著大量的用戶數(shù)據(jù),比如用戶照片、錄音、短信數(shù)據(jù)及語音等。

  • /cores:內(nèi)核轉(zhuǎn)儲文件存放目錄,當(dāng)一個(gè)進(jìn)程崩潰時(shí),如果系統(tǒng)允許則會產(chǎn)生轉(zhuǎn)儲文件。

  • /private:存放/etc、/var兩個(gè)鏈接目錄的目標(biāo)目錄,分別是/private/etc和/private/var。

部分系統(tǒng)目錄

  • /var/root/Library/Lockdown:設(shè)備激活證書存放目錄。

  • /Library/Keychains:設(shè)備系統(tǒng)級密碼等存放目錄。

  • /Library/Logs:系統(tǒng)日志存放目錄,./var/logs也指向此目錄。

  • /Library/Logs/CrashReporter:系統(tǒng)進(jìn)程崩潰日志目錄。

  • /System/Library/LaunchDaemon:系統(tǒng)啟動進(jìn)程plist文件存放目錄,若想不啟動某進(jìn)程,刪除該目錄下對應(yīng)的plist的文件(操作需慎重,刪除之前先備份)。

  • /System/Library/Frameworks:公有框架(開發(fā)者可使用)存放目錄。

  • /System/Library/PrivateFrameworks:私有框架(開發(fā)者不可使用)存放目錄。

  • /System/Library/CoreServices/SpringBoard.app:桌面管理器應(yīng)用,用戶與系統(tǒng)交互的中介。

  • /var/mobile/Containers:存放App Store應(yīng)用相關(guān)文件,其中,子目錄/Bundle存放應(yīng)用可執(zhí)行文件(App Store下載的App就存放在這個(gè)目錄),子目錄/Data存放應(yīng)用數(shù)據(jù)。

部分系統(tǒng)應(yīng)用資料存放目錄

  • /var/wireless/Library/CallHistory:存放通話記錄,網(wǎng)絡(luò)流量,使用時(shí)間等記錄。

  • /var/mobile/Library/AddressBook:存放聯(lián)系人數(shù)據(jù)。

  • /var/mobile/Library/Calendar:存放日歷及提醒事項(xiàng)記錄文件。

  • /var/mobile/Library/Maps:存放地圖搜索書簽記錄。

  • /var/mobile/Library/SMS:存放短信。

  • /var/mobile/Library/Notes:存放備忘錄。

  • /var/mobile/Library/Safari:存放Safari保存的書簽等。

  • /var/mobile/Library/Mail:存放電子郵件數(shù)據(jù)。

  • /var/mobile/Library/Preferences/com.apple.accountsettings.plist:存放郵箱設(shè)置。

  • /var/mobile/Library/Preferences/com.apple.mobilephone.speeddial.plist :存放個(gè)人收藏(快速撥號)。

  • /var/mobile/Media/Recordings:存放語音備忘錄。

  • /var/mobile/Media/iTunes_Control:存放iTunes 同步的電影,歌曲等媒體文件。

  • /var/mobile/Media/DCIM:存放照片里面的膠卷。

  • /var/mobile/Media/PhotoData:存放照片里面的圖片(含相機(jī)膠卷的識別庫縮略圖等)。

  • /var/mobile/Media/Books:存放iBooks同步的書籍。

  • /var/mobile/Media/PhotoStreamsData:存放照片流。

iOS App沙盒目錄結(jié)構(gòu)

出于安全考慮,iOS系統(tǒng)把每個(gè)應(yīng)用以及數(shù)據(jù)都放到一個(gè)沙盒(sandbox)里面,應(yīng)用只能訪問自己沙盒目錄里面的文件、網(wǎng)絡(luò)資源等(也有例外,比如系統(tǒng)通訊錄、照相機(jī)、照片等能在用戶授權(quán)的情況下被第三方應(yīng)用訪問)[1]。

請注意,使用沙盒的目的是為了防止被攻擊的應(yīng)用危害到系統(tǒng)或者其他應(yīng)用,它并不能阻止應(yīng)用本身被攻擊,因此,開發(fā)者需要防御式的編程來避免應(yīng)用被攻擊。蘋果官方是這樣說的:

Important: The purpose of a sandbox is to limit the damage that a compromised app can cause to the system. Sandboxes do not prevent attacks from happening to a particular app and it is still your responsibility to code defensively to prevent attacks. For example, if your app does not validate user input and there is an exploitable buffer overflow in your input-handling code, an attacker could still hijack your app or cause it to crash. The sandbox only prevents the hijacked app from affecting other apps and other parts of the system.

為了便于應(yīng)用組織數(shù)據(jù),每個(gè)沙盒內(nèi)都有幾個(gè)名字固定的子目錄用來保存文件,下圖是沙盒的目錄結(jié)構(gòu):

iOS沙河目錄結(jié)構(gòu)

主要有4個(gè)目錄官方文檔

  • MyApp.app
    該目錄包含了應(yīng)用程序本身的數(shù)據(jù),程序打包的時(shí)候的資源文件和一些本地文件就是存放在這個(gè)目錄下的。程序的可執(zhí)行程序、plist文件也在這個(gè)目錄下。
這個(gè)目錄不會被iTunes同步
  • Documents使用這個(gè)目錄來保存關(guān)鍵數(shù)據(jù)。關(guān)鍵數(shù)據(jù)指那些應(yīng)用不可再生的數(shù)據(jù)。
這個(gè)目錄會被iTunes同步
  • Library用來保存一些配置文件和其他一些文件。其中使用NSUserDefaults寫的設(shè)置數(shù)據(jù)都會保存到Library/Preferences目錄下的一個(gè)plist文件中。Library/Caches可以用來保存可再生的數(shù)據(jù),比如網(wǎng)絡(luò)請求,用戶需要負(fù)責(zé)刪除對應(yīng)文件。
這個(gè)目錄(除了Library/Caches外)會被iTunes同步
  • tmp
使用這個(gè)目錄來保存各種應(yīng)用下次啟動不再需要的臨時(shí)文件。當(dāng)應(yīng)用不再需要這些文件的時(shí)候,需要主動將其刪除。(當(dāng)應(yīng)用不再運(yùn)行的時(shí)候,系統(tǒng)可能會將此目錄清空。)



這個(gè)目錄不會被iTunes同步

獲取主要目錄路徑的方式

沙盒目錄

NSLog(@"%@",NSHomeDirectory());

MyApp.app

NSLog(@"%@",[[NSBundle mainBundle] bundlePath]);

tmp

NSLog(@"%@",NSTemporaryDirectory());

Documents

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docPath = [paths objectAtIndex:0];
NSLog(@"%@",docPath);

Library

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
NSString *libPath = [paths objectAtIndex:0];
NSLog(@"%@",libPath);

iOS應(yīng)用結(jié)構(gòu)

  • App Store下載的App安裝在/var/mobile/Container/Bundle/Application下

  • 系統(tǒng)自身的App和越獄商店安裝的App安裝在/Applications下

iOS文件權(quán)限

iOS是一個(gè)多用戶操作系統(tǒng),每個(gè)用戶扮演著不同的角色,對系統(tǒng)的控制權(quán)也各不相同。root用戶具有系統(tǒng)最高控制權(quán),可以執(zhí)行所有命令,而mobile用戶只能執(zhí)行一些權(quán)限比較低的命令?!敖M”是用戶的一種組織方式,一個(gè)組可以包含多個(gè)用戶,一個(gè)用戶也可以歸屬于多個(gè)組。

我們使用ls -l命令可以查看文件的各種權(quán)限。類似“-rwxr-xr--”這樣的就是文件的權(quán)限信息。權(quán)限信息由10個(gè)bit來劃分,最前面一個(gè)bit表示文件類型。如“d”表示目錄、“l(fā)”表示符號鏈接、“-”表示普通文件。接下來的9個(gè)bit平分為3組,分別如下:

  • 所有者權(quán)限:決定文件的所有者可以對文件執(zhí)行的操作。

  • 所屬組權(quán)限:決定屬于改組的成員對他所擁有的文件能夠執(zhí)行的操作。

  • 其他人權(quán)限:表示其他人對于該文件能夠進(jìn)行的操作。

r:read 代表讀權(quán)限
w: write 代表寫權(quán)限
x: execute代表執(zhí)行權(quán)限
-: 該位置無對應(yīng)權(quán)限

權(quán)限設(shè)置

權(quán)限設(shè)置使用二進(jìn)制表示:如果某一位為1則代表權(quán)限生效,為0無效。例如:要使某個(gè)文件的所有者具有r、w、x權(quán)限,所屬組具有r、w權(quán)限,其他人只有r權(quán)限。則可用二進(jìn)制表示為:111-110-100。同時(shí)二進(jìn)制111-110-100轉(zhuǎn)成八進(jìn)制為764。所以可以使用chmod命令設(shè)置權(quán)限:

chmod 764 xxx.txt

參考文章

File System Programming Guide
iOS之系統(tǒng)文件目錄
《iOS應(yīng)用逆向與安全之道》

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,345評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,494評論 3 416
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,283評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,953評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,714評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,186評論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,255評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,410評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,940評論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,776評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,976評論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,518評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,210評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,642評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,878評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,654評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,958評論 2 373