雖然好幾個月沒更新博客了,但是老羅一直有在準備可以分享的東西的。除了早前在微博分享Android4.2相關(guān)技術(shù)之外,這次還特意準備了12個PPT,總結(jié)之前所研究過的東西。內(nèi)容從Android組件設計思想,到Android源碼開發(fā)和調(diào)試環(huán)境搭建,再到Android專用驅(qū)動和應用程序架構(gòu)等??梢宰鳛椤独狭_的Android之旅》博客和《Android系統(tǒng)源代碼情景分析》一書的導讀,希望對大家有幫助。
廢話就不多說了,直入主題,以下就是這個12個PPT的內(nèi)容介紹以及下載地址。
1. Android組件設計思想
Android應用開發(fā)的哲學是把一切都看作是組件。把應用程序組件化的好處是降低模塊間的耦合性,同時提高模塊的復用性。Android的組件設計思想與傳統(tǒng)的組件設計思想最大的區(qū)別在于,前者不依賴于進程。也就是說,進程即使由于內(nèi)存緊張被強行殺掉了,但是運行在里面的組件還是存在的。這樣就可以在組件再次需要使用時,原地滿血復活,就像什么都沒發(fā)生過一樣。這種設計思想非常適合內(nèi)存較小的移動設備。
理解Android組件設計思想,對Android應用程序架構(gòu)會有更好的認識。這一節(jié)講Android組件化設計的背景、理念、原則,以及Android在OS級別上提供的組件化支持,其中還會包含一個實驗來驗證這種組件化設計思想,可以對Android系統(tǒng)有一個高層次的抽象理解。
下載地址:http://download.csdn.net/detail/luoshengyang/6439629
2. Android源代碼開發(fā)和調(diào)試環(huán)境搭建
Android源代碼開發(fā)環(huán)境與SDK開發(fā)環(huán)境相比,優(yōu)勢是可以查看和調(diào)試系統(tǒng)源代碼,包括Java代碼和C/C++代碼。這對應用開發(fā)也是非常有用的,因為在開發(fā)中碰到疑難雜癥時可以跟蹤到系統(tǒng)內(nèi)部去定位問題。對于涉及到C/C++代碼的開發(fā),例如JNI開發(fā)和安全相關(guān)開發(fā),更加建議在Android源代碼開發(fā)環(huán)境進行,這樣就可以利用gdb以及gdbclient工具進行調(diào)試。
這個PPT主要講Android源代碼下載、編譯和運行,以及C/C++、Java代碼的調(diào)試。
下載地址:http://download.csdn.net/detail/luoshengyang/6439633
3. Android系統(tǒng)架構(gòu)概述
Android系統(tǒng) = Linux內(nèi)核 + Android運行時。
Android系統(tǒng)使用的Linux內(nèi)核包含了一些專用驅(qū)動,例如Logger、Binder、Ashmem、Wakelock、Low-Memory Killer和Alarm等,這些Android專用驅(qū)動構(gòu)成了Android運行時的基石。Android運行時從下到上又包括了HAL層、應用程序框架層和應用程序?qū)?。HAL層主要是為規(guī)避GPL而設計的,它將將硬件驅(qū)動分成內(nèi)核空間和用戶空間兩部分,其中用戶空間兩部分采用的是商業(yè)友好的Apache License。應用程序框架層主要包括系統(tǒng)服務,例如組件管理服務、應用程序安裝服務、窗口管理服務、多媒體服務和電信服務等。應用程序框架進一步又分為C/C++和Java兩個層次,Java代碼運行Dalvik虛擬機之上,并且通過JNI方法和C/C++交互。應用程序?qū)又饕褪怯伤拇蠼M件Activity、Service、Broadcast Receiver和Content Provider構(gòu)成,它們是應用開發(fā)的基礎。
這個PPT從一個通用的應用程序架構(gòu)開始,概述Android系統(tǒng)的專用驅(qū)動、HAL、關(guān)鍵服務、Dalvik、窗口機制和四大組件等。這個PPT 作為前面第1個PPT的延續(xù),幫助進一步了解Android系統(tǒng)的具體實現(xiàn)。
下載地址:http://download.csdn.net/detail/luoshengyang/6439637
4. Android硬件抽象層
Android硬件抽象層從開發(fā)到使用有一個清晰的層次。這個層次恰好對應了Android系統(tǒng)的架構(gòu)層次,它向下涉及到Linux內(nèi)核,向上涉及到應用程序框架層的服務,以及應用程序?qū)訉λ氖褂?。Android硬件抽象層模塊的開發(fā)本身也遵循一定的規(guī)范。有了這個規(guī)范之后,系統(tǒng)就可以對它進行自動加載,方便上層的使用。
這個PPT通過一個具體的實例來分析Android硬件抽象層的開發(fā)、測試和使用,它在幫助我們理解Android系統(tǒng)架構(gòu)的同時,也能教會我們?nèi)绾卧贏ndroid源代碼環(huán)境中開發(fā)C/C++代碼。
下載地址:http://download.csdn.net/detail/luoshengyang/6440375
5. Android專用驅(qū)動
Android專用驅(qū)動構(gòu)成了Android運行時的基石。從技術(shù)上來講,Android專用驅(qū)動也是整個Android系統(tǒng)的亮點,特別是Binder驅(qū)動。Binder是一種進程間通信機制(IPC),它與傳統(tǒng)的IPC機制對比,最大的特點是高效,因為通信數(shù)據(jù)在兩個進程之間只需要執(zhí)行一次拷貝即可。Binder在Android系統(tǒng)里面使用得非常廣泛以及頻繁。在涉及到比較大的通信數(shù)據(jù)時,Binder通常還結(jié)合另外一個驅(qū)動Ashmem來使用。Ashmem是一個共享內(nèi)存驅(qū)動,它與傳統(tǒng)的共享內(nèi)存相比,最大的特點是它是通過文件描述符來描述的,并且可以動態(tài)地進行分塊管理。動態(tài)分塊管理的目的是可以將部分不再使用了的內(nèi)存交回給系統(tǒng),非常適合內(nèi)存較小的移動設備使用。另外一個專用驅(qū)動Logger是一個日志驅(qū)動,它與傳統(tǒng)的日志系統(tǒng)對比,特點是日志是記錄在內(nèi)核空間而非文件中,這樣就可以提高日志的讀寫速度。
這個PPT講Logger、Binder和Ashmem三個Android專用驅(qū)動的實現(xiàn)原理。由于這三個驅(qū)動在Android源代碼里面用得非常廣泛和頻繁,因此理解它們的實現(xiàn)原理,就可以掌握Android的精華。這對以后閱讀Android系統(tǒng)的其它代碼,也是非常有幫助的。
下載地址:http://download.csdn.net/detail/luoshengyang/6439643
6. Android應用程序進程管理
Android系統(tǒng)里面的應用程序進程有一個特點,那就是它們是被系統(tǒng)托管的。也就是說,系統(tǒng)根據(jù)需要來創(chuàng)建進程以及回收進程。進程創(chuàng)建發(fā)生在組件啟動時,它們是由Zygote進程負責創(chuàng)建。Zygote進程是由系統(tǒng)中的第一個進程init負責啟動。此外,用來運行各種系統(tǒng)服務的System Server進程也是由Zygote進程創(chuàng)建的。進程回收發(fā)生在內(nèi)存緊張時,由Low Memory Killer執(zhí)行。此外,組件管理服務ActivityManagerService和窗口管理服務WindowManagerService也會在適當?shù)臅r候主動進行進程回收。每一個應用程序進程根據(jù)運行情況被賦予優(yōu)先級,當需要回收進程的時候,就按照優(yōu)先級從低到高的順序進行回收。
這個PPT講Android應用程序進程的啟動和回收,主要涉及到Zygote進程、System Server進程,以及組件管理服務ActivityManagerService、窗口服務WindowManagerService,還有專用驅(qū)動Low Memory Killer。通過了解Android系統(tǒng)對應用程序進程的管理,我們就能更清楚應用程序的運行機制。
下載地址:http://download.csdn.net/detail/luoshengyang/6439645
7. Android應用程序消息機制
Android應用程序與傳統(tǒng)的PC應用程序一樣,都是消息驅(qū)動的。也就是說,在Android應用程序主線程中,所有函數(shù)都是在一個消息循環(huán)中執(zhí)行的。Android應用程序其它線程,也可以像主線程一樣,擁有消息循環(huán)。Android應用程序主線程是一個特殊的線程,因為它同時也是UI線程以及觸摸屏、鍵盤等輸入事件處理線程。主線程對消息循環(huán)很敏感,一旦發(fā)生阻塞,就會影響UI的流暢度,甚至發(fā)生ANR問題。
這個PPT講Android應用程序線程消息循環(huán)原理,主要涉及到Handler和Looper兩個類,以及根據(jù)消息循環(huán)的不同使用場景,總結(jié)出三種線程使用模型。掌握Android應用程序消息處理機制,有助于我們熟練地使用同步和異步編程,提高程序的運行性能。
下載地址:http://download.csdn.net/detail/luoshengyang/6439647
8. Android應用程序輸入事件分發(fā)和處理機制
在Android應用程序中,有一類特殊的消息,是專門負責與用戶進行交互的,它們就是觸摸屏和鍵盤等輸入事件。觸摸屏和鍵盤事件是統(tǒng)一由系統(tǒng)輸入管理器InputManager進行分發(fā)的。也就是說,InputManager負責從硬件接收輸入事件,然后再將接收到的輸入事件分發(fā)當前激活的窗口處理。此外,InputManager也能接收模擬的輸入事件,用來模擬用戶觸摸和點擊等事件。當前激活的窗口所運行在的線程接收到InputManager分發(fā)過來的輸入事件之后,會將它們封裝成輸入消息,然后交給當前獲得焦點的控件處理。
這個PPT講Android應用程序輸入事件的分發(fā)和處理過程,主要涉及到輸入管理InputManager、輸入事件監(jiān)控線程InputReader、輸入事件分發(fā)線程InputDispatcher,以及應用程序主線程消息循環(huán)。
下載地址:http://download.csdn.net/detail/luoshengyang/6440247
9. Android應用程序UI架構(gòu)
Android系統(tǒng)采用一種稱為Surface的UI架構(gòu)為應用程序提供用戶界面。在Android應用程序中,每一個Activity組件都關(guān)聯(lián)有一個或者若干個窗口,每一個窗口都對應有一個Surface。有了這個Surface之后,應用程序就可以在上面渲染窗口的UI。最終這些已經(jīng)繪制好了的Surface都會被統(tǒng)一提交給Surface管理服務SurfaceFlinger進行合成,最后顯示在屏幕上面。無論是應用程序,還是SurfaceFlinger,都可以利用GPU等硬件來進行UI渲染,以便獲得更流暢的UI。在Android應用程序UI架構(gòu)中,還有一個重要的服務WindowManagerService,它負責統(tǒng)一管理協(xié)調(diào)系統(tǒng)中的所有窗口,例如管理窗口的大小、位置、打開和關(guān)閉等。
這個PPT講Android應用程序的Surface機制,闡述Activity、Window和View的關(guān)系,以及應用程序、WindowManagerService和SurfaceFlinger協(xié)作完成UI渲染的過程。
下載地址:http://download.csdn.net/detail/luoshengyang/6439651
10. Android應用程序資源管理框架
Android應用程序主要由代碼和資源組成。資源主要就是指那些與UI相關(guān)的東西,例如UI布局、字符串和圖片等。代碼和資源分開可以使得應用程序在運行時根據(jù)實際需要來組織UI。這樣就可使得應用程序只需要編譯一次,就可以支持不同的UI布局。這種特性使得應用程序在運行時可以適應不同的屏幕大小和密度,以及不同的國家和語言等。資源在Android應用程序編譯的過程中,也會被編譯成二進制格式。這是為了壓縮資源存儲空間,以及加快運行時的資源解析速度。Android應用程序在運行的時候,資源管理器AssetManager和Resources會根據(jù)當前的機器設置,即屏幕大小、密度、方向,以及國家、地區(qū)語言的信息,查找正確的資源,并且進行解析,最后將它們渲染在UI上。
這個PPT講Android應用程序資源的編譯、打包,以及它們在運行時的查找、解析過程。了解Android應用程序資源管理框架,有助于我們更好地開發(fā)出能夠適配多種機型的應用程序。
下載地址:http://download.csdn.net/detail/luoshengyang/6439653
11. Dalvik虛擬機
Android應用程序是運行在Dalvik虛擬機里面的,并且每一個應用程序?qū)幸粋€單獨的Dalvik虛擬機實例。Android應用程序中的Dalvik虛擬機實例實際上是從Zygote進程的地址空間拷貝而來的,這樣就可以加快Android應用程序的啟動速度。Dalvik虛擬機與Java虛擬機共享有差不多的特性,例如,它們都是解釋執(zhí)行,并且支持即時編譯(JIT)、垃圾收集(GC)、Java本地方法調(diào)用(JNI)和Java遠程調(diào)試協(xié)議(JDWP)等,差別在于兩者執(zhí)行的指令集是不一樣的,并且前者的指令集是基本寄存器的,而后者的指令集是基于堆棧的。
這個PPT講Dalvik虛擬機的內(nèi)存管理、垃圾收集、即時編譯、Java本地調(diào)用、進程和線程管理等。理解Dalvik虛擬機的上述實現(xiàn)細節(jié),有助于在運行時修改程序的行為,例如,攔截Java函數(shù)的調(diào)用。
下載地址:http://download.csdn.net/detail/luoshengyang/6439657
12. Android安全機制
Android應用程序是運行在一個沙箱中。這個沙箱是基于Linux內(nèi)核提供的用戶ID(UID)和用戶組ID(GID)來實現(xiàn)的。Android應用程序在安裝的過程中,安裝服務PackageManagerService會為它們分配一個唯一的UID和GID,以及根據(jù)應用程序所申請的權(quán)限,賦予其它的GID。有了這些UID和GID之后,應用程序就只能限訪問特定的文件,一般就是只能訪問自己創(chuàng)建的文件。此外,Android應用程序在調(diào)用敏感的API時,系統(tǒng)檢查它在安裝的時候會沒有申請相應的權(quán)限。如果沒有申請的話,那么訪問也會被拒絕。對于有root權(quán)限的應用程序,則不受上述沙箱限制。此外,有root權(quán)限的應用程序,還可以通過Linux的ptrace注入到其它應用程序進程,以及系統(tǒng)進程,進行各種函數(shù)調(diào)用攔截。
這個PPT的計劃是講代碼加殼、注入和攔截技術(shù)的,包括:
(1). SO注入。也就是從一個進程向另外一個進程注入一個SO文件,通過該注入的SO文件就可以實現(xiàn)函數(shù)攔截功能。
(2). SO加殼。加殼的目的自然就是加大別人對自己的C/C++代碼進行靜態(tài)逆向難度了,這個技術(shù)的關(guān)鍵是要實現(xiàn)一個能純內(nèi)存操作的Linker了。也就是說,解密后的SO文件內(nèi)容是保存在一個內(nèi)存緩沖區(qū)的,然后再針對該內(nèi)存緩沖區(qū)進行解析和鏈接,最終形成一段可執(zhí)行的代碼。這個過程不會產(chǎn)生任何文件供別人做靜態(tài)分析。
(3). C/C++函數(shù)GOT攔截。通過修改SO的GOT項來實現(xiàn)函數(shù)攔截。這個技術(shù)的特點是簡單和穩(wěn)定,但是不足之處于它是針對函數(shù)的調(diào)用方進行攔截的,而不是針對函數(shù)本身的實現(xiàn)來進行攔截的。這樣當我們想對某一個函數(shù)進行攔截的時候,就必須要檢查進程內(nèi)所有的模塊,然后對調(diào)用了目標函數(shù)的模塊的相關(guān)GOT 項進行修改。此外,如果某一個模塊是通過動態(tài)SO加載技術(shù)(dlopen、dlsym)來調(diào)用目標函數(shù)的話,GOT攔截就失效了,因為動態(tài)SO加載技術(shù)不會產(chǎn)生GOT項。
(4). C/C++函數(shù)INLINE攔截。這種方法是直接對目標函數(shù)的前面幾條指令進行修改,用來實現(xiàn)攔截技術(shù)。INLINE攔截沒有上述GOT攔截的缺點,但是它的實現(xiàn)會復雜很多。由于絕大部分Android設備都是基于ARM架構(gòu),因此這里只討論ARM架構(gòu)的C/C++函數(shù)INLINE攔截。ARMl架構(gòu)主要分為ARM和THUMB兩種指令集,也就是在Android設備上運行的C/C++函數(shù)分為ARM和THUMB兩種類型。對于ARM指令集的函數(shù),對它們進行攔截至少需要修改頭8個字節(jié);對于THUMB指令集,對它們進行攔截至少需要修改頭12個字節(jié)。無論ARM指令還是THUMB指令函數(shù),我們要修改的頭8個字節(jié)或者12個字節(jié)都很容易碰到跳轉(zhuǎn)或者PC相對尋址指令,這樣就需要對指令進行重定位。這個重定位工作相當于繁重和麻煩,得實現(xiàn)一個ARM和THUMB指令解析庫才行。不像X86的函數(shù)INLINE攔截,只需要函數(shù)的頭5個字節(jié)即可,而且這5個字節(jié)幾乎都是堆棧相關(guān)的操作,不會涉及到跳轉(zhuǎn)或者PC相對尋址指令。
(5). DEX注入。在SO注入的基礎上,要對目標進程進行DEX注入是相當簡單的,通過DexClassLoader即可實現(xiàn)。
(6). DEX加殼。DEX加殼與SO加殼一樣,都要求在解密之后,能夠進行純內(nèi)存操作,中間不要產(chǎn)生任何和DEX或者ODEX文件,否則的話,就會給別提供靜態(tài)分析的機會,這樣就失去了加殼的目的。
(7). Java函數(shù)攔截。與C/C++函數(shù)攔截相對,Java函數(shù)攔截要優(yōu)雅得多,因為所有的Java函數(shù)都是通過虛擬機來執(zhí)行的。Dalvik虛擬機執(zhí)行的函數(shù)分為Java和Native兩種,它們都是使用Method結(jié)構(gòu)體來描述。當一個Method結(jié)構(gòu)體描述的是一個Java函數(shù)時,它有一個成員變量就指向該Java函數(shù)的方法區(qū)。而當一個Method結(jié)構(gòu)體描述的是一個Native函數(shù),它有一個成員變量指向該Native函數(shù)的地址。因此,主要我們能將一個用來描述Java函數(shù)的Method結(jié)構(gòu)體修改為一個指向Native函數(shù)的Method結(jié)構(gòu)體,就可以騙過Dalvik虛擬機來執(zhí)行我們所指定的Native函數(shù),從而實現(xiàn)攔截。
以上7個技術(shù)點涵蓋了Android安全的攻與防基礎。在這些基礎上不僅可以保護我們自己的代碼,還可以對別人的代碼進行攻擊。
下載地址:(待)
聯(lián)系客服