安卓逆向_8 --- Android 調試工具 DDMS 和 Monitor ( 去掉 "車來了" app 的廣告 )

 

From:https://www.e-learn.cn/topic/3527658

Android SDK 中的 ddms 使用詳解:https://blog.csdn.net/x83853684/article/details/80643131

ADB、Android Monitor、DDMS、HierarchyViewer、MAT、SysTrace、TraceView 性能分析工具使用大全:
https://www.jianshu.com/p/c83f3669e529

 

嗶哩嗶哩( 去掉 "車來了" app 的廣告 )https://www.bilibili.com/video/BV1UE411A7rW?p=35

 

 

DDMS

 

1. DDMS 簡介

 

DDMS 的全稱是 Dalvik Debug Monitor Service。可以實現 IDE 與連接終端設備(包含 仿真器 真機 )的調試,DDMS 可以實現查詢終端設備運行狀態,終端設備進程狀態,線程狀態,文件系統,日誌信息(logcat)等。以及控制終端設備完成一些操作。還可以向目標機發送短信、打電話,發送地理位置信息等。可以像 gdb 一樣 attach 某一個進程調試。 SDK tools 目錄下提供了 ddms 的完整版,直接運行即可。總的來說它是一款性能分析工具,可以幫助開發者快速了APP的運行情況。具體可見 https://developer.android.com/studio/profile/monitor 。

 

DDMS 怎樣與調試器交互?

1,每一個 Android 應用都運行在一個 Dalvik 虛擬機實例裏,而每一個虛擬機實例都是一個獨立的進程空間。虛擬機的 線程機制,內存分配和管理,Mutex等等都是依賴底層操作系統而實現的。所有Android應用的線程都對應一個Linux線程,虛擬機因而可以更多的 依賴操作系統的線程調度和管理機制。 
2,DDMS 在 IDE與設備或模擬器之間的起着中間人的角色。 
3,DDMS 啓動時會與 adb 之間建立一個 device monitoring service 用於監控設備。當設備斷開或鏈接時,這個 service 就會通知DDMS。 
4,當一個設備鏈接上時,DDSM 和 ADB 之間又會建立 VM monitoring service 用於監控設備上的虛擬機。 
5,通過 ADB Deamon 與設備上的虛擬機的 debugger 建立鏈接,這樣 DDMS 就開始與虛擬機對話了。 

 

在安卓平臺上,每個應用都運行在自己的進程上,同時每個應用也都運行在自己的虛擬機(VM)上。每個VM公佈了唯一的端口號以供調試器連接。

當DDMS啓動後,會連接到adb。當有設備連接上,VM監測服務就在adb和DDMS之間創建,它會通知DDMS 設備上的VM是啓動了還是終止了。一旦VM是運行的,DDMS就獲取VM的進程ID(pid),通過adb和設備上的adb守護進程(adbd)建立到 VM調試器的連接。到此,DDMS就可以使用約定的線協議與VM通信。

DDMS給設備上的每個VM分配一個調試端口。通常,DDMS分配的第一個可調試端口號是8600,下一個是8601,依次往下類推。當調試器連接 到已分配的一個端口時,VM上的所有通信都會被關聯到調試器。一個調試器只能連接一個單獨的端口,但是DDMS同時可以處理多個連接的調試器。

默認的,DDMS也會監聽DDMS的“基本端口”(默認爲8700)。基本端口是一個端口轉發端口,可以通過8700端口接受來自VM所有調試端口的通信並可以發送信息到調試器。這就允許你將調試器連接到8700端口,然後可以調試所有設備上的虛擬機。在DDMS設備視圖下,轉發的通信可以被當前所 選進程終止。

接下來的屏幕截圖會在Eclipse中顯示標準的DDMS屏幕視圖。如果你是從命令行啓動的DDMS,截圖會略有不同,但絕大部分功能是相同的。注意這個特殊進程,com.android.email 它在模擬器上運行時的調試端口是8700,而分配給它的端口是8606。這就表明 DDMS 當前將 8606 端口轉發到靜態調試端口 8700。
 

 

DDMS 啓動 方法

DDMS 在 SDK 裏面的 tools 文件夾裏,下載 SDK 後可以直接進入 tools 文件夾,雙擊 ddms.bat 啓動,如下圖:

