你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> iOS目錄結構簡介

iOS目錄結構簡介

編輯:IOS開發綜合

iOS系統結構

iOS目錄結構簡介

我們說iOS系統是由OSX系統演化,而OSX基於UNIX操作系統。Filesystem Hierachy Standard為類UNIX操作系統的文件目錄結構制定了一套標准,FHS的初衷是為了讓用戶知道文件或者是目錄的存放位置,OSX在此基礎上形成了自己的hier(7)框架。類UNIX操作系統常見的目錄結構:

/:根目錄,以斜槓表示,其他所有文件和目錄都在根目錄下展開。 /bin:“binary”的簡寫,存放提供用戶基礎功能的二進制文件,如ls、ps等 /boot:存放能使系統成功啟動的所有文件。iOS中此目錄為空。 /dev:“device”的簡寫,存放BSD設備文件。每個文件代表系統一塊設備或字符設備,一般來說,“塊設備”以快為單位傳輸數據,如硬盤;而“字符設備”以字符為單位傳輸數據,如調制解調器。 /sbin:“system binaries”的簡寫,存放提供系統級基礎功能的二進制文件,如netstat、reboot等。 /ect:“Et Cetera”的簡寫,存放系統腳本以及配置文件,如passwd、hosts等。在iOS中,/etc是一個符號鏈接,實際指向/private/etc。 /lib:存放系統庫文件、內核模塊以及設備驅動等。iOS中此目錄為空。 /mnt:“mount”的簡寫,存放臨時的文件系統掛載點。iOS中此目錄為空。 /private:存放兩個目錄,分別是/private/etc和/private/var。 /tmp:臨時目錄。在iOS中/tmp是一個符號鏈接,實際指向/private/var/tmp。 /usr:包含大多數用戶工具和程序。/usr/bin包含哪些/bin和/sbin中未出現的基礎功能,如nm、killall等;/usr/include包含所有標准的C頭文件;/usr/lib存放庫文件 /var:“variable”的簡寫,存放一些經常更改的文件,比如日志、用戶數據、臨時文件等等。其中/var/mobile和/var/root分別存放mobile用戶和root用戶的文件,是重點關注的目錄。

上面的目錄多用於系統底層。

我們的iOS操作系統獨有的目錄:

/Applications:存放所有的系統APP和來自於Cydia的App,不包括StoreApp。 /Developer:如果一台設備鏈接XCode後被指定為調試用機,XCode就會在iOS中生成這個目錄,其中會含有一些調試需要的工具和數據 /Library:存放一些提供系統支持的數據,其中/Library/MobileSubstrate下存放了所有基於CydiaSubstrate的插件 /System/Library:iOS文件系統中最重要的目錄之一,存放大量系統組件。
/System/Library/Frameworks和/System/Library/PrivateFrameworks:存放iOS中各種framework,其中出現在SDK文檔裡面的只是冰山一角,還有數不清的功能等待我們開發。 /System/Library/CoreServices裡的SpringBoard.app:iOS桌面管理器(類似於Windows裡的explorer),是用戶與系統交流的最重要的中介 /User:用戶目錄,實際指向/var/mobile。
/var/mobile/Media/DCIM下存放照片 /var/mobile/Media/Recordings下存放錄音文件 /var/mobile/Library/SMS下存放短信數據庫 /var/mobile/Library/Mail下存放郵件數據 /var/mobile/Containers存放StoreApp 其中App的可執行文件在bundle與App中的數據目錄分別存放在/var/mobile/Containers/Bundle和/var/mobile/Containers/Data兩個不同的目錄下。

iOS文件權限簡介

iOS是一個多用戶操作系統,用戶是一個抽象概念,代表它能對操作系統的所有權和使用權。例如一個mobile用戶無法調用reboot命令重啟iOS,而root用戶卻可以。“組”是用戶的一種組織方式,一個組可以包含多個用戶,一個用戶可以屬於多個組。

iOS中使用3位(bit)來表示文件的權限,從高到低分別是r(read),w(write),x(execute)權限。文件與用戶的關系存在三種可能:1.用戶屬於主用戶;2.用戶不是屬於主用戶,但是屬於主組;3.用戶既不是主用戶也不屬於主組。

所以我們需要3*3位來表示一個文件的權限,如果這一位代表為1則代表權限有效,否則無效。例如:111101101代表rwxr-xr-x,表示該文件主用戶擁有rwx權限,而屬於主組而不是主用戶只有rx權限,不屬於主組也不是主用戶的只有rx權限。轉換為八進制755也是一種常見的權限表示方式。

二進制文件類型

