macOS平台軟體的下載與安裝
對於一個操作系統來說,對其影響最大的莫過於運行在它上面的軟體,正因為這些形形色色軟體的存在,操作系統才得以廣泛應用。與Linux、Windows等主流操作系統一樣,運行在macOS上的軟體也有著自己獨有的特點。
macOS上的軟體有著自己獨特的UI界面與操作方式。macOS的設計師一直秉承著自己的設計理念,設計出的Aqua界面別具風格。銀灰的金屬色主題始終是分辨macOS系統最快捷的一種方式,與Windows界面將最小按鈕與關閉按鈕設置到窗口右上角不同,Aqua界面的程序,最小化與關閉按鈕位於軟體的左上角,並且使用全屏按鈕替換了Windows上的最大化按鈕。進入全屏模式下的軟體會新開一個窗口並佔據屏幕的全部空間,可以在觸摸板上使用三根手指左右划動來切換不同的全屏窗口。
每個常規的Aqua界面的程序都有一個菜單,菜單顯示在用戶屏幕的頂端,菜單的最左邊始終是一個蘋果圖標,點擊它會彈出系統設置、App Store、關機、重啟等多個選項。
macOS使用Dock欄來管理顯示常用的軟體,它位於用戶屏幕的底部,展示效果與Windows的任務欄相似,正在運行的macOS界面程序,都可以在Dock上右鍵點擊該程序,在彈出的菜單中選擇Options->Keep in Dock,將程序在Dock上保留下來,以後就可以直接從Dock中單擊圖標啟動程序。
在Windows系統中,用戶可以使用開始菜單->所有程序來找到系統中安裝的軟體並啟動它,macOS中則提供了一個Launchpad程序來管理安裝在/Applications目錄中的軟體。Launchpad移植於iOS系統中的SpringBoard,展示的效果也與之類似,它以全屏網格形式的界面顯示了所有可以運行的軟體與系統工具,如果軟體安裝過多,會以多個頁面來展示。點擊Dock上的Launchpad圖標可以啟動它,如圖所示:使用二根手指左右划動可以在不同的頁面間切換。0x0 可執行文件
除了Aqua界面的程序,macOS上還可以運行很多其它種類的文件,這裡將所有可以運行在macOS系統上文件的統稱為macOS可執行文件。
首先是腳本,macOS提供了UNIX系統中的Shell環境來支持運行腳本與命令行程序,腳本實質是一個文本文件,在腳本文件中指定運行它解釋器後,Shell在運行腳本時,會調用解釋器來解釋運行它,任何一個文件都可以通過執行」chmod +x」命令給它加上可執行許可權,擁有可執行許可權的文件並不一定能執行,它必須是能滿足某種解釋器的語法規則才算得上可執行文件。
除了主流的幾種Shell腳本支持外,macOS還內置了目前比較流行的Perl、Python和Ruby等腳本的解釋器,任何人都可以直接編寫Perl、Python和Ruby腳本並調用它們的解釋器來運行,而不需要安裝額外的軟體。另外,蘋果公司還開發了一種腳本:AppleScript(蘋果腳本)。它的作用是用於運行在macOS的程序並實際自動化工作的。蘋果提供了一個單獨的腳本編輯器來開發與調試AppleScript。它位於/Applications/Utilities/Script Editor。使用Script Editor編寫好的腳本保存的格式為scpt。隨著macOS系統的不斷升級,AppleScript也在不停的發展,目前甚至可以使用AppleScript來開發macOS上的界面程序。具體的步驟是在XCode中選擇File->New->Project,在打開的對話框中選擇Other->Cocoa-AppleScript。有興趣的讀者可以參看蘋果的官方文檔來深入了解AppleScript,地址上:Introduction to AppleScript Overview 。
除了腳本外,可執行文件還包括可以由用戶主動執行的程序與被動執行的程序文件。
主動執行的程序包括:GUI界面程序、命令行程序、遊戲等;被動執行的程序包括被系統調用的程序,如:Quick Look插件、屏幕保護程序、內核驅動與擴展等,以及被程序調用的框架、庫、Bundle、XPC服務等。所有的這些可執行文件都使用蘋果獨有的可執行文件格式Mach-O。關於Mach-O文件的格式,將在後面的小節中進行詳細講解。
0x1 下載與安裝軟體
蘋果支持從自家的App Store應用商店直接安裝軟體,也支持從第三方渠道,如其它磁碟介質、網路下載來安裝軟體。從App Store下載軟體是最方便快捷,也是最安全的一種方式,蘋果公司一向以軟體審查嚴格聞名,自家商店中的應用軟體在界面、功能以及對系統資源的使用上,都是經常嚴格審查與限制的,對於普通用戶來說,這種下載軟體的方式最合適不過了,但對於專業用戶來說,由於一些專業軟體在用戶授權協議、資源訪問上或其它方面的原因未能在App Store上架,就只能從網路或第三方渠道來獲取這類軟體了。
0x1.1 免費與付費軟體
App Store應用商店上提供了豐富的免費與付費的軟體供用戶下載使用。下載免費的軟體不需要用戶付出額外的成本,只需要到官網https://appleid.apple.com/ 註冊一個的帳號,使用帳號登錄App Store就可以下載上面的免費軟體了。
如果要下載App Store上面的收費軟體,需要為帳號綁定一張銀行卡,購買軟體成功後會直接從銀行卡中扣取費用。另外,App Store中的軟體還支持另一種收費方式:In-App Purchase(應用內付費),簡稱IAP,這種收費方式在蘋果自家的iOS系統中應用非常廣泛,它允許開發人員為自己的軟體某些特定功能設定為需要購買才能使用,目前,很多軟體開發商以此平台作為主要的軟體收入來源。App Store中的收費軟體只有IAP與直接購買這兩種方式,而網路下載的收費軟體的付費形式則豐富很多。部分軟體官網只提供軟體基礎功能的演示版本供用戶下載,如果需要使用正式版本,則需要聯繫軟體開發商購買完整版本。例如著名的反彙編軟體IDA Pro,官網就只提供了Demo版本可供下載:IDA Support: Evaluation Version ,正式版本需要找軟體開發商或代理商購買。也有些軟體的官網會提供完整版本下載,但會有使用時間或功能限制,如果需要正常無限制使用軟體,則需要購買軟體授權,如反彙編軟體Hopper(Hopper)。還有部分軟體與傳統Window付費軟體一樣,使用用戶名與註冊碼的形式來售賣軟體,如010 Editor(The Professional Text/Hex Editor with Binary Templates)。
0x1.2 安裝軟體
普通的macOS軟體只是一個以擴展名.app結尾的目錄,這種目錄有著特定的組織結構,macOS將它稱之為Bundle,安裝這類軟體只需要將Bundle複製到系統的/Applications目錄即可,複製完成後,Launchpad面板會自動更新安裝好的軟體圖標,啟動軟體不需要到/Applications目錄中去尋找它,只需要打開Launchpad,找到軟體的圖標並點擊就可以運行該程序了。
從網路上下載的軟體通常是經過打包後發布的,普通的軟體多是zip或其它方式壓縮後,以壓縮包的形式提供下載,還有的使用磁碟工具將軟體打包成一個dmg磁碟鏡像文件,這類dmg文件內通常還會有一個Applications目錄的軟鏈接,安裝的時候,只需要將dmg中的軟體直接拖放到該軟鏈接上就算完成安裝了。如圖所示,是AppDelete的安裝鏡像:macOS上的軟體還有一種是以pkg或mpkg結尾的安裝包,類似於Windows系統上的msi或exe安裝程序,通過不停的點擊下一步就可以完成安裝,這類軟體除了將主程序寫入/Applications目錄外,一般還會在系統上做一些只有管理員許可權才能完成的動作,比如為特定的目錄或文件創建軟鏈接、安裝與卸載內核擴展、複製命令行程序到用戶可執行文件目錄/usr/local/bin中等。因此,在安裝的過程中,可能會提示輸入管理員用戶名與密碼來執行需要Root許可權的操作。
另一種是命令行工具,這類程序的安裝使用第一章中介紹的Homebrew即可,此處不再贅述。
0x3 Bundle
Bundle是蘋果系統獨有的特色,在蘋果系統上大量中使用了Bundle。
0x3.1 Bundle目錄結構
安裝到macOS系統上的軟體有著自己特定的格式,它們是以.app擴展名結尾的Bundle目錄結構。Bundle有著固定的組織格式,在Finder中查看Bundle的目錄內容,可以在程序上點右鍵,在彈出的菜單中選擇Show Package Contents,查看Bundle的目錄結構。以/Applications目錄下App Store為例,它的目錄結構如圖所示:
在App Store.app目錄下,只有一個Contents子目錄,所有軟體的內容都在此目錄下。它們包括:
- CodeSignature目錄。此目錄下只有一個CodeResources文件,它是一個plist格式的文件,保存了軟體包中所有文件的簽名信息。
- info.plist文件。此文件記錄了軟體的一些信息。如軟體構建的機器的版本BuildMachineOSBuild、可執行文件名CFBundleExecutable、軟體的標識CFBundleIdentifier、軟體包名CFBundleName等。
- MacOS目錄。此目錄存放了可執行文件。
- Pkginfo文件。軟體包的8位元組的標識符。
- Resources目錄。軟體運行所需要的資源,包括.iproj本地化資源、.nib資源、圖片、字體、聲音、文檔以及其它文件。
- Plugins目錄。插件目錄,存放了軟體用到的插件,插件也是使用Bundle目錄結構進行組織的一種程序。
除了Plugins目錄外,根據軟體需求與實現的不同,Contents下可能還會有Frameworks與XPCServices目錄,Frameworks裡面存放了軟體需要用到的框架,它是以.framework結尾的Bundle結構;XPCServices則存放了軟體用到的XPC服務,它是以.xpc結尾的Bundle結構,還有一種以.bundle擴展名結尾的Bundle,它是「純粹」的Bundle,目錄結構與其它的Bundle無異,存放的內容可以是二進位代碼,也可以是資源,也可以二者同時存放,如果存放二進位代碼的話,可供程序在代碼中使用dlopen()函數打開,這種Bundle通常用於製作軟體的插件,存放在軟體Bundle的Resources目錄下。
0x3.2 代碼中訪問Bundle
在程序中,開發人員可以使用Cocoa框架提供的NSBundle類來獲取程序的Bundle信息。調用NSBundle的mainBundle()方法可以返回當前程序的主Bundle對象,調用方法如下:
NSBundle *bundle = [NSBundle mainBundle]n
使用主Bundle對象的infoDictionary()方法可以訪問軟體Bundle目錄下info.plist文件中的信息,它返回的是一個字典對象,如下所示是獲取程序標識符的代碼:
[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleIdentifier"]]n
使用主Bundle對象的pathForResource()方法可以訪問Bundle目錄下任意資源文件。如下所示是訪問Bundle根目錄下的monkey.png文件:
NSString *monkey = [[NSBundle mainBundle] pathForResource:@"monkey" ofType:@"png"];n
與主Bundle對應的是自定義Bundle,這一類Bundle的訪問可以這樣調用:
NSString *resourceBundle = [[NSBundle mainBundle] pathForResource:@"ResPack" ofType:@"bundle"];nNSLog(@"resourceBundle: %@", resourceBundle);nNSString *monkey = [[NSBundle bundleWithPath:resourceBundle] pathForResource:@"monkey"n ofType:@"png" inDirectory:@"Images"];nnNSLog(@"monkey path: %@", monkey);n
上面這段代碼訪問了ResPack.bundle中Images目錄下的monkey.png文件。
推薦閱讀:
※Let's GoSSIP! 第二屆軟體與移動智能系統安全暑期學校小記
※PKG安裝包的管理與文件格式分析
TAG:软件安全 |