利用IDA6.6进行apk dex代码动态调试
2016-03-07 16:12
495 查看
网上公开IDA6.6已经有一段时间,这个版本有个好处就是可以动态调试java代码。正好现在需要动态调试,所以顺便练习一下。
根据android的官方文档,如果要调试一个apk里面的dex代码,必须满足以下两个条件中的任何一个:
1.apk中的AndroidManifest.xml文件中的Application标签包含属性android:debuggable=”true”
2./default.prop中ro.debuggable的值为1
由于一般软件发布时都会把android:debuggable设置为false,所以要达成条件1需要反编译原apk,修改AndroidManifest.xml并进行重新打包,这样不仅麻烦,而且很多软件进行了加固,要破解很难。所以想办法满足第2个条件是个一劳永逸的办法。
由于default.prop是保存在boot.img的ramdisk中,这部分每次重新启动都会重新从rom中加载,所以要到目的必须修改boot.img中的ramdisk并重新刷到设备中。修改步骤如下:
具体可参考:/article/5236289.html
由于我们这篇文章的重点是如何动态调试dex代码,所以我们就假设该dex是可调试的。
![](http://images.cnitblog.com/blog/282719/201501/282322370508505.png)
图1 调试设置
![](http://images.cnitblog.com/blog/282719/201501/282322563319563.png)
图2 调试界面
如何查看寄存器的值呢?选中ida->debugger->use source level debugger,然后点击ida->debugger->debugger windows->locals打开本地变量窗口,就可以查看寄存器的值了。
如果变量的值出现“Bad type”的情况,如下图所示:
![](http://images2015.cnblogs.com/blog/282719/201512/282719-20151216202947474-1807225047.png)
可以按下述步骤解决:
点击“Debugger->Debugger windows->Watch view”,会弹出“Watch view”窗口:
![](http://images2015.cnblogs.com/blog/282719/201512/282719-20151216203030802-390400577.png)
然后在Watch view窗口中右击,选择“Add watch”:
![](http://images2015.cnblogs.com/blog/282719/201512/282719-20151216203213068-185984116.png)
然后在弹出的窗口中自己为变量添加一个类型,类似这样:
假设我们要设置v0寄存器值的类型为String类型,就在在弹出的对话框中输入(String)v0,点击“OK”就可以在Watch view窗口中看到变量值了。
![](http://images2015.cnblogs.com/blog/282719/201512/282719-20151216203336834-573367292.png)
注意:如果运行过程中一直显示如图3所示窗口,就需要关注一下你的手机屏幕,看是否是需要与用户进行交互了。
![](http://images.cnitblog.com/blog/282719/201501/282336344259428.png)
图3
参考文章:http://www.joenchen.com/archives/1196
原文地址: http://www.cnblogs.com/goodhacker/p/4257433.html
根据android的官方文档,如果要调试一个apk里面的dex代码,必须满足以下两个条件中的任何一个:
1.apk中的AndroidManifest.xml文件中的Application标签包含属性android:debuggable=”true”
2./default.prop中ro.debuggable的值为1
由于一般软件发布时都会把android:debuggable设置为false,所以要达成条件1需要反编译原apk,修改AndroidManifest.xml并进行重新打包,这样不仅麻烦,而且很多软件进行了加固,要破解很难。所以想办法满足第2个条件是个一劳永逸的办法。
由于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)
具体可参考:/article/5236289.html
由于我们这篇文章的重点是如何动态调试dex代码,所以我们就假设该dex是可调试的。
1.用ida打开apk文件,选择dex文件进行加载 2.设置debugger选项,Debugger->Debugger options->Set specific options,按如图1所示进行设置(adb路径也要设置),然后一路确定返回 3.找到要下断点的位置,光标移到要下断点的那一行,按f2下断点 4.手机开启调试选项,连接到电脑,运行apk 5.选中IDA pro窗口,按f9运行,如果出现如图2的画面,就说明设置成功,可以进行动态调试了。
![](http://images.cnitblog.com/blog/282719/201501/282322370508505.png)
图1 调试设置
![](http://images.cnitblog.com/blog/282719/201501/282322563319563.png)
图2 调试界面
如何查看寄存器的值呢?选中ida->debugger->use source level debugger,然后点击ida->debugger->debugger windows->locals打开本地变量窗口,就可以查看寄存器的值了。
如果变量的值出现“Bad type”的情况,如下图所示:
![](http://images2015.cnblogs.com/blog/282719/201512/282719-20151216202947474-1807225047.png)
可以按下述步骤解决:
点击“Debugger->Debugger windows->Watch view”,会弹出“Watch view”窗口:
![](http://images2015.cnblogs.com/blog/282719/201512/282719-20151216203030802-390400577.png)
然后在Watch view窗口中右击,选择“Add watch”:
![](http://images2015.cnblogs.com/blog/282719/201512/282719-20151216203213068-185984116.png)
然后在弹出的窗口中自己为变量添加一个类型,类似这样:
(Object*)v0 (String)v0 (char*)v0 (int)v0
假设我们要设置v0寄存器值的类型为String类型,就在在弹出的对话框中输入(String)v0,点击“OK”就可以在Watch view窗口中看到变量值了。
![](http://images2015.cnblogs.com/blog/282719/201512/282719-20151216203336834-573367292.png)
注意:如果运行过程中一直显示如图3所示窗口,就需要关注一下你的手机屏幕,看是否是需要与用户进行交互了。
![](http://images.cnitblog.com/blog/282719/201501/282336344259428.png)
图3
参考文章:http://www.joenchen.com/archives/1196
原文地址: http://www.cnblogs.com/goodhacker/p/4257433.html
相关文章推荐
- java设计模式——工厂模式
- python闭包学习
- c#---传址
- H264三种码率控制方法(CBR, VBR, CVBR)
- 2016.3.7 16.14复习篇之三(蓝桥杯恶补)
- MyEclipse如何从svn上下载项目
- Cpp--处理字符串的自定义类
- [Java] web输入框默认值处理
- Java实现的死锁示例
- C语言中改变字体颜色和背景的方法
- QT学习第一节
- Java类与对象的一些想法
- java 重写(Override)与重载(Overload)浅谈
- jdbc中next()的使用
- c#---产生随机数
- Python SQLalchemy ORM的使用(一)
- C#程序中使用LINQ to XML来查询XML格式数据的实例
- C++继承和多态
- Java中的ReentrantLock和synchronized两种锁定机制的对比
- python 控制流语句