国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

使用鉤子技術改進Android程序安全性(上篇)

譯文
移動開發
在本文中,我想和諸位分享一些近階段的研究成果;具體地說是,使用鉤子技術來提供一種簡單有效的保護方案以應對某些針對Android應用的離線攻擊。

一、 簡介

在Android開發世界中,開發人員通常利用第三方庫(例如游戲引擎,數據庫引擎或移動支付引擎)來開發他們的應用程序。通常情況下,這些第三方庫是閉源代碼庫,因此開發商不能更改它們。有時,第三方庫會給應用程序帶來一定的安全問題。例如,用于調試目的內部日志打印可能會在用戶登錄和付款時泄漏憑據信息,或者是游戲引擎中一些存儲在本地的明文形式的資源和腳本有可能輕易為攻擊者所獲得。

[[167107]]

在本文中,我想和諸位分享一些近階段的研究成果;具體地說是,使用鉤子技術來提供一種簡單有效的保護方案以應對某些針對Android應用的離線攻擊。

二、 Android應用中普遍存在的安全問題

(一) Android應用打包概述

Android應用程序通常是用Java編程語言編寫的。當開發人員有高性能需求或低級API訪問時,他們可以使用C/C++代碼并編譯為本機庫,然后通過Java本機接口(JNI)調用它們。之后,Android SDK工具就會把所有已編譯的代碼、數據和資源文件打包到Android包(APK)中。

Android應用程序是以APK格式打包和發行的,其實這是一個標準的ZIP文件格式,可以使用任何ZIP工具解壓縮。一旦解壓縮,APK文件可能包含以下文件夾和文件(參考圖1)︰

1.META-INF目錄

  • MANNIFEST.MF:清單文件
  • CERT.RSA:應用程序證書
  • CERT.SF:相應于MANNIFEST.MF文件的資源和SHA-1 Digest清單

2.classes.dex:編譯成DEX文件格式的Java類,為Dalvik虛擬機所理解和執行

3.lib:該目錄包含特定于處理器的軟件層的已編譯代碼,其下一般還包括如下子目錄:

  • armeabi:包含所有基于ARM*處理器的編譯代碼
  • armeabi-v7a:包含所有基于ARMv7及以上版本處理器的編譯代碼
  • x86:包含基于Intel® x86處理器的編譯代碼
  • mips:包含基于MIPS處理器的編譯代碼

4.assets:該目錄下包含應用程序資源,可以通過AssetManager來檢索這個目錄

5.AndroidManifest.xml: Android配置文件,描述了程序的名稱、版本、訪問權限、應用程序引用的庫文件等

6.res:所有應用程序資源都放置在此目錄下

7.resources.arsc:該文件中包含預編譯資源

 圖1:一個典型的Android APK包中的內容

一旦程序包被安裝在用戶設備上,它的文件將被提取并放置在以下目錄中:

1.整個應用程序的包文件復制到路徑/data/app

2.Classes.dex文件被提取和優化,并將優化后的文件復制到路徑/data/dalvik-cache

3.本機庫被提取并復制到路徑/data/app-lib/<package-name>

4. 創建一個名為 /data/data/<package-name>的文件夾并分配給應用程序用以存儲其私有數據。

(二) Android開發中的風險意識

通過在上一節中分析的文件夾和文件結構,作為開發人員必須應該知道應用程序中存在的幾個弱點。攻擊者可以利用這些弱點獲得大量的有價值的信息。

例如,第一個脆弱點是,應用程序往往都把游戲引擎所使用的原始數據資源存儲在assets文件夾中。這包括音頻和視頻材料、游戲邏輯腳本文件以及精靈和場景的紋理資源。因為Android應用程序的包并不加密,所以攻擊者可以從應用程序商店或另一個Android設備中通過獲得對應的包以后進而很容易地得到這些資源。

另一個易受攻擊點是,針對根設備和外部存儲的脆弱的文件訪問控制。攻擊者可以通過受害者設備的根特權來獲取應用程序的私有數據文件,或者把應用程序數據寫入例如SD卡這類外部存儲上。如果不很好保護私有數據,攻擊者可以從該文件中獲得如用戶帳戶和密碼等信息。

最后,調試信息可能是可見的。如果開發人員忘記在發布應用程序之前注釋掉有關調試代碼,攻擊者可以通過使用Logcat工具來檢索調試輸出信息。

三、 鉤子技術概述

(一) 何謂鉤子

鉤子是一系列用于更改代碼技術的術語,用于修改原始代碼運行序列的行為,其方式是通過在運行時代碼段中插入一定的指令來實現。圖2展示了鉤子技術的基本實現流程。

 圖2:鉤子可以更改程序的運行順序

在這篇文章中,將研究兩種類型的鉤子技術:

1.符號表重定向

通過分析動態鏈接庫的符號表,我們可以找到所有的外部調用函數Func1() 的重定位地址。然后,我們把每個重定位地址修改到掛鉤函數Hook_Func1()的起始地址(請參見圖3)。

 圖3:符號表重定向流程示意圖

2.內聯重定向

與符號表重定向必須修改每一個重定向地址不同的是,內聯鉤子只覆蓋我們想要鉤住的目標函數的起始字節(見圖4)。內聯重定向比符號表重定向更健壯,因為它在任何時候只修改一次。缺點是,如果在應用程序中的任何地方調用原始函數,那么它還會執行被鉤住的函數中的代碼。所以,我們在重定向函數中必須仔細地標識調用者。

 圖4︰內聯重定向的流程示意圖

四、 實現鉤子

因為Android操作系統基于Linux*內核,因此許多Linux的研究技術都適用于安卓系統。本文中給出的詳細示例就是基于Ubuntu * 12.04.5 LTS。

(一) 內聯式重定向

創建內聯重定向的最簡單方法是在函數的起始地址處插入JMP指令。當代碼調用目標函數時,它將立即跳至重定向函數中。請參閱圖5中所給的示例。

在主進程中,代碼運行func1()來處理一些數據,然后返回到主進程。這里,func1()的起始地址是0xf7e6c7e0。

 圖5:內聯掛鉤中使用前五個字節的函數來插入JMP指令

內聯鉤子注入過程會將地址中的前五個字節的數據替換成0xE9 E0 D7 E6 F7 。這個過程將創建一個跳轉指令,此指令會跳轉到地址0xF7E6D7E0,而這個地址正好是函數my_func1()的入口。于是,所有對 func1()的代碼調用都將被重定向到my_func1()。輸入到my_func(1)的數據經過一個預處理階段,然后將處理過的數據傳遞給func1()來完成原始過程。圖6展示了鉤住func1()后的代碼運行序列,而接下來的圖7展示了建立鉤子后func1()的偽C代碼。

 圖6:使用鉤子:在func1()中插入my_func1()

使用此方法,原始代碼不會意識到數據處理流程的變化。但是,更多的處理代碼被追加到原始函數func1()中。開發人員可以使用這種技術在運行時添加程序補丁。

 圖7:使用鉤子——圖6的偽C代碼

(二) 符號表重定向

相對于內聯重定向,符號表重定向更復雜。有關鉤子代碼必須解析整個符號表,處理所有可能的情況,一個接一個地搜索和替換重定位函數的地址。DLL(動態鏈接庫)中的符號表將非常不同,這取決于使用了什么樣的編譯器參數以及開發人員調用外部函數的方式。

為了研究有關符號表的所有情況,需要創建包含兩個使用不同編譯器參數的動態庫的測試工程,它們分別是:

1. 位置獨立代碼(PIC)對象:libtest_PIC.so

2. 非PIC對象:libtest_nonPIC.so

圖8給出了測試程序的代碼執行流程,以及libtest1()/libtest2()的源代碼(注意:它們幾乎具有完全相同的功能,除了使用不同的編譯器參數編譯外),還有程序的輸出。

 圖8︰測試項目的軟件工作流程

函數printf()用于實現鉤子,它是打印信息到控制臺的最常用的函數。它定義在文件stdio.h中,而函數代碼位于庫文件glibc.so中。

在libtest_PIC和libtest_nonPIC庫中,使用了三個外部函數調用約定:

1.直接函數調用

2.間接函數調用

  • 本地函數指針
  • 全局函數指針

 圖9:libtest1()的代碼

 圖10:libtest2()的代碼,與libtest1()相同

 圖11:測試程序的輸出結果

五、 libtest_nonPIC.so庫中的非PIC代碼研究

一個標準的DLL對象文件是由多個節(section)組成。每一節都有它自己的作用和定義。例如,Rel.dyn節中就包含了動態重定位表信息。文件的節信息可以通過命令 objdump -D libtest_nonPIC.so反編譯得到。

