那些不靠谱的工具
IDA pro
IDA pro6.6之后加入了dex动态调试功能,一时间普天同庆、喜大普奔。兴奋之后你才会发现IDA这东西在动态调试方面真的是很挫,就算他是静态反编译之王,我也不得不说他的动态调试功能还非常需要加强。先说说使用ida调试dex的方法。
IDA pro调试dex流程:
2. 从apk文件中扣出class.dex文件,不管你用什么方法,7zip、unzip…whatever
3. 用ida打开这个dex文件,直到output window窗口显示“xxxx finished”
4. 设置debugger选项,debugger->debugger options->set specific options,按如图1所示进行设置,然后一路确定返回
5. 找到要下断点的位置,光标移到要下断点的那一行,按f2下断点
6. 手机开启调试选项,链接usb到电脑
7. 选中IDA pro窗口,按f9走起,不出意外的话应该会出现如图2的画面,成功啦~
图 1 ida debug配置
图 2 ida动态调试apk
触发断点,在watch view和Locals窗口都能看到内存变量的值,简直就是画美不看啊,是不是有点小兴奋?!我只能说高兴的太早了,小伙伴们还是太天真了,仔细观察下,就算你勾选了“Hex display”,你还是无法以hex格式显示变量的值,就是说不可显示字符你都看不到值是什么,而且我找了很久也没找到类似windbg、od、vc6、gdb、lldb那样以各种姿势或者命令直接查看某内存地址值的功能,然后就出现了如图3的画面……WTF!我特么忙活了半天居然还不如直接logcat来得痛快!
图 3 Locals窗口
apktool+eclipse
当小伙伴们成功设置调试选项,带着嗨翻的心情进入调试界面的时候,我们看到了如图4的画面,细细观察和各种尝试之后,我保证你的心里一定有一万头草泥马奔腾而过!!!。
图 4 eclipse单步调试apk
debug窗口表示命中第30行的断点
variables窗口没有任何本地变量的值,寄存器的值也没有
单步步入、单步步过等调试按钮都是灰色的,快捷键F5678都没反应
我就想知道这你让我怎么debug,难道我要设无限个断点,拼命f9来调试?就算是这样,我该去哪儿看变量的值?
apktool+android studio
android studio这个东西本来是蛮不错的,就是稍微有点卡,习惯了也还好。其实android studio本身就是用idea改的,但是好像给改挫了。调试方法还是后面再说,直接上成功挂载到调试界面的图,如图5。
图 5 android studio单步调试apk
可以看到现在程序停在哪一行,虽然不明显
本地变量能看到,但是寄存器还是木有啊
单步按钮还有单步快捷键都能用了,看起来好多了啊
我还是想说,问题是寄存器的值还是没法直观的看到啊,对于有强迫症的我还是无法接受这种设定啊,想当年vc6、od、windbg、gdb、lldb是多么的给力,多么的好用!
apktool+idea
正菜来了,apktool 2.0bete9版本推出了-d选项,专门用来重打包apk进行单步调试的,给力!apktool+idea无源码debug apk step by step简直不要太好用,这也是我跟小波请教之后才弄好的,这个选项也是小波等人建议apktool作者这样做的,不禁感叹一句,波神你为何这么屌!
本小节内容引用自看雪论坛@火翼[CCG]的文章,原文链接:http://www.kanxue.com/bbs/showthread.php?p=1291716
1. apk中的AndroidManifest.xml文件中的Application标签包含属性android:debuggable=”true”
2. /default.prop中ro.debuggable的值为1
由于default.prop是保存在boot.img的ramdisk中,这部分每次重新启动都会重新从rom中加载,所以要到目的必须修改boot.img中的ramdisk并重新刷到设备中。修改步骤如下(我没试过,有兴趣的倒腾下):
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)
这里我们还是用第一种方法来进行测试:
http://connortumbleson.com/2014/02/06/apktool-2-0-0-beta-9-released/
java -jar apktool_2.0.0b9.jar d -d xxx.apk -o out
加上-d选项之后反编译出的文件后缀为.java,而不是.smali,每个.java文件立马都伪造成了一个类,语句全都是“a=0;”这一句,smali语句成为注释,小伙伴们自己看看打开就知道了,做这些都是为了后面欺骗idea、eclipse、android studio这些ide的;
3.加入android:debuggable=”true”选项;
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 命令运行效果
图 8 调试设备状态
8.从android device 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~
本文转载自:http://www.kanxue.com/bbs/showthread.php?p=1338639 版权由原作者所有,仅仅是为了转载一下。
后面有空,亲自再针对每一种方式的工具进行调试细节的描述。