主界面(手機root後纔會顯示所安裝應用):

Android Device Monitor :DDMS、HierarchyViewer。

Monitor 可以看做 DDMS 和 HierarchyViewer(層次結構)的組合。

Android Device Monitor 已在 Android Studio 3.1 中棄用,並已從 Android Studio 3.2 中移除

 

 

2.DDMS( Monitor ) 功能詳解

 

首先 DDMS 被分爲三個部分。左上角爲 Device 面板,詳細羅列了與電腦相連的終端設備的信息。右上角爲詳細的功能選項卡,下方爲日誌信息以及終端信息.

 

2.1 Devices 面板

 

1,左邊顯示了所有當前能找到的所有模擬器或設備列表和每個設備當前正在運行的虛擬機列表。虛擬機是按程序的包命來顯示的。 
2,通過這些列表可以找到運行着想調試的activity的虛擬機。每個虛擬機旁邊的是“debugger pass-through”端口,鏈接到其中一個端口就會鏈接到設備上對應的虛擬機。不管如何,在用DDMS時,只需要鏈接到8700端口,因爲DDSM 轉發所有的通信到當前選擇的虛擬機。這樣,就不用在每次切換虛擬機是重新配置debugger端口。 
3,當一個正在運行的程序調用waitForDebugger()函數時,客戶端名字旁邊會顯示一個紅色的icon,知道debugger連上對 應的虛擬機,這是debugger會變成綠色。 
4,如果看到叉icon,着意味着DDMS用於不能打開虛擬機的端口而不能建立debugger與虛擬機建立連接。如果看到所有的虛擬機是這樣, 很可能是有另外一個DDSM實例在運行。 

 

這個面板包含了所有的與IDE相連的設備列表以及每個設備上運行的進程的列表,如下圖所示:

device 窗口列出了 模擬器(或 真機)中所有的進程,顯示進程時會顯示進程ID (上圖中online那一列顯示的即是終端上運行的進程的ID) 以及與進程相關聯的端口號,連接端口號從 8600 端口依次往下增加,8700 是 DDMS 接收所有連接終端返回信息的端口,即是 base 端口。Devices 面板頂端從左往右有多個按鈕,

上面一排的按鈕功能,可以把鼠標放上面會自動顯示按鈕說明。如果你沒有運行或調試程序的話,這些圖標是不可用的!

當你選中某個進程,並按下調試進程按鈕時,如果 eclipse 中有這個進程的代碼,那就可以進行源代碼級別的調試。有點像gdb attach。圖片抓取按鈕可以把當前android的顯示桌面抓到你的機器上,也是非常有用。

 

開始方法分析:

  • 1.在設備選項,選擇要進行方法分析的進程
  • 2.點擊 Start Method Profiling按鈕。
  • 3.與應用進行交互,開始要分析的方法
  • 4.點擊 Stop Method Profiling按鈕。DDMS停止分析應用並打開Traceview,它包含了在點擊Start Method Profiling和Stop Method Profiling之間方法分析收集到的信息.

 

下面一一分析這些按鈕的功能

1. Debug: 實現使用DDMS對代碼進行調試,使用該功能的前提是 IDE中具有該運行進程的源代碼,否則該按鈕爲灰色,功能無法使用.

2. Update heap: 實現對進程中的堆進行更新的操作。只有當選擇這個按鈕後,在右側的功能面板中的heap選項卡中就能夠看見當前進程的堆使用情況:

點擊 Cause GC 可以觸發虛擬機的垃圾回收機制。

3. Dump HPROF file: 將當前進程堆使用情況生成文檔,使用這個功能可以更加詳細的分析當前堆的情況,有利於查找內存泄等問題。

4. Cause GC: 觸發垃圾回收機制,可以點擊後查看當前進程的堆使用情況

5. Update thread: 這個功能與update heap一樣,當點擊了這個按鈕才能在右側面板的thread選項卡中查看當前進程的所用的線程運行狀態

6. Start Method Profiling: 開始進行方法分析。這個功能比較重要,後面單獨寫文章分析

7. Stop: 終止當前選中的進程。

8. Screen Capture: 截屏按鈕,捕獲當前設備的屏幕狀態,該功能具有一定的延時

 

2.2 功能面板

功能面板從左到右有多個選項卡分別是:

1. Threads: 這個不必多說,表示當前進程中的所有線程狀態。線程視圖列出了此進程的所有線程。 

ID:       虛擬機分配的唯一的線程ID,在Dalvik裏,它們是從3開始的奇數。 
Tid:     linux的線程ID,For the main thread in a process, this will match the process ID. 
Stauts:  線程狀態, 
running:  正在執行程序代碼 
sleeping:執行了Thread.sleep() 
monitor: 等待接受一個監聽鎖。 
wait:     Object.wait() 
native:  正在執行native代碼 
vmwait:  等待虛擬機 
zombie:  線程在垂死的進程 
init:    線程在初始化(我們不可能看到) 
starting:線程正在啓動(我們不可能看到) 
utime:   執行用戶代碼的累計時間 
stime:   執行系統代碼的累計時間 
name:    線程的名字 

2. Heap: 表示當前進程堆使用情況。展示一些堆的狀態,在垃圾回收其間更新。當選定一個虛擬機時, VM Heap視圖不能顯示數據,可以點擊右邊麪包上的帶有綠色的”Show heap updates”按鈕,然後在點擊”Cause GC “實施垃圾回收更新堆的狀態。 

3. Allocation Tracker: 分配跟蹤器,後面單獨寫文章分析。在這個視圖裏,我們可以跟蹤每個選中的虛擬機的內存分配情況。點擊”Start Tracking”後點擊”Get Allocations “就可以看到。 

4. NetWork Statistics: 網絡分析功能。

5. File Explorer: 瀏覽終端的文件系統,進行文件相關操作。通過 Device > File Explorer 就可以打開 File Explorer。這裏可以瀏覽文件,上傳上載刪除文件,當然這是有相應權限限制的( 只有 root 權限才能查看 )。 在這裏面可以進行將外部文件導入到終端中,或者將終端文件導出,或者刪除終端文件,具體操作是右上角三個按鈕:

文件操作還是比較重要的,比如一個應用涉及到了SQLite數據庫使用,此時可以使用這個功能,導出數據庫文件單獨分析

6. Emulator Control: 可以實現往模擬器中打電話,發送短信,發送地理位置座標等功能。

在這裏,可以模擬一些設備狀態和行爲。 
Telephony Status:改變電話語音和數據方案的狀態,模擬不同的網絡速度。 
TelePhony Actions:發送模擬的電話呼叫和短信到模擬器。 
Location Controls:發送虛擬的定位數據到模擬器裏,我們就可以執行定位之類的操作。可以收工的在Manual裏輸入經度緯度發送到模擬器,也可以通過 GPX和KML文件。 

有了AndroidStudio 如果啓動了模擬器,可以直接在模擬器上實現相關信息的發送而不需要藉助於DDMS

 

7. System Information: 這個選項卡里面可以查看終端的CPU負載以及內存使用情況。具體的試過就知道了。

 

2.3 LogCat and Console

這一部分就是系統運行產生的日誌信息以及終端打印的信息。比較關心的還是LogCat。

這裏的 LogCat 與 AndroidStudio 中的 LogCat 是一樣的。使用 LogCat 可以根據程序中的運行日誌判斷當前程序運行的狀態。終端設備一般運行較多的進程,每個進程運行都有大量的日誌產生。因此一般需要使用 過濾器過濾其他進程信息。過濾器在 Saved Filter 中的以添加過濾器:

如果指定要觀察某一個進程的日誌信息,那過濾器就使用PID(進程ID)進行過濾即可,進程ID可以在Devices面板中得到,過濾的等級根據自己代碼中寫的等級酌情考慮,這樣就能夠實現只是觀察一個進程的日誌信息。

 

 

 

去掉 "車來了" app 的廣告

 

首先使用 AndroidKiller 反編譯 "車來了" app ,找到 包名

然後 打開 monitor 過濾 com.ygkj.chelaile.standard 的 log,通過觀察 log 可以發現,log 中出現了 " 成功發送簡單上報廣告時間埋點 " 之類的信息,右鍵 -》 Fiter similar messages...  即可看到詳細信息,

複製 廣告的網址,然後在 AndroidKiller 中 全文件查找,並替換爲空,導致 拼接 的 URL 無法訪問,從而達到去掉廣告的效果:

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章