在庫文件libtest_nonPIC.so的重定位節rel.dyn中(見圖12),共有四個地方包含了函數printf()的重定位信息。動態重定位節中的每個條目包括以下類型:

1.偏移量Offset中的值標識要調整的對象的位置。

2.類型字段Type標識重定位類型。R_386_32對應于把符號的32位絕對地址置于指定內存位置的重定位數據,而R_386_PC32則對應于把符號的32位PC相對地址置于指定內存位置的重定位數據。

3.Sym部分指向被引用的符號的索引。

圖13展示了函數libtest1()的生成的匯編代碼。有紅色標記的printf()的入口地址在圖12中重定位節rel.dyn中被標記出來。

 圖12:庫文件libtest_nonPIC.so的重定位節信息 

 圖13︰libtest1()的反匯編代碼以非PIC格式編譯

為了把函數printf()重定向到另一個稱為hooked_printf()的函數,掛鉤函數把hooked_printf()的地址寫入這四個偏移地址。

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

 圖15:語句global_printf1("libtest1: global_printf1()\n");的工作流程

 圖16:語句local_printf("libtest1: local_printf()\n");的工作流程

如圖14-16所示的,當鏈接器把動態庫加載到內存時,它首先找到重新定位的符號printf的名稱,然后將printf的真實地址寫入相應的地址(偏移量0x4b5、 0x4c2、0x4cf和0x200c)。這些相應的地址在重定位節rel.dyn中定義。之后,libtest1()中的代碼便可以正確地跳轉到printf()函數處。

【51CTO譯稿,合作站點轉載請注明原文譯者和出處為51CTO.com】

責任編輯:李英杰 來源: 51CTO
相關推薦

2016-06-12 11:53:27

2013-06-05 10:37:06

OracleJava安全

2018-10-18 14:07:01

2020-10-08 10:15:15

LynisLinux系統安全

2015-06-15 10:48:25

2021-06-07 14:54:42

Chrome強化擴展下載安全

2009-02-12 09:55:28

2009-11-30 09:41:38

2017-07-27 19:35:34

2024-06-11 08:00:00

.NET開發網絡攻擊

2023-05-18 14:43:35

2009-12-10 10:20:04

2011-02-13 14:36:35

2013-02-18 16:12:55

2011-11-03 09:41:35

Android簽名安全性

2022-06-22 09:00:00

安全編程語言工具

2020-09-10 16:30:05

AI人工智能

2021-12-13 06:36:14

SpoolSploit安全漏洞滲透測試

2010-09-16 11:14:50

2023-07-30 15:00:21

點贊
收藏

51CTO技術棧公眾號