在iOS逆向工程中,我們的目標主要是Application、Dunamic Library(dylib)和Daemon這三類二進制文件。

Application

Application就是我們最熟悉的App了。現在來熟悉幾個常見的目錄

bundle

bundle的概念來源於NeXTSTEP,它不是一個文件,而是一個按某種標准結構來組織的目錄,其中包含了二進制文件及運行所需的資源。正像開發中常見的App和framework都是以bundle的形式存在的;在越獄iOS中常見的PreferenctBundle可以看成是一種依附在Setting的App,結構與App相似,本質是bundle。
Framework也是bundle,但framework的bundle中存放的是一個dylib,而不是一個可執行文件。相對來說frmakework的地位比App還高,因為一個App的大多數功能都是通過調用framework提供的接口來實現的。將某個bundle確立為逆向目標之後,絕大多數逆向線索都可以在bundle內找到,這大大降低了逆向工程的復雜度。

App目錄結構

在iOS逆向工程中,對App目錄結構的熟悉程度決定工作效率的重要因素,App目錄的以下三個部分比較重要

1.Info.plist
Info.plist記錄了App得基本信息,如bundle identifier、可執行文件名、圖標文件名等。我們也可以通過XCode自帶的命令行工具plutil查看他的值。

2.可執行文件
可執行文件的重要性不言而喻,它是App目錄下最核心的部分,也是逆向工程的主要目標。同樣可以通過XCode和plutil兩種方式來查看Info.plist,定位可執行文件。

3.lproj目錄
lproj目錄下存放的是各種本地化的字符串(.strings),他是逆向工程的重要線索,也可以通過plutil查看。

系統App VS StoreApp

/Application/目錄下存放系統App和從Cydia下載的App(我們把來自Cydia的App視為系統App),而/var/mobile/Containers/目錄下存放的則是StoreApp。雖然兩者都為App,但是他們在如下方面存在差異。

1.目錄結構
兩種App的bundle內部目錄結構區別不大,都含有Info.plist、可執行文件、lproj目錄等,但是數據目錄的位置不同;StoreApp的數據目錄在/var/mobile/Containers/Data/下,以,mobile權限運行的系統App的數據目錄在/var/mobile/下,而以root權限下運行的數據目錄在/var/root/下。

2.安裝包的格式和權限
Cydia App的安裝包格式一般為deb,StoreApp的安裝包格式一般為ipa。其中deb是來自Debian得安裝包格式,由Cydia得作者saurik移植到iOS中,他得屬主用戶和屬主組一般是root和admin,能夠以root權限運行;而ipa則是蘋果為iOS推出的專屬App安裝包格式,屬主用戶和屬主組都是mobile,只能以mobile權限運行。

3.沙盒
通俗的說,iOS的沙盒就是一種訪問限制機制,我們可以把它看做是權限的一種表現形式,授權文件(entitlements)也是沙盒的一部分。它是iOS最核心的安全組件之一,其實很復雜,在這裡不討論細節。總的來說,沙盒會將App的文件訪問方位限制在這個App內部,一個App一般不知道其他App的存在,更別說訪問他們了;沙盒還會限制App的功能,例如對iCloud接口的調用必須經過沙盒的允許。

Dynamic Library

dylib在iOS開發中的實例:在我們XCode工程裡導入的各種framework,鏈接的各種lib,其實本質都是dylib。我們可以用命令“file”驗證。

如果把焦點放到越獄iOS中,Cydia裡面各種無一不是以dylib形式工作的,正是這些tweak的存在讓我們能夠隨便定義我們的iOS。在逆向工程中,我們會頻繁接觸各種dylib,因此我們需要了解一些相關知識。

在iOS中,lib分為static和dynamic兩種,其中static lib在編譯階段成為App可執行文件的一部分,會增加可執行文件的大小。因為App尺寸變大,啟動時需要加載的內容變多,所以可能會導致App啟動變慢。dylib則相對智能一些,它不會改變可執行文件的大小,只有當App需要用到這個dylib的時候,iOS才把它加載進內存,成為App進程的一部分。

Daemon

Daemon即守護進程,為後台而生,給用戶提供了各種守護,如imagent保障了iMessage得正確收放,mediaserverd處理了幾乎所有的音頻、視頻,syslogd則用於記錄系統日志等。iOS中daemon主要由一個可執行文件和一個plist文件構成。iOS的根進程是launchd,他會在開機時檢查/Ststem/Library/LaunchDaemons和/Library/LaunchDaemons下所有格式符合規定的plist文件,然後啟動對應的daemon。

daemon提供的功能相對底層,隨意改動會造成嚴重後果,例如白蘋果。

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved