- 從0到1:CTFer成長之路
- Nu1L戰隊
- 1379字
- 2021-01-07 17:32:11
4.1 Android開發基礎
4.1.1 Android四大組件
Android應用程序包括以下4個核心組件。
①Activity:面向用戶的應用組件或者用戶操作的可視化界面,基于Activity基類,底層由ActivityManager統一管理,也負責處理應用內或應用間發送的Intent消息。
②Broadcast Receiver:接受并過濾廣播消息的組件,應用想顯示的接收廣播消息,需在Manifest清單文件中注冊一個receiver,用Intent filter過濾特定類型的廣播消息,見圖4-1-1。應用內也可以通過registerReceiver在運行時動態注冊。

圖4-1-1
③Service:通常用于處理后臺耗時邏輯。用戶不直接與Service對應的應用進程交互。與其他Android應用組件一樣,Service也可以通過IPC機制接收和發送Intent。
使用Service必須在Manifest清單文件中注冊,見圖4-1-2。Service可以通過Intent進行啟動、停止和綁定。
④Content Provider:應用程序間數據共享的組件。如ContactsProvider(聯系人提供者)對聯系人信息統一管理,可以被其他應用(申請權限之后)訪問,應用還可以創建自己的Content Provider,并且把自身數據暴露給其他應用。

圖4-1-2
4.1.2 APK文件結構
APK(Android application Package,Android應用程序包)文件通常包含以下文件和目錄。
1.meta-inf目錄
meta-inf目錄包括如下文件。
? manifest.mf:清單文件。
? cert.rsa:應用簽名文件。
? cert.sf:資源列表及對應的SHA-1簽名。
2.lib目錄
lib目錄包括平臺相關的庫文件,可能包括以下文件。
? armeabi:所有ARM處理器相關文件。
? armeabi-v7a:ARMv7及以上處理器相關文件。
? arm64-v8a:所有ARMv8處理器下的arm64相關文件。
? x86:所有x86處理器相關文件。
? x86_64:所有x86_64處理器相關文件。
? mips:MIPS處理器相關文件。
3.res
res文件是沒有編譯至resources.arsc中的其他資源文件。
4.assets
assets文件是指能通過AssetManager訪問到的資源文件。
5.AndroidManifest.xml
AndroidManifest.xml是Android組件清單文件,包含應用名字、版本、權限等信息,以二進制XML文件格式存儲在APK文件中,能通過apktool、AXMLPrinter2等工具轉換成XML明文格式文件。
6.classes.dex
classes.dex是Android運行時可執行文件。
7.resources.arsc
resources.arsc包含編譯好的部分資源文件。
4.1.3 DEX文件格式
DEX是Dalvik VM executes的簡稱,即Android Dalvik可執行程序。DEX文件中包含該可執行程序的所有Java層代碼。DEX經過壓縮和優化,不僅能減小程序大小,還能加快類及方法的查找效率。DEX文件結構見圖4-1-3。

圖4-1-3
DEX文件的header部分包含了文件大小、校驗值、各數據類型表的偏移和大小等數據。類型表有以下類型。
? string表:每個表項都指向一個string數據偏移。string數據由兩部分組成,起始位置為uleb128算法編碼的變長string長度,后面緊跟string的具體數據,由'\0'結尾。
? type表:存儲各type在string表中的索引。
? proto表:每項包含3個元素,分別為函數原型簡寫、返回類型索引、參數偏移,參數偏移處第一個元素類型為uint,表示參數個數。
? field表:每個表項用3個元素描述了一個變量,分別為該變量所屬的類、該變量所屬的類型、該變量的名字。
? method表:每個表項用3個元素來描述一個函數,分別為該函數所屬的類、該函數的函數原型、該函數的名字。
? class表:每個表項用8個元素來描述一個類,分別為類名、類屬性access flag、父類偏移、接口偏移、源文件索引、類注釋、類數據偏移、靜態變量偏移。
? maps表:保存上述各表的大小和起始偏移,系統能夠通過該表快速定位到各表。
4.1.4 Android APl
截止2019年5月,Android最新API級別為28,對應版本為Pie,每個大版本API都有較大的變化。在AndroidManifest.xml清單文件中,我們可以看到該應用最低支持的API版本及編譯使用的API版本。Android官方API列表見圖4-1-4。

圖4-1-4
4.1.5 Android示例代碼
Android編程語言為Java,但是從2017年5月的Google I/O大會開始,Android官方語言改為了Kotlin(基于JVM的編程語言),彌補了Java缺失的現代語言特性,簡化了代碼,使得開發者可以編寫盡量少的代碼。本章仍以原始Java代碼為例,展示Android應用的基本代碼。
Android應用的入口是onCreate函數:

AndoridManifest.xml文件包括該應用的入口、權限、可接受的參數。

