1. 為什么要學會動態(tài)調(diào)試Smali代碼?
為了減輕我們逆向分析的負擔枝笨!
Smali文件中代碼量是十分龐大的层宫,而且Smali語法也并不是那么容易就會明白,逆向分析APK嘴秸,試圖找到它的漏洞毁欣,面對大篇幅的Smali文件代碼,還有現(xiàn)如今基本上每一款商業(yè)級的App為了安全都會采用混淆和加殼策略岳掐,就算使用ApkTool等工具將APK反編譯成Smali文件凭疮,生成的Smali代碼還是一堆諸如:a,b串述,c执解,d.....等無用的類、函數(shù)纲酗、變量衰腌。可能完全找不到實現(xiàn)程序功能的“真正”代碼觅赊!因此采用動態(tài)調(diào)試的方法右蕊,以打斷點的方式來逐步調(diào)試Smali代碼是勢在必行的一個技能。動態(tài)調(diào)試也是逆向的基本技能吮螺!
2. 動態(tài)調(diào)試Smali代碼總結
參考鏈接(建議查看此教程饶囚,自己搭建環(huán)境進行Smali代碼的動態(tài)調(diào)試)
(1) 知識點兒
- 遠程調(diào)試的前題是:確認調(diào)試APK的AndroidManifest.xml文件中,<application>標簽的android:debuggable屬性為true鸠补。
- DDMS
Dalvik Debug Monitor Serivce萝风,Dalvik調(diào)試監(jiān)控服務,為Android SDK提供的一款擁有監(jiān)控Dalvik虛擬機的調(diào)試軟件紫岩,啟動:打開Andorid SDK選擇Tools>Android>Android Device Monitor规惰。 - adb forward命令
用于創(chuàng)建一個端口映射,將本地端口(本地PC端口)泉蝌,映射到遠程端口(測試軟件使用的手機)
例如這里用到的:adb forward tcp:8700 jdwp:5657 - JDWP
Java Debug Wire Protocol歇万,Java調(diào)試線程協(xié)議揩晴,定義了調(diào)試器(debugger)和被調(diào)試的 Java 虛擬機(target vm)之間的通信協(xié)議。
為什么使用JDWP協(xié)議堕花?
Dalvik虛擬機會啟動一個JDWP線程文狱,用于遠程調(diào)試。遠程調(diào)試器可以通過JDWP端口號缘挽,調(diào)試指定進程瞄崇。每個可調(diào)試的進程的PID就是其JDWP的端口號『韭可以使用adb jdwp命令查看所有可以調(diào)試的進程PID(需要使用ctrl + c退出)苏研。
- 在.method字段,使用"Find Usage"功能腮郊,可以定位該方法的所有調(diào)用者摹蘑。
- 在方法類型上,使用"Declaration"轧飞,可以定位方法的定義處衅鹿。
(2) 動態(tài)調(diào)試基本流程
a. 首先使用ApkTool工具反編譯APK文件,得到Smali文件过咬。
b. 然后使用AS打開反編譯APK生成的文件夾大渤。并將Smali文件,設置成Source Root 文件掸绞。
c. 然后創(chuàng)建遠程調(diào)試(調(diào)試的本地端口一般為8700)
d. 然后啟動應用:
adb shell am start -D -n 主活動路徑/主活動泵三,在Android Device Monitor查看端口號和程序的PID。
e. 然后綁定端口:adb forward tcp:8700 jdwp:5657
f. 如果調(diào)試過程中衔掸,修改了代碼烫幕。需要使用apktool重新打包,重新安裝敞映。之后重復6步驟较曼,開始調(diào)試。
g. 調(diào)試結束后振愿,建議使用adb forward --remove-all命令诗芜,清理端口綁定。
(3) 注意
-
如果先查打開DDMS查看端口埃疫,再去設置進程debug,進程的pid會變孩哑,此時會出現(xiàn)錯誤提示:
報錯1 -
如果未開啟端口轉發(fā)栓霜,則會出現(xiàn)如下錯誤:
報錯2