波多野结衣一区二区| 黄网在线免费看| 狠狠色伊人亚洲综合成人| 国产999精品久久久| 免费h在线看| 欧美视频日韩视频在线观看| 含羞草激情视频| 久久九九99视频| 激情五月六月婷婷| 日韩avvvv在线播放| 99精彩视频在线观看免费| 日韩高清一级| 97视频国产在线| 日韩国产在线不卡视频| 中文字幕视频一区二区在线有码| 99在线视频影院| 欧美一级xxx| √新版天堂资源在线资源| 婷婷六月综合亚洲| 久久mv成人精品亚洲动漫| 91免费版在线| 久草在在线视频| 久久新电视剧免费观看| 国产精品专区在线| 99久久精品免费观看| av日韩在线看| 国产91精品精华液一区二区三区| 国产又大又长又粗又黄| 日韩黄色片在线观看| 日韩aⅴ视频一区二区三区| 亚洲永久字幕| 五月天亚洲综合| 激情综合色播激情啊| 白白操在线视频| 久久一区二区三区国产精品| 亚洲一二三区av| 亚洲精品国产精华液| 少妇精品放荡导航| 欧美在线综合视频| 在线观看男女av免费网址| 精品福利av导航| 欧美xxx网站| 日韩视频在线免费| 日韩第二十一页| 久久精品亚洲精品| 97精品久久| 国产精品亚洲美女av网站| 亚洲成人三区| 欧美少妇一区| 北条麻妃国产九九精品视频| 欧美日韩在线成人| 一区二区三区在线观看欧美| 日本免费一区二区三区最新| 日韩欧美色电影| 欧美jizz18| 国产精品日韩在线| 麻豆久久精品| 成人在线观看黄| 欧美在线观看一区| 免费观看成人性生生活片| 欧洲一区二区视频| 国产精品vip| 丁香色欲久久久久久综合网| 久久久国产精品不卡| 深夜视频在线免费| 精品亚洲男同gayvideo网站| 999久久久久久久久6666| 91免费在线视频网站| 蜜臀va亚洲va欧美va天堂| 999精品网站| 欧美午夜精品伦理| 午夜伦理福利在线| 日本精品视频在线播放| 久久午夜电影| 8848hh四虎| 欧美精品一区二区高清在线观看 | 亚洲久久一区| 日本在线视频www| 欧美伊人久久久久久久久影院| 韩日成人影院| 91情侣在线视频| xnxx国产精品| 亚洲www色| 国产精品久久999| 粉嫩嫩av羞羞动漫久久久 | 国产成人精品视频在线观看| 久久午夜精品一区二区| 国产精品一区二区三区久久久| 精品一区二区三区视频| 亚色视频在线播放| 国产亚洲精品日韩| 欧美人成在线| 污网站免费在线| 亚洲视频自拍偷拍| 欧美日韩精选| 成人av网页| 亚洲一级免费视频| 一本久久综合| 在线播放国产区| 中文字幕亚洲二区| 噜噜噜91成人网| 亚洲国产资源| 热久久视久久精品18亚洲精品| 国产一区二区三区美女| 欧美色综合一区二区三区| 欧美日本高清一区| 国产伦精品一区二区三区免费迷| 久草在现在线| 国产成人97精品免费看片| 成人爱爱电影网址| av中文字幕在线看| 久久久久久久久四区三区| 亚洲成人精品一区| 台湾色综合娱乐中文网| 久久久久久久久久久视频| 日韩亚洲欧美一区二区三区| 91一区在线| 全网国产福利在线播放| 久久精品亚洲精品| 国产乱国产乱300精品| av丝袜在线| 日韩免费电影一区二区三区| 欧美日韩国产美| 在线不卡亚洲| 69xxxx欧美| 精品国产乱码久久久久久108| 黑人巨大精品欧美一区二区免费| 国产成人调教视频在线观看 | 葵司免费一区二区三区四区五区| 日本欧洲一区| 2020久久国产精品| 日韩美女久久久| 狠狠色狠狠色综合婷婷tag| 男男视频在线观看网站| 国内免费精品永久在线视频| 成人在线视频免费观看| 国产aa视频| 国产精品男人的天堂| 一区二区三区四区av| 日韩av不卡一区| av一卡二卡| 国产又爽又黄的激情精品视频| 亚洲午夜电影在线| 欧美国产一级| 大胆av不用播放器在线播放| 精品久久久久亚洲| 日韩欧美国产小视频| 另类激情亚洲| 免费观看欧美大片| 国产精品69页| 日韩av免费看| 色噜噜狠狠成人中文综合| 欧美日韩福利| av资源网在线播放| 国内自拍在线观看| 欧美一级淫片播放口| 日韩欧美亚洲成人| 三级一区在线视频先锋 | 欧美另类videosbestsex日本| 亚洲日本中文字幕免费在线不卡| 懂色av中文字幕一区二区三区| 韩国三级大全久久网站| 91大神影片| 91精品综合久久久久久五月天| 91精品国模一区二区三区| 国产精品综合久久| 高潮按摩久久久久久av免费| 校园春色欧美| 亚洲一区二区三区精品动漫| 这里只有精品在线播放| 亚洲国产精品二十页| 欧美电影一二区| 国产探花视频在线观看| 久久视频这里有精品| 日韩免费观看网站| 欧美精品在线观看播放| 国产69精品一区二区亚洲孕妇| 国产精品45p| 国产51人人成人人人人爽色哟哟| 一区二区三区日韩视频| 高清一区二区三区四区五区| 色婷婷久久久综合中文字幕| 精品亚洲成av人在线观看| 日韩不卡在线视频| 欧美大片aaa| 人妻激情另类乱人伦人妻| 国产精品成人播放| 亚洲国产成人精品一区二区| 国产日韩欧美综合在线| 激情五月***国产精品| 国产精品一区二区精品| jyzzz在线观看视频| 亚洲国产精品久久久久婷蜜芽| 成人在线免费观看视视频| 在线观看成人黄色| 精品久久久久人成| 99久久伊人久久99| 久久国产欧美| 日韩电影在线视频| 麻豆国产一区|