使用鉤子技術(shù)改進(jìn)Android程序安全性-上_第1頁(yè)
使用鉤子技術(shù)改進(jìn)Android程序安全性-上_第2頁(yè)
使用鉤子技術(shù)改進(jìn)Android程序安全性-上_第3頁(yè)
使用鉤子技術(shù)改進(jìn)Android程序安全性-上_第4頁(yè)
使用鉤子技術(shù)改進(jìn)Android程序安全性-上_第5頁(yè)
已閱讀5頁(yè),還剩9頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、使用鉤子技術(shù)改進(jìn)Android程序安全性(上篇)一、 簡(jiǎn)介在Android開(kāi)發(fā)世界中,開(kāi)發(fā)人員通常利用第三方庫(kù)(例如游戲引擎,數(shù)據(jù)庫(kù)引擎或移動(dòng)支付引擎)來(lái)開(kāi)發(fā)他們的應(yīng)用程序。通常情況下,這些第三方庫(kù)是閉源代碼庫(kù),因此開(kāi)發(fā)商不能更改它們。有時(shí),第三方庫(kù)會(huì)給應(yīng)用程序帶來(lái)一定的安全問(wèn)題。例如,用于調(diào)試目的內(nèi)部日志打印可能會(huì)在用戶登錄和付款時(shí)泄漏憑據(jù)信息,或者是游戲引擎中一些存儲(chǔ)在本地的明文形式的資源和腳本有可能輕易為攻擊者所獲得。在本文中,我想和諸位分享一些近階段的研究成果;具體地說(shuō)是,使用鉤子技術(shù)來(lái)提供一種簡(jiǎn)單有效的保護(hù)方案以應(yīng)對(duì)某些針對(duì)Android應(yīng)用的離線攻擊。二、 An

2、droid應(yīng)用中普遍存在的安全問(wèn)題(一) Android應(yīng)用打包概述Android應(yīng)用程序通常是用Java編程語(yǔ)言編寫的。當(dāng)開(kāi)發(fā)人員有高性能需求或低級(jí)API訪問(wèn)時(shí),他們可以使用C/C+代碼并編譯為本機(jī)庫(kù),然后通過(guò)Java本機(jī)接口(JNI)調(diào)用它們。之后,Android SDK工具就會(huì)把所有已編譯的代碼、數(shù)據(jù)和資源文件打包到Android包(APK)中。Android應(yīng)用程序是以APK格式打包和發(fā)行的,其實(shí)這是一個(gè)標(biāo)準(zhǔn)的ZIP文件格式,可以使用任何ZIP工具解壓縮。一旦解壓縮,APK文件可能包含以下文件夾和文件(參考圖1)1.META-INF目錄· MANNIFEST.MF:

3、清單文件· CERT.RSA:應(yīng)用程序證書· CERT.SF:相應(yīng)于MANNIFEST.MF文件的資源和SHA-1 Digest清單2.classes.dex:編譯成DEX文件格式的Java類,為Dalvik虛擬機(jī)所理解和執(zhí)行3.lib:該目錄包含特定于處理器的軟件層的已編譯代碼,其下一般還包括如下子目錄:· armeabi:包含所有基于ARM*處理器的編譯代碼· armeabi-v7a:包含所有基于ARMv7及以上版本處理器的編譯代碼· x86:包含基于Intel® x86處理器的編譯代碼· mips:包含基于M

4、IPS處理器的編譯代碼4.assets:該目錄下包含應(yīng)用程序資源,可以通過(guò)AssetManager來(lái)檢索這個(gè)目錄5.AndroidManifest.xml: Android配置文件,描述了程序的名稱、版本、訪問(wèn)權(quán)限、應(yīng)用程序引用的庫(kù)文件等6.res:所有應(yīng)用程序資源都放置在此目錄下7.resources.arsc:該文件中包含預(yù)編譯資源圖1:一個(gè)典型的Android APK包中的內(nèi)容一旦程序包被安裝在用戶設(shè)備上,它的文件將被提取并放置在以下目錄中:1.整個(gè)應(yīng)用程序的包文件復(fù)制到路徑/data/app2.Classes.dex文件被提取和優(yōu)化,并將優(yōu)化后的文件復(fù)制到路徑/data/da

5、lvik-cache3.本機(jī)庫(kù)被提取并復(fù)制到路徑/data/app-lib/<package-name>4. 創(chuàng)建一個(gè)名為 /data/data/<package-name>的文件夾并分配給應(yīng)用程序用以存儲(chǔ)其私有數(shù)據(jù)。(二) Android開(kāi)發(fā)中的風(fēng)險(xiǎn)意識(shí)通過(guò)在上一節(jié)中分析的文件夾和文件結(jié)構(gòu),作為開(kāi)發(fā)人員必須應(yīng)該知道應(yīng)用程序中存在的幾個(gè)弱點(diǎn)。攻擊者可以利用這些弱點(diǎn)獲得大量的有價(jià)值的信息。例如,第一個(gè)脆弱點(diǎn)是,應(yīng)用程序往往都把游戲引擎所使用的原始數(shù)據(jù)資源存儲(chǔ)在assets文件夾中。這包括音頻和視頻材料、游戲邏輯腳本文件以及精靈和場(chǎng)景的紋理資源。因?yàn)锳n

6、droid應(yīng)用程序的包并不加密,所以攻擊者可以從應(yīng)用程序商店或另一個(gè)Android設(shè)備中通過(guò)獲得對(duì)應(yīng)的包以后進(jìn)而很容易地得到這些資源。另一個(gè)易受攻擊點(diǎn)是,針對(duì)根設(shè)備和外部存儲(chǔ)的脆弱的文件訪問(wèn)控制。攻擊者可以通過(guò)受害者設(shè)備的根特權(quán)來(lái)獲取應(yīng)用程序的私有數(shù)據(jù)文件,或者把應(yīng)用程序數(shù)據(jù)寫入例如SD卡這類外部存儲(chǔ)上。如果不很好保護(hù)私有數(shù)據(jù),攻擊者可以從該文件中獲得如用戶帳戶和密碼等信息。最后,調(diào)試信息可能是可見(jiàn)的。如果開(kāi)發(fā)人員忘記在發(fā)布應(yīng)用程序之前注釋掉有關(guān)調(diào)試代碼,攻擊者可以通過(guò)使用Logcat工具來(lái)檢索調(diào)試輸出信息。三、 鉤子技術(shù)概述(一) 何謂鉤子鉤子是一系列用于更改代碼技術(shù)的術(shù)

7、語(yǔ),用于修改原始代碼運(yùn)行序列的行為,其方式是通過(guò)在運(yùn)行時(shí)代碼段中插入一定的指令來(lái)實(shí)現(xiàn)。圖2展示了鉤子技術(shù)的基本實(shí)現(xiàn)流程。圖2:鉤子可以更改程序的運(yùn)行順序在這篇文章中,將研究?jī)煞N類型的鉤子技術(shù):1.符號(hào)表重定向通過(guò)分析動(dòng)態(tài)鏈接庫(kù)的符號(hào)表,我們可以找到所有的外部調(diào)用函數(shù)Func1() 的重定位地址。然后,我們把每個(gè)重定位地址修改到掛鉤函數(shù)Hook_Func1()的起始地址(請(qǐng)參見(jiàn)圖3)。圖3:符號(hào)表重定向流程示意圖2.內(nèi)聯(lián)重定向與符號(hào)表重定向必須修改每一個(gè)重定向地址不同的是,內(nèi)聯(lián)鉤子只覆蓋我們想要鉤住的目標(biāo)函數(shù)的起始字節(jié)(見(jiàn)圖4)。內(nèi)聯(lián)重定向比符號(hào)表重定向更健壯,因?yàn)樗谌魏螘r(shí)候只修改一次。缺點(diǎn)是

8、,如果在應(yīng)用程序中的任何地方調(diào)用原始函數(shù),那么它還會(huì)執(zhí)行被鉤住的函數(shù)中的代碼。所以,我們?cè)谥囟ㄏ蚝瘮?shù)中必須仔細(xì)地標(biāo)識(shí)調(diào)用者。圖4內(nèi)聯(lián)重定向的流程示意圖四、 實(shí)現(xiàn)鉤子因?yàn)锳ndroid操作系統(tǒng)基于Linux*內(nèi)核,因此許多Linux的研究技術(shù)都適用于安卓系統(tǒng)。本文中給出的詳細(xì)示例就是基于Ubuntu * 12.04.5 LTS。(一) 內(nèi)聯(lián)式重定向創(chuàng)建內(nèi)聯(lián)重定向的最簡(jiǎn)單方法是在函數(shù)的起始地址處插入JMP指令。當(dāng)代碼調(diào)用目標(biāo)函數(shù)時(shí),它將立即跳至重定向函數(shù)中。請(qǐng)參閱圖5中所給的示例。在主進(jìn)程中,代碼運(yùn)行func1()來(lái)處理一些數(shù)據(jù),然后返回到主進(jìn)程。這里,func1()的起始地址

9、是0xf7e6c7e0。圖5:內(nèi)聯(lián)掛鉤中使用前五個(gè)字節(jié)的函數(shù)來(lái)插入JMP指令內(nèi)聯(lián)鉤子注入過(guò)程會(huì)將地址中的前五個(gè)字節(jié)的數(shù)據(jù)替換成0xE9 E0 D7 E6 F7 。這個(gè)過(guò)程將創(chuàng)建一個(gè)跳轉(zhuǎn)指令,此指令會(huì)跳轉(zhuǎn)到地址0xF7E6D7E0,而這個(gè)地址正好是函數(shù)my_func1()的入口。于是,所有對(duì) func1()的代碼調(diào)用都將被重定向到my_func1()。輸入到my_func(1)的數(shù)據(jù)經(jīng)過(guò)一個(gè)預(yù)處理階段,然后將處理過(guò)的數(shù)據(jù)傳遞給func1()來(lái)完成原始過(guò)程。圖6展示了鉤住func1()后的代碼運(yùn)行序列,而接下來(lái)的圖7展示了建立鉤子后func1()的偽C代碼。圖6:使用鉤子:在func1()中插入m

10、y_func1()使用此方法,原始代碼不會(huì)意識(shí)到數(shù)據(jù)處理流程的變化。但是,更多的處理代碼被追加到原始函數(shù)func1()中。開(kāi)發(fā)人員可以使用這種技術(shù)在運(yùn)行時(shí)添加程序補(bǔ)丁。圖7:使用鉤子圖6的偽C代碼(二) 符號(hào)表重定向相對(duì)于內(nèi)聯(lián)重定向,符號(hào)表重定向更復(fù)雜。有關(guān)鉤子代碼必須解析整個(gè)符號(hào)表,處理所有可能的情況,一個(gè)接一個(gè)地搜索和替換重定位函數(shù)的地址。DLL(動(dòng)態(tài)鏈接庫(kù))中的符號(hào)表將非常不同,這取決于使用了什么樣的編譯器參數(shù)以及開(kāi)發(fā)人員調(diào)用外部函數(shù)的方式。為了研究有關(guān)符號(hào)表的所有情況,需要?jiǎng)?chuàng)建包含兩個(gè)使用不同編譯器參數(shù)的動(dòng)態(tài)庫(kù)的測(cè)試工程,它們分別是:1. 位置獨(dú)立代碼(PIC)對(duì)象

11、:libtest_PIC.so2. 非PIC對(duì)象:libtest_nonPIC.so圖8給出了測(cè)試程序的代碼執(zhí)行流程,以及l(fā)ibtest1()/libtest2()的源代碼(注意:它們幾乎具有完全相同的功能,除了使用不同的編譯器參數(shù)編譯外),還有程序的輸出。圖8測(cè)試項(xiàng)目的軟件工作流程函數(shù)printf()用于實(shí)現(xiàn)鉤子,它是打印信息到控制臺(tái)的最常用的函數(shù)。它定義在文件stdio.h中,而函數(shù)代碼位于庫(kù)文件glibc.so中。在libtest_PIC和libtest_nonPIC庫(kù)中,使用了三個(gè)外部函數(shù)調(diào)用約定:1.直接函數(shù)調(diào)用2.間接函數(shù)調(diào)用· 本地函數(shù)指針· 全局函

12、數(shù)指針圖9:libtest1()的代碼圖10:libtest2()的代碼,與libtest1()相同圖11:測(cè)試程序的輸出結(jié)果五、 libtest_nonPIC.so庫(kù)中的非PIC代碼研究一個(gè)標(biāo)準(zhǔn)的DLL對(duì)象文件是由多個(gè)節(jié)(section)組成。每一節(jié)都有它自己的作用和定義。例如,Rel.dyn節(jié)中就包含了動(dòng)態(tài)重定位表信息。文件的節(jié)信息可以通過(guò)命令 objdump -D libtest_nonPIC.so反編譯得到。在庫(kù)文件libtest_nonPIC.so的重定位節(jié)rel.dyn中(見(jiàn)圖12),共有四個(gè)地方包含了函數(shù)printf()的重定位信息。動(dòng)態(tài)重定位節(jié)中的每個(gè)條目包

13、括以下類型:1.偏移量Offset中的值標(biāo)識(shí)要調(diào)整的對(duì)象的位置。2.類型字段Type標(biāo)識(shí)重定位類型。R_386_32對(duì)應(yīng)于把符號(hào)的32位絕對(duì)地址置于指定內(nèi)存位置的重定位數(shù)據(jù),而R_386_PC32則對(duì)應(yīng)于把符號(hào)的32位PC相對(duì)地址置于指定內(nèi)存位置的重定位數(shù)據(jù)。3.Sym部分指向被引用的符號(hào)的索引。圖13展示了函數(shù)libtest1()的生成的匯編代碼。有紅色標(biāo)記的printf()的入口地址在圖12中重定位節(jié)rel.dyn中被標(biāo)記出來(lái)。圖12:庫(kù)文件libtest_nonPIC.so的重定位節(jié)信息圖13libtest1()的反匯編代碼以非PIC格式編譯為了把函數(shù)printf()重定向到另一個(gè)稱為hooked_printf()的函數(shù),掛鉤函數(shù)把hooked_printf()的地址寫入這四個(gè)偏移地址。圖14:語(yǔ)句printf("libtest1: 1st call to the original printf()n");的工作流程圖15:語(yǔ)句global_printf1("libtest1: global_printf1()n");的工作流程圖16:語(yǔ)句loc

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論