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