對(duì)于基本的內(nèi)存分析,我們可以使用 Android Studio 的內(nèi)置工具。它們?cè)?Android 監(jiān)視器選項(xiàng)卡上。如果需要轉(zhuǎn)儲(chǔ)內(nèi)存,請(qǐng)選擇需要分析的設(shè)備和應(yīng)用,單擊“轉(zhuǎn)儲(chǔ) Java 堆”。這將在 capture 目錄中創(chuàng)建一個(gè) hprof 文件,該目錄位于應(yīng)用程序的項(xiàng)目路徑上
注:我們可以通過(guò)使用ADT對(duì)客戶(hù)端內(nèi)存的訪問(wèn),來(lái)進(jìn)行查看各種內(nèi)存中未加密的敏感信息
ADT(Android Development Tools)在Eclipse編譯IDE環(huán)境中,需安裝ADT(Android Developer Tools)Plug-in,這是Android在Eclipse上的開(kāi)發(fā)工具。目前Android開(kāi)發(fā)所用的開(kāi)發(fā)工具主要有Android Studio 、intellij idea、Eclipse,在Eclipse編譯IDE環(huán)境中
Android Studio 是谷歌推出的一個(gè)Android集成開(kāi)發(fā)工具,基于IntelliJ IDEA. 類(lèi)似 Eclipse ADT,Android Studio 提供了集成的 Android 開(kāi)發(fā)工具用于開(kāi)發(fā)和調(diào)試
Android開(kāi)發(fā)工具(ADT,Android studio),下載地址:https://developer.android.com/studio/index.html
通過(guò)Android Studio工具中的Android Device Monitor 工具的“Heap dump”功能訪問(wèn)“堆內(nèi)存”的使用情況和內(nèi)存數(shù)據(jù)的變化,并檢查是否內(nèi)存中存在“用戶(hù)名”和“密碼”的” “cvv” 或 “key” 等重要信息是否泄露
注:Android Studio 3.0開(kāi)始棄用Android Device Monitor,雖然說(shuō)被“棄用”,但是不代表不支持,我們還是可以通過(guò)其他方式來(lái)使用Android Device Monitor,就是DDMS,大家之前看過(guò)博主同學(xué)文章的,應(yīng)該知道,不太清除的可以翻看的之前的文章,此處不過(guò)多講解
使用Heap Dump,獲取我們當(dāng)前正在運(yùn)行的容易收到攻擊的應(yīng)用程序的“快照”,然后“導(dǎo)出”文件擴(kuò)展名為“HPROF”的“二進(jìn)制”格式文件,其格式為“HPROF”。“Dalvik格式”,但我們需要將其轉(zhuǎn)換為“J2se HPROF”格式,以便“Java”可讀
Memory Monitor是什么?
在Android Studio(以下簡(jiǎn)稱(chēng)AS)中Android Monitor是一個(gè)主窗口,它包含了Logcat,、Memory Monitor、CPU Monitor、 GPU Monitor和Network Monitor。其中Memory Monitor可以輕松地監(jiān)視應(yīng)用程序的性能和內(nèi)存使用情況,以便于找到被分配的對(duì)象,定位內(nèi)存泄漏,并跟蹤連接設(shè)備中正在使用的內(nèi)存數(shù)量。Memory Monitor可以報(bào)告出你的應(yīng)用程序的內(nèi)存分配情況, 更形象的呈現(xiàn)出應(yīng)用程序使用的內(nèi)存。它的作用如下:
實(shí)時(shí)顯示可用的和分配的Java內(nèi)存的圖表
實(shí)時(shí)顯示垃圾收集(GC)事件
啟動(dòng)垃圾收集事件
快速測(cè)試應(yīng)用程序的緩慢是否與過(guò)度的垃圾收集事件有關(guān)
快速測(cè)試應(yīng)用程序崩潰是否與內(nèi)存耗盡有關(guān)
使用Memory Monitor之前要確保手機(jī)開(kāi)啟了開(kāi)發(fā)者模式和USB調(diào)試。
使用的步驟為:
運(yùn)行需要監(jiān)控的應(yīng)用程序
點(diǎn)擊AS面板下面的Android圖標(biāo),并選擇Monitors選項(xiàng)
Heap Dump是什么?
Heap Dump的主要功能就是查看不同的數(shù)據(jù)類(lèi)型在內(nèi)存中的使用情況。它可以幫助你找到大對(duì)象,也可以通過(guò)數(shù)據(jù)的變化發(fā)現(xiàn)內(nèi)存泄
運(yùn)行Android Device Monitor,并打開(kāi)InsecureBankv2 應(yīng)用程序
打開(kāi)InsecureBankv2 應(yīng)用程序后,會(huì)發(fā)現(xiàn)“Android Device Monitor”的“Device”中出現(xiàn)InsecureBankv2 應(yīng)用程序
單擊“Update HEAP”按鈕
在APP中的登錄界面輸入賬號(hào)密碼登錄的操作,然后點(diǎn)擊“Dump HPROF file”導(dǎo)出包含剛剛操作的堆內(nèi)存信息的文件,文件名默認(rèn)為當(dāng)前應(yīng)用程序名.hprof文件名命名:“com.android.insecurebankv2.hprof”
要對(duì)內(nèi)存轉(zhuǎn)儲(chǔ)進(jìn)行更高級(jí)的分析,需要使用Eclipse Memory Analyzer Tool (MAT)。它可作為 Eclipse 插件或獨(dú)立應(yīng)用程序使用。要分析 MAT 中的轉(zhuǎn)儲(chǔ),可使用 Android SDK 自帶的hprof-conv平臺(tái)工具
./hprof-conv memory.hprof memory-mat.hprof
MAT 提供了多種用于分析內(nèi)存轉(zhuǎn)儲(chǔ)的工具。例如,直方圖提供了從給定類(lèi)型中捕獲的對(duì)象數(shù)量的估計(jì)值,線(xiàn)程概覽顯示了進(jìn)程的線(xiàn)程和堆棧幀。支配樹(shù)提供有關(guān)對(duì)象之間保持活動(dòng)依賴(lài)關(guān)系的信息,以及可以使用正則表達(dá)式來(lái)過(guò)濾數(shù)據(jù)的結(jié)果
使用 MemoryAnalyzer(MAT)程序來(lái)檢查內(nèi)存,MAT有兩種安裝方式
一種安裝方式是將MAT當(dāng)做eclipse的插件進(jìn)行安裝:?jiǎn)?dòng)Eclipse --> Help --> Eclipse Marketplace,然后搜索Memory Analyzer,安裝,重啟eclipse即可
另外一種安裝方式是將MAT作為一個(gè)獨(dú)立的軟件進(jìn)行安裝:https://www.eclipse.org/mat/
Android Studio Profile與Leak Canary dump出來(lái)的內(nèi)存快照無(wú)法直接在MAT當(dāng)中打開(kāi),需要使用hprof-conv來(lái)轉(zhuǎn)換操作一下,這里我們使用“Appie”命令從“Android Device Monitor”獲取的“hprof”格式,格式轉(zhuǎn)換如下:
hprof-conv com.android.insecurebankv2.hprof test.hprof
打開(kāi)程序“MemoryAnalyzer.exe”并“導(dǎo)入”我們已轉(zhuǎn)換格式的文件“test.hprof”,如下:
點(diǎn)擊“Open Dominator Tree for entire hap”按鈕
然后,在窗口中檢查“dominator_tree”,發(fā)現(xiàn)有一個(gè)與我們剛剛操作的應(yīng)用程序相關(guān)的命名
不出意外我們?cè)谵D(zhuǎn)賬頁(yè)面找到了賬號(hào)和密碼,如下:
如果查看“Convert ByteCode”之后的“Source code”,“Class Dotransfer”的“Properties”類(lèi)似:
public class DoTransferextends Activity{ public static final String MYPREFS2 = "mySharedPreferences"; String acc1; String acc2; EditText amount; Button button1; EditText from; Button getAccounts; InputStream in ; JSONObject jsonObject; String number = "5554"; String passNormalized; EditText phoneNumber; String protocol = "http://"; BufferedReader reader; HttpResponse responseBody; String result; SharedPreferences serverDetails; String serverip = ""; String serverport = ""; EditText to; Button transfer; String usernameBase64ByteString;}
或使用OQL查詢(xún)語(yǔ)句來(lái)快速查詢(xún)內(nèi)存中的關(guān)鍵字,因?yàn)镸AT 支持一種類(lèi)似于 SQL 的查詢(xún)語(yǔ)言 OQL(Object Query Language)。OQL 使用類(lèi) SQL 語(yǔ)法,可以在堆中進(jìn)行對(duì)象的查找和篩選,比如如下:
Object Query Language studio是一個(gè) MAT 特性,它允許使用類(lèi)似 SQL 的語(yǔ)言從內(nèi)存轉(zhuǎn)儲(chǔ)中查詢(xún)對(duì)象。MAT允許我們通過(guò)在簡(jiǎn)單對(duì)象上調(diào)用 Java 方法來(lái)轉(zhuǎn)換它們,并且它提供了一個(gè)用于在 MAT之上構(gòu)建復(fù)雜工具的 API
SELECT * FROM java.lang.String
String在上面的示例中,內(nèi)存轉(zhuǎn)儲(chǔ)中的所有字符串對(duì)象都將被選中。結(jié)果將包括對(duì)象的類(lèi)、內(nèi)存地址、值和保留計(jì)數(shù)。要過(guò)濾這些信息并只查看每個(gè)字符串的值,如下查詢(xún)語(yǔ)句:
SELECT toString(object) FROM java.lang.String object
或者 SELECT object.toString() FROM java.lang.String object
MAT SQL 語(yǔ)法也支持原始數(shù)據(jù)類(lèi)型,所以可訪問(wèn)所有 char 數(shù)組的內(nèi)容:
SELECT toString(arr) FROM char[] arr
如果我們得到的結(jié)果與之前的結(jié)果相似,因?yàn)?String 和其它 Java 數(shù)據(jù)類(lèi)型只是原始數(shù)據(jù)類(lèi)型的包裝器。現(xiàn)在讓我們過(guò)濾結(jié)果,下面的示例SQL語(yǔ)句將選擇包含 RSA 密鑰的ASN.1 OID的所有字節(jié)數(shù)組,但給不表示我們給定的字節(jié)數(shù)組是包含 RSA(相同的字節(jié)序列可能是其它東西的一部分)這也是有可能的:
SELECT * FROM byte[] b WHERE toString(b).matches(".*1.2.840.113549.1.1.1.*")
如果我們覺(jué)得比較麻煩不想擇整個(gè)對(duì)象,可以使用一個(gè) SQL 語(yǔ)句來(lái)做查詢(xún),比如我們只想找到內(nèi)存中所有存在"password"字段的對(duì)象,如下:
SELECT password FROM ".*" WHERE (null != password)
MAT進(jìn)行分析內(nèi)存,可以嘗試的分析技巧:
通過(guò)一些關(guān)鍵字來(lái)快速查詢(xún),比如“password”、“pass”、“pin”、“secret”、“private”等
字符串、字符數(shù)組、字節(jié)數(shù)組等中的加密模式(如RSA、md5等加密)
已知的密碼,比如已知道某個(gè)后端的密鑰Key的關(guān)鍵字,然后通過(guò)關(guān)鍵字去內(nèi)存中搜索
... ...
在分析內(nèi)存是否泄露信息的時(shí)候,我們可能第一次查看內(nèi)存并不一定會(huì)有什么發(fā)現(xiàn),只需要更加耐心重復(fù)的多看幾次說(shuō)不定就有發(fā)現(xiàn)了,另外觀察特定內(nèi)存段(例如,字節(jié)數(shù)組)的變化方式說(shuō)不定會(huì)發(fā)現(xiàn)一些隱藏的比較深且不容易發(fā)現(xiàn)的敏感數(shù)據(jù)
編輯:黃飛
-
Android
+關(guān)注
關(guān)注
12文章
3936瀏覽量
127400 -
ADT
+關(guān)注
關(guān)注
0文章
11瀏覽量
9488
原文標(biāo)題:Android利用ADT獲取內(nèi)存中的敏感信息
文章出處:【微信號(hào):哆啦安全,微信公眾號(hào):哆啦安全】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論