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
個人猜測,有錯誤的地方,還請大牛指正