0×03 apktool+ideaphp
正菜来了,apktool 2.0bete9版本推出了-d选项,专门用来重打包apk进行单步调试的,给力!apktool+idea无源码debug apkstep by step简直不要太好用,这也是我跟小波请教以后才弄好的,这个选项也是小波等人建议apktool做者这样作的,不由感叹一句,波神你为什么这么屌!html
3.1调试基础java
本小节内容引用自看雪论坛@火翼[CCG]的文章,原文连接:http://www.kanxue.com/bbs/showthread.php?p=1291716android
根据android的官方文档,若是要调试一个apk里面的dex代码,必须知足如下两个条件中的任何一个:shell
1.apk中的AndroidManifest.xml文件中的Application标签包含属性android:debuggable=”true”
2./default.prop中ro.debuggable的值为1
因为正常的软件发布时都不会把android:debuggable设置为false(固然也不排除某些很2的应用恰恰就是true),因此要达成条件1须要对app进行从新打包,这不只每次分析一个apk都重复操做,并且不少软件会对自身进行校验,重打包后执行会被检测到,因此想办法知足第2个条件是个一劳永逸的办法。app
因为default.prop是保存在boot.img的ramdisk中,这部分每次从新启动都会从新从rom中加载,因此要到目的必须修改boot.img中的ramdisk并从新刷到设备中。修改步骤以下(我没试过,有兴趣的倒腾下):eclipse
1.从Google官方网站下载到boot.img
2.使用工具(abootimg,gunzip, cpio)把boot.img彻底解开,获取到default.prop
3.修改default.prop
4.把修改后的文件从新打包成boot_new.img
5.使用fastboot工具把boot_new.img刷入设备(fastboot flash boot boot_new.img)
3.2调试方法ide
这里咱们仍是用第一种方法来进行测试:工具
1.下载apktool2.0b9版本,下载地址:http://connortumbleson.com/2014/02/06/apktool-2-0-0-beta-9-released/测试
2.使用apktool反编译apk:
java -jar apktool_2.0.0b9.jar d -d xxx.apk -o out
加上-d选项以后反编译出的文件后缀为.java,而不是.smali,每一个.java文件立马都伪形成了一个类,语句全都是“a=0;”这一句,smali语句成为注释,小伙伴们本身看看打开就知道了,作这些都是为了后面欺骗idea、eclipse、androidstudio这些ide的;
3.加入android:debuggable=”true”选项;
4.重打包apk,必定记得也使用-d选项:
java -jar apktool_2.0.0b9.jar b -d out -o debug.apk
5.对apk进行签名并安装apk到调试设备(这个不用我说怎么操做吧);
6.下载安装并打开idea,新建一个空的java项目,本例中项目名为“DebugOnly”,将apk反编译后的smali目录下的全部文件拷贝到刚才新建的java项目的src/目录下,刷新,如图6;
图 6拷贝文件
7.打开androiddevice monitor(终端下敲命令monitor或者ddms),终端下运行命令:adb shell am start -D -n {Package Name}/.{Activity},运行效果如图7;
图 7命令运行效果
此时在调试设备上会显示等待调试器接入:
图 8调试设备状态
8.从androiddevice monitor上发现须要调试的程序已经显示在列表里面了,记下端口号,本例中为8700;
图 9 android device monitor
9. 新建远程调试:依次点击run->edit configuration->“+”号->Remote,选中第6步中新建的项目,填写第8步中得到的端口号,如图10;
图 10 debug设置
10.找到相应位置设置断点(在想设断点的位置先后多设置几个断点),点击run->debug->unnamed,其中unnamed是第9步中新建的远程调试的名字;
图 11远程调试名字
11.不出意外的话,小伙伴们应该能看到如图12所示的画面,恭喜你,已经成功了!此时此刻兴奋之情简直能以言表哈~good luck! have fun! enjoy~
图 12 idea单步调试apk
0×04后语
另外,阿呆曾经提到一篇文章用jdb远程调试android程序的文章,连接为:http://resources.infosecinstitute.com/android-hacking-security-part-6-exploiting-debuggable-android-applications/,我没有尝试过,主要是我比较懒,用apktool+idea已经够用了,就没去倒腾,有兴趣的小伙伴请自行倒腾,别忘了分享!
最后,其实我也不肯定ida是否是真的不能以hex格式显示变量值,或许是我不会用ida咧;我也不肯定eclipse到底能不能看寄存器的值,单步按钮和快捷键到底能不能用,或许是我eclipse版本的问题咧;我也不肯定android studio到底能不能看到寄存器的值,或许是我android studio版本的问题咧,再或者我用的调试设备有问题咧,再或者个人脸有问题咧……以上问题,若是哪位小伙伴知道怎么解,跪求告知!