前言
本文用eclipse主要是调试smali代码,不涉及原生程序,原生程序可以使用ida进行调试。
准备工作
1.crackeme02.apk(一个用于调试的app)
2.eclipse
3.apktool
4.signapk(用于签名重打包的apk)
5.相关环境(如jdk,模拟器或手机等等)
重打包apk
1.反编译apk
1
| apktool d -d crackme02.apk
|
此处使用-d参数,因为这样反编译出来的文件后缀是.java,而java文件才能被eclipse识别并调试。
2.首先到反编译输出的文件夹中的AndroidManifest.xml文件中,将android:debuggable属性设置为true
3.接着在MainActivity的OnCreate方法中添加调试等待,在onCreate方法下面一行添加:
1
| a=0;// invoke-static {}, Landroid/os/Debug;->waitForDebugger()V
|
4.保存修改的文件,重新打包,并签名。
1
| apktool b -d crackme02.apk
|
调试环境设置
1.在手机或模拟器上安装刚刚修改打包好的apk
2.将修改的源码导入eclipse中
3.以crackeme02.apk为例,
(1)在MainActivity.java的311行(即刚刚添加调试等待代码的那一行)设置断点
(2)在MainActivity$1.java的43行和51行设置断点(即onclick方法下面)
4.在DDMS窗口查看可调试程序的端口号,即最后一栏显示的端口号。
5.接下来将代码和调试程序关联。
Debug Configuration->Remote Java Application->Port 填刚刚看到的端口号。
调试实战
1.若ecplise的Debug窗口的内容都是Dalvik VM的内容,则退出app再重新进入,直到有显示MainActivity->onCreate的内容,这样才可以正常调试。
2.程序的简单功能是匹配用户名和注册码,我们想要做的就是破解注册码。运行调试(F8),填写用户名和随便写一个注册码,点击注册。
3.这时候程序会开始运行,跳转。接着可以单步跟踪,并且利用设置断点,让程序运行到我们想要到达的位置然后停下来,在窗口右边我们可以观察寄存器的数值。我们想要的注册码的值就可以通过调试观察得到。