標籤:
1、工具介紹
使用工具
android killer:用於反編譯apk包,得到smali代碼
android studio:調試smali代碼工具,或者使用idea,android studio就是在idea的基礎上修改的
smalidea-0.03.zip: as外掛程式,需要安裝到android studio中 ,
模擬器或者或者真機:運行要調試的程式
樣本:使用網路上的某apk程式,
2、前期準備
2.1 手機或者模擬器安裝應用
adb instll GGNdkTest1.apk
2.2 使用android killer反組譯碼測試包GGNdkTest1包,產生smali檔案夾
2.3 android studio安裝smalidea-0.03外掛程式,點擊File->Settings->plugins->instal plugins from disk,選擇下載的zip包就行,不要解壓。安裝完成後,AS提示重啟生效,重啟即可
2.3 AS匯入工程,選擇上一步的smali目錄,一路next,最後結果如
3、調試步驟
3.1 配置AS調試配置,Run->Edit configurations,點擊+號,建立remote類型調試器,設定Name, 修改連接埠號碼,可以選擇被佔用的任意連接埠,本次設定為8800
3.2 在AS的終端以偵錯模式啟動應用,進程掛起,此時運行命令查看該應用的進程號為28881
3.3 設定連接埠轉寄,這條命令的含義可以認為是在本地8800連接埠與手機28881進程之間建立一條通道,當開始調試時,AS串連本地的8800連接埠,通過這條通道控製程序的運行
3.4 下斷點,為了清除起見,在左側欄滑鼠右鍵選擇顯示行號,在行號旁邊單擊即可下斷點,需要注意的是,smali並不是每一行都可以下斷點,當下斷點沒有成功時,選擇其他地方下斷點測試。
3.5 調試 run->debug選擇剛才新增的調試器,此時程式會斷在設定的斷點的行,調試器解密如下
左側debug欄最上面一行有運行、單步運行、進入函數、強制進入、跳出等按鈕,下面顯示的是調用棧
中間variables欄可以觀察變數的值
右側watch欄可以關心的寄存器,例如的v1。
4、總結
在網上搜尋了一些教程,什麼開啟ddms,設定8700或者什麼連接埠,再關閉ddms之類的,各種方法滿天飛,看的最迷茫的就是ddms的開啟關閉和連接埠的設定。
根據網上搜到的內容自己總結了下,如所示
adbd:運行在手機端,daemon進程,與adb server通訊,同時與手機端的debugger通訊,調試各個程式
adbServer:運行在PC,與adbd通訊,同時監聽5037連接埠。
DDMS: 1、串連5037連接埠。
2、監視每個進程,並為每個進程建立單獨的調試連接埠,例如8600、8601等等,各種調試器可以直接連接這些連接埠進行調試。
3、提供一個特殊調試連接埠8700,它可以接收8600、8601…這些連接埠的資料,並與手機的任何進程進行通訊。
3、自身提供一些手段可以調試每個進程。
Debugger:各種調試器,可以選擇串連8700或者其他每個進程單獨的調試連接埠。
知道了上述各個組件的作用,那麼一下幾種情境可以正常工作
1、開啟DDMS,調試器串連8700連接埠,不需要設定連接埠轉寄,可成功調試
2、開啟DDMS,調試器串連86**連接埠,不需要設定連接埠轉寄,可成功調試
3、不開啟DDMS,查看要調試的進程ID,設定連接埠轉寄(上述步驟3.3),可成功調試
前兩個比較容易理解,第三個也可以成功,有些不明白了就
先查看連接埠資訊
當執行完連接埠轉寄後,8800連接埠處於監聽狀態,並且和5037同輸入adb server進程
當開始調試時,AS進程串連到了adb的8800連接埠。
所以猜測是這樣,adb server 預設監聽5037連接埠,DDMS可以通過5037連接埠調試進程,調試器通過DDMS串連adb server。
當執行連接埠轉寄後,adb server監聽了另外一個連接埠8800,所以debugger可以直接連接該連接埠進行調試,而不需要經過DDMS
個人猜測,有錯誤的地方,還請大牛指正
Android調試系列—使用android studio調試smali代碼