偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

使用鉤子技術(shù)改進(jìn)Android程序安全性

譯文
移動(dòng)開發(fā)
本文屬于《使用鉤子技術(shù)改進(jìn)Android程序安全性》系列的下篇,我們將繼續(xù)探討使用鉤子技術(shù)改進(jìn)Android程序安全性的問題。

[[167296]]

本文屬于《使用鉤子技術(shù)改進(jìn)Android程序安全性》系列的下篇,我們將繼續(xù)探討使用鉤子技術(shù)改進(jìn)Android程序安全性的問題。

一、 libtest_PIC.so庫(kù)中的PIC代碼研究

如果對(duì)象是以PIC模式編譯的,那么重定位方式是不同的。通過觀察圖1所示的libtest_PIC.so庫(kù)文件的節(jié)信息,你會(huì)注意到函數(shù)printf()重定位信息位于兩個(gè)重定位節(jié)處:一個(gè)是rel.dyn節(jié),另一個(gè)是rel.plt節(jié)。這里使用了兩個(gè)新的重定位類型R_386_GLOB_DAT和R_386_JMP_SLOT;因此,應(yīng)該使用這樣的偏移地址來填充替代函數(shù)的32位絕對(duì)地址。

圖1︰libtest_PIC.so庫(kù)文件的重定位節(jié)

圖2顯示了非PIC模式編譯的函數(shù)libtest2()的匯編代碼。用紅色標(biāo)出的函數(shù)printf()的入口地址在圖1中的重定位節(jié)rel.dyn和rel.plt中指定。

圖2︰libtest2()的反匯編代碼——使用-PIC參數(shù)編譯而成

圖3:語句'printf("libtest2: 1st call to the original printf()\n");'的工作流程

圖4:語句'global_printf2("libtest2: global_printf2()\n");'的工作流程

圖5:語句local_printf ("libtest2: local_printf()\n");'的工作流程

從圖1-5中我們看到,當(dāng)使用PIC參數(shù)生成動(dòng)態(tài)庫(kù)時(shí),libtest2()中的代碼將跳轉(zhuǎn)到放在偏移地址0x1fe0、0x2010和0x2000處的地址,而這正是函數(shù)printf()的入口處。

二、 鉤子方案

如果鉤子模塊要攔截對(duì)printf()的調(diào)用并重定向到另一個(gè)函數(shù),那么,在鏈接器把動(dòng)態(tài)庫(kù)加載到內(nèi)存后,它應(yīng)該把重定向的函數(shù)地址寫入定義在重定位節(jié)中‘printf’符號(hào)的偏移量地址處。

為了把對(duì)printf()函數(shù)的調(diào)用替換成對(duì)重定向的hooked_printf()函數(shù)的調(diào)用(如圖6中的軟件流程圖中所示),應(yīng)該在對(duì)dlopen()和libtest()的調(diào)用之間實(shí)現(xiàn)一個(gè)鉤子函數(shù)。這個(gè)鉤子函數(shù)將首先取得符號(hào)printf的偏移量地址,此地址是從命名為rel.dyn的重定位節(jié)開始的。在本例中,這個(gè)地址值是0x1fe0。然后,鉤子函數(shù)把hooked_printf()函數(shù)的絕對(duì)地址寫入偏移量地址。之后,當(dāng)libtest2()中的代碼調(diào)用printf()時(shí),它將進(jìn)入到對(duì)hooked_printf()的調(diào)用。

圖6:鉤子函數(shù)攔截對(duì)printf()的調(diào)用并重定向到對(duì)hooked_printf()的調(diào)用。

綜合以前列出的所有可能的情形,圖7展示鉤子函數(shù)的完整的流程圖。main()函數(shù)中的變化部分使用圖8來描述。

圖7:ELF鉤子模塊的流程圖示意

圖8:建立鉤子后的main()函數(shù)中的代碼

程序的輸出顯示在圖9中,你可以看到當(dāng)?shù)谝淮螌?duì)libtest1()/libtest2()的調(diào)用執(zhí)行時(shí),函數(shù)內(nèi)部調(diào)用了printf()。當(dāng)再一次調(diào)用這兩個(gè)函數(shù)時(shí),在鉤子函數(shù)執(zhí)行之后,對(duì)printf()函數(shù)的調(diào)用被重定向到hooked_printf()函數(shù)。Hooked_printf()函數(shù)將字符串“is HOOKED”附加到正常打印字符串的末尾。圖10顯示了創(chuàng)建掛鉤后的程序執(zhí)行流程,與圖8所示的原流程進(jìn)行比較,你會(huì)注意到hooked_printf()函數(shù)被注入到了libtest1()和libtest2()中。

圖9:測(cè)試程序的輸出情況,printf()函數(shù)被鉤住。

圖10:在創(chuàng)建鉤子后的測(cè)試項(xiàng)目運(yùn)行流程示意圖。

三、 案例分析——Android應(yīng)用中基于鉤子的保護(hù)方案

