一、hook的使用
hook是一種消息處理機制,也是處理消息的程序段,通過系統(tǒng)調(diào)用將此程序段載入系統(tǒng),每當(dāng)有特定消息發(fā)出時,在沒有到達目標(biāo)地址前,hook程序就已經(jīng)得到該消息,獲得了程序的控制權(quán),可以對消息進行相應(yīng)處理,可概括為在事件傳送到終點前截獲井監(jiān)控事件的傳輸。
Binder進程間通信機制是由C/C++代碼實現(xiàn)的,Android系統(tǒng)在應(yīng)用程序框架層中提供Binder進程間通信機制的Java接口,所以應(yīng)用程序Java層的代碼可以通過JNI機制來調(diào)用Binder的C/C++接口,實現(xiàn)進程間的通訊。部分惡意應(yīng)用程序直接通過與Binder的C/C++接口通訊來獲取系統(tǒng)服務(wù),繞過Java層對應(yīng)用程序框架層敏感API檢測。無論是來自Java層還是Native層對系統(tǒng)服務(wù)的調(diào)用,歸根結(jié)底是需要調(diào)用ioctl函數(shù),所以本文選取了“l(fā)ibbinder.so”中的ioctl函數(shù)進行hook,既可以實時監(jiān)測到通過應(yīng)用程序架構(gòu)層API獲取系統(tǒng)服務(wù)的行為,也可以監(jiān)測到通過native代碼獲取系統(tǒng)服務(wù)的行為。
常用Hook方案:
?Xposed
通過替換/system/bin/app_process程序控制zygote進程,使得app_process在啟動過程中會加載XposedBridge.jar這個jar包,從而完成對Zygote進程及其創(chuàng)建的Dalvik虛擬機的劫持。
原理:因為Android為每個進程都提供一個虛擬空間,并且每個進程都只能在該虛擬空間上運行,而在Android系統(tǒng)中,應(yīng)用程序進程都是由Zygote進程孵化出來的,Zygote進程是由Init進程啟動的。Zygote進程在啟動時就會創(chuàng)建一個Dalvik虛擬機實例,每當(dāng)它孵化一個新的應(yīng)用程序進程時,都會將這個Dalvik虛擬機實例復(fù)制到新的應(yīng)用程序進程里面去,從而使得每一個應(yīng)用程序進程都有一個獨立的Dalvik虛擬機實例。因此Xposed選擇替換app_process來控制zygote進程。
舉例:一個簡單的登入程序,登錄時輸入用戶名與密碼,hook之后就可以在DDMS中查看hook到的數(shù)據(jù),或者在Xposed日志中查看日志。
?
?
?
二、Android Studio Profiler
1、分析CPU活動
功能:實時檢查應(yīng)用的CPU使用率和線程活動,還可以檢查記錄的方法跟蹤數(shù)據(jù)、函數(shù)跟蹤數(shù)據(jù)、系統(tǒng)跟蹤數(shù)據(jù)的詳情。
記錄配置:
?System Trace:捕獲精細的詳細信息,以便您檢查應(yīng)用與系統(tǒng)資源的交互情況。
?Method and function traces:對于應(yīng)用進程中的每個線程,可以了解一段時間內(nèi)執(zhí)行了哪些方法 (Java) 或函數(shù) (C/C++),以及每個方法或函數(shù)在其執(zhí)行期間消耗的 CPU 資源。還可以使用方法和函數(shù)跟蹤數(shù)據(jù)來識別調(diào)用方和被調(diào)用方。使用這些信息來確定哪些方法或函數(shù)過于頻繁地被調(diào)用導(dǎo)致消耗大量資源。
主要部分:
(1)事件時間軸:顯示應(yīng)用中的 Activity 在其生命周期內(nèi)不斷轉(zhuǎn)換經(jīng)歷各種不同狀態(tài)的過程,并指示用戶與設(shè)備的交互,包括從鍵盤的輸入。
(2)CPU 時間軸:顯示應(yīng)用的實時 CPU 使用率以及應(yīng)用當(dāng)前使用的線程總數(shù)??梢酝ㄟ^沿時間軸的橫軸方向移動鼠標(biāo)來檢查歷史 CPU 使用率數(shù)據(jù)。
(3)線程活動時間軸:列出屬于應(yīng)用進程的每個線程,并使用下面列出的顏色在時間軸上指示它們的活動。記錄跟蹤數(shù)據(jù)后,您可以從此時間軸上選擇一個線程,以在跟蹤數(shù)據(jù)窗格中檢查其數(shù)據(jù)。
綠色:表示線程處于活動狀態(tài)或準(zhǔn)備使用 CPU。也就是說,線程處于正在運行或可運行狀態(tài)。
黃色:表示線程處于活動狀態(tài),但它正在等待一項 I/O 操作,然后才能完成它的工作。
灰色:表示線程正在休眠且沒有消耗任何 CPU 時間。 當(dāng)線程需要訪問尚不可用的資源時,就會出現(xiàn)這種情況。在這種情況下,要么線程主動進入休眠狀態(tài),要么內(nèi)核將線程置于休眠狀態(tài),直到所需的資源可用。
?
?
?
記錄跟蹤數(shù)據(jù):與應(yīng)用開始交互前,點擊Record開始記錄,完成后點擊Stop停止,然后顯示出其跟蹤信息。
?Interaction:沿著時間軸顯示用戶互動和應(yīng)用生命周期事件。
?Flame Chart:一個倒置的調(diào)用圖表,方法或函數(shù)由下往上進行調(diào)用
比如,如圖表示A調(diào)用D和B,D調(diào)用B1B2B3和C2,B調(diào)用C,B1B2B3調(diào)用C1C3
?
?
?
?Top Down:一個調(diào)用列表,顯示某方法或函數(shù)調(diào)用的方法或函數(shù)
?Bottom Up:一個調(diào)用列表,顯示調(diào)用某方法或函數(shù)的方法或函數(shù)
其中,Self表示方法或函數(shù)調(diào)用在執(zhí)行自己的代碼(而非被調(diào)用方的代碼)上所花的時間。Children表示方法或函數(shù)調(diào)用在執(zhí)行它的被調(diào)用方(而非自己的代碼)上所花的時間。Total表示方法的?Self?時間和?Children?時間的總和。這表示應(yīng)用在執(zhí)行調(diào)用時所用的總時間。
?Events:該表格列出了當(dāng)前所選線程中的所有調(diào)用。通過選擇表格中的某一行就可以在時間軸上導(dǎo)航到所選調(diào)用的開始時間和結(jié)束時間。這樣,就可以在時間軸上準(zhǔn)確定位事件。
?
?
?
?
?
導(dǎo)出或?qū)敫檾?shù)據(jù)
通過應(yīng)用插樁生成跟蹤日志,
使用Debug類進行插樁,可以更加精確的控制設(shè)備何時開始或停止記錄跟蹤信息。在Activity的onCreate(Bundle)中調(diào)用startMethodTracing();在onDestory()中調(diào)用stopMethodTracing()。
Debug.startMethodTracing("sample"); ?//自定義跟蹤文件為sample.trace
...
Debug.stopMethodTracing();
在每次調(diào)用startMethodTracing()時動態(tài)地對跟蹤日志進行重命名,以防新的跟蹤日志覆蓋舊的,達到保存多個日志的效果。假設(shè)在A類中進行插樁與日志的重命名。
A a = new A("dd_MM_yyyy_hh_mm_ss",Locale.getDefault());
String logDate = a.format(new Date());
Debug.startMethodTracing("sample-" + logDate);
可以通過Device File Explorer訪問設(shè)備上的跟蹤日志,然后導(dǎo)航至應(yīng)用的軟件包特定目錄找到?.trace?文件,使用adb pull path-on-device/sample.trace xxx/命令將名為sample.trace的跟蹤日志文件復(fù)制到xxx目錄,最后可以在CPU Profiler中導(dǎo)入跟蹤文件。
2、分析內(nèi)存使用情況
?
?
?
?
?
?
?
3、分析網(wǎng)絡(luò)活動
分析應(yīng)用的網(wǎng)絡(luò)Activity意義:當(dāng)應(yīng)用向網(wǎng)絡(luò)發(fā)送請求時,設(shè)備必須使用高功耗的移動或WLAN無線裝置來收發(fā)數(shù)據(jù)包。無線裝置不僅要消耗電力來傳輸數(shù)據(jù),而且還要消耗額外的電力來開啟并且不鎖定屏幕。
使用網(wǎng)絡(luò)性能剖析器,可以查找頻繁出現(xiàn)的短時網(wǎng)絡(luò)活動峰值,這些峰值意味著,某些應(yīng)用要求經(jīng)常開啟無線裝置,或要求無線裝置長時間不鎖定屏幕以處理集中出現(xiàn)的大量短時請求。
主要功能:
?1的區(qū)域可以進行拖動選擇時間軸的一部分來檢查網(wǎng)絡(luò)流量
?2中Connection View:列出了在時間軸上選定時段內(nèi)從應(yīng)用的所有 CPU 線程發(fā)送或接收的文件。對于每個請求,您可以檢查大小、類型、狀態(tài)和傳輸時長以及每個文件的發(fā)送或接收時間。
?
?
?
?Thread View:顯示您應(yīng)用的每個 CPU 線程的網(wǎng)絡(luò)活動。 可以在此視圖中檢查各網(wǎng)絡(luò)請求由應(yīng)用的哪些線程負責(zé)。
?
?
?從?Connection View?或?Thread View?中點擊請求名稱,可檢查有關(guān)已發(fā)送或已接收數(shù)據(jù)的詳細信息。點擊各個標(biāo)簽頁可查看響應(yīng)標(biāo)頭和正文、請求標(biāo)頭和正文或調(diào)用堆棧。
在?Response?和?Request?標(biāo)簽頁中,點擊?View Parsed?鏈接可顯示格式化文本,點擊?View Source?鏈接可顯示原始文本。
?
?
本文摘自 :https://www.cnblogs.com/