DDMS
DDMS(Dalvik Debug Monitor Server)就是动态调试的一个工具(不知Android L之后会不会改名--!)。DDMS提供文件浏览、Logcat、Method Profiling等功能。
定位关键代码
1.代码注入法
用Apktool反编译得到smali,查找onClick(),比如要找程序注册码,仔细阅读之后发现比对注册码与用户输入的函数
invoke-virtual {v1, v0},Ljava/lang/String;->equalsIgnoreCase(Ljava/lang/String;)Z
move=result v3
if-eqz v3, :cond_2
那么加入Log.v()来输出v0寄存器:
const-string v3, "SN"
invoke-static {v3, v0},Landroid/util/Log;->v(Ljava/lang/String;Ljava/lang/String;)I
然后用Apktool打包、签名,
用"adb logcat -s SN:v"输出SN。
2.栈追踪法
代码注入配合Logcat好用但是需要阅读大量反汇编代码来找「输出点」。
栈追踪法也属于注入的范畴。
比如要找一个Toast是啥时候被调用的,不用阅读太多反汇编代码,而是定位到Toast,然后在这一段之后加入
new Exception("print trace").printStackTrace();
对应smali在书上就不写了。
然后打包签名运行,
在CMD输入"adb logcat -s System.err:V *W"
会以堆栈的方式,先输出java.lang.Exception print trace
然后输出从程序启动到printStackTrace()执行期间所有被调用过的方法。
Chapter8——动态调试Android程序