基于在前面幾節(jié)中鉤子技術(shù)的研究,我們開發(fā)出一個(gè)插件來幫助Android應(yīng)用程序開發(fā)人員改善其應(yīng)用程序的安全性。開發(fā)人員需要將僅有的一個(gè)Android 的本機(jī)庫(kù)添加到他們的項(xiàng)目并在程序啟動(dòng)時(shí)添加一行Java代碼來加載此本機(jī)庫(kù)。然后,此庫(kù)會(huì)把一些保護(hù)代碼注入到應(yīng)用程序中其他第三方庫(kù)中。該保護(hù)代碼將會(huì)有助于加密本地文件的輸入/輸出流,以及繞過函數(shù)__android_log_print()來避免通過對(duì)Logcat的調(diào)用來打印調(diào)試信息,進(jìn)而實(shí)現(xiàn)避免一些用戶隱私的泄漏。

為了驗(yàn)證該保護(hù)插件的有效性,我們寫了一個(gè)Android應(yīng)用程序來模擬一個(gè)包含第三方庫(kù)的應(yīng)用程序的情形。在此測(cè)試程序中,此第三方庫(kù)做兩件事情:

1.當(dāng)外部Java指令調(diào)用庫(kù)中的函數(shù)時(shí),它將通過調(diào)用__android_log_print()來打印一些信息。

2.在這個(gè)庫(kù)中,代碼會(huì)創(chuàng)建一個(gè)文件 (/ sdcard/data.dat)來把數(shù)據(jù)保存在本地存儲(chǔ)中而且沒有加密,然后再把它讀回來并將其打印在屏幕上。此操作是模擬應(yīng)用程序嘗試將一些敏感的信息保存在本地文件系統(tǒng)中的。

圖11-14中比較了放置鉤子前后測(cè)試程序的屏幕快照,Logcat輸出,以及在設(shè)備的本地文件系統(tǒng)中保存文件的內(nèi)容。

 

圖11:這里使用的Android*平臺(tái)是Teclast X89HD,Android 4.2.2

 

圖12:應(yīng)用程序輸出——在建立鉤子后沒有變化

 

圖13:Logcat輸出——在建立鉤子后輸出為空

 

圖14:在建立鉤子后在/sdcard中的本地文件'data.dat'已加密

如圖中所展示的,程序運(yùn)行流程在設(shè)置鉤子后與設(shè)置鉤子前完全一樣。然而,Logcat在設(shè)置鉤子后從本機(jī)庫(kù)中獲取不到輸出內(nèi)容。進(jìn)一步來看,本地文件的內(nèi)容不再以純文本格式存儲(chǔ)。

我們開發(fā)的插件可以幫助測(cè)試應(yīng)用程序提高安全性,以防止通過Logcat這樣的方式收集信息的惡意攻擊,以及防止對(duì)本地文件系統(tǒng)的離線攻擊。

四、 結(jié)論

歸納來看,鉤子技術(shù)可以應(yīng)用在許多開發(fā)領(lǐng)域,從而提供對(duì)Android應(yīng)用程序的無縫安全保護(hù)。進(jìn)一步來看,基于鉤子的保護(hù)方案不僅可以應(yīng)用在安卓系統(tǒng),還可以擴(kuò)大到其他操作系統(tǒng),如 Windows *、嵌入式 Linux或其他為物聯(lián)網(wǎng)設(shè)備設(shè)計(jì)的操作系統(tǒng)。它可以大大減少開發(fā)周期和降低維護(hù)成本。實(shí)戰(zhàn)應(yīng)用中,開發(fā)人員可以開發(fā)他們自己的基于鉤子的安全方案或者使用市場(chǎng)上可用的專業(yè)的第三方安全解決方案。

五、 參考資料

1.Redirecting functions in shared ELF libraries,Apriorit Inc, Anthony Shoumikhin, 25 Jul 2013,http://www.codeproject.com/Articles/70302/Redirecting-functions-in-shared-ELF-libraries。

2. x86 API Hooking Demystified,Jurriaan Bremer,http://jbremer.org/x86-api-hooking-demystified/。

3.Android developer guide,http://developer.android.com/index.html。

4.Android Open Source Project,https://source.android.com/。

【51CTO譯稿,合作站點(diǎn)轉(zhuǎn)載請(qǐng)注明原文譯者和出處為51CTO.com】

責(zé)任編輯:李英杰 來源: 51CTO
相關(guān)推薦

2016-06-03 10:21:05

2013-06-05 10:37:06

OracleJava安全

2021-06-07 14:54:42

Chrome強(qiáng)化擴(kuò)展下載安全

2015-06-15 10:48:25

2009-02-12 09:55:28

2020-10-08 10:15:15

LynisLinux系統(tǒng)安全

2017-07-27 19:35:34

2024-06-11 08:00:00

.NET開發(fā)網(wǎng)絡(luò)攻擊

2009-11-30 09:41:38

2023-05-18 14:43:35

2009-12-10 10:20:04

2022-06-22 09:00:00

安全編程語言工具

2011-02-13 14:36:35

2013-02-18 16:12:55

2011-11-03 09:41:35

Android簽名安全性

2020-09-10 16:30:05

AI人工智能

2021-12-13 06:36:14

SpoolSploit安全漏洞滲透測(cè)試

2009-05-26 16:37:23

2023-07-30 15:00:21

2015-07-17 13:16:06

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)