在上面一篇中已经讲到如何对apk进行反编译得到smali代码。但是有的时候会有这样的需求,在看smali代码的时候,不确定自己写的伪代码逻辑是不是正确的,特别是在逆向算法的时候。所以就会想到怎么使用Eclipse对smali进行调试。
1.反编译
首先反编译需要分析的apk文件,如下:
这里注意使用-d参数,生成的smali文件才是以java结尾的,才能被eclipse识别。
2.设置允许调试
找到AndroidManifest.xml文件,在application节点中设置属性android:debuggable=”true”。
并找到该app启动的第一个Activity。找到启动Activity的onCreate函数。
3.添加调试等待代码
在启动Activity的onCreate函数的位置添加等待调试的代码,当Activity启动的时候就会自动停在onCreate的位置等待调试器调试。
invoke-static {}, Landroid/os/Debug;->waitForDebugger()V
保持行前代码一致。
4.重新打包,签名。
5.安装,启动
安装新签名apk到设备。
adb install new.apk
然后启动apk,会发现apk启动后停在一个黑屏界面,也就是正在等待调试器附加的状态。
6.将java文件导入eclipse项目
删除out目录下面的build目录,新建eclipse Java Project项目,Use default location选项去掉,Location选择out文件夹,然后Next,把smali文件夹设为Source Folder,然后Finish。
在启动Activity onCreate方法后面下一个断点。
7.开始调试
打开eclipse的DDMS,可以看到刚刚打开的应用程序正在等待调试状态。
其中8684即为调试该应用程序的端口。
① Run -> Debug -> Debug Configurations
② 双击Remote Java Application,Host处默认localhost就行,Port填第10步得到的8684,然后Apply -> Debug。
注意上面的project要是刚刚新建的Java Project,否则不能正确关联smali代码!!!
然后Eclisep会自动进入调试模式,并停在我们下断点的地方,还可以看到变量的值是多少,是不是方便多了!
欢迎入群交流~~~ 群号:191212593