那些不靠谱的工具


先来说说那些不靠谱的工具,就是今天吭了我小半天的各种工具,看官上坐,待我细细道来。
IDA pro

IDA pro6.6之后加入了dex动态调试功能,一时间普天同庆、喜大普奔。兴奋之后你才会发现IDA这东西在动态调试方面真的是很挫,就算他是静态反编译之王,我也不得不说他的动态调试功能还非常需要加强。先说说使用ida调试dex的方法。

IDA pro调试dex流程:


1.  用apktool反编译apk,添加android:debuggable=”true”,重打包apk并签名
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


其实小生一直还是很支持eclipse的,毕竟伴我度过了无数不眠之夜和懵懂的年华,可是这次我真的有点小失望哈。由于使用apktool+eclipse和apktool+android studio的调试方法跟apktool+idea一样,调试方法后面一起说,这里我就纯吐槽了先。

当小伙伴们成功设置调试选项,带着嗨翻的心情进入调试界面的时候,我们看到了如图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作者这样做的,不禁感叹一句,波神你为何这么屌!

3.1调试基础

本小节内容引用自看雪论坛@火翼[CCG]的文章,原文链接:http://www.kanxue.com/bbs/showthread.php?p=1291716

根据android的官方文档,如果要调试一个apk里面的dex代码,必须满足以下两个条件中的任何一个:
1.  apk中的AndroidManifest.xml文件中的Application标签包含属性android:debuggable=”true”

2.  /default.prop中ro.debuggable的值为1

由于正常的软件发布时都不会把android:debuggable设置为false(当然也不排除某些很2的应用偏偏就是true),所以要达成条件1需要对app进行重新打包,这不仅每次分析一个apk都重复操作,而且很多软件会对自身进行校验,重打包后执行会被检测到,所以想办法满足第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)

3.2调试方法

这里我们还是用第一种方法来进行测试:

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、android studio这些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 命令运行效果

此时在调试设备上会显示等待调试器接入:

图 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 版权由原作者所有,仅仅是为了转载一下。

后面有空,亲自再针对每一种方式的工具进行调试细节的描述。

APK程序Dex文件无源码调试方法讨论的更多相关文章

  1. 1. Smalidea无源码调试android应用

    一.安装smalidea https://github.com/JesusFreke/smali/wiki/smalidea   1. 进入IntelliJ IDEA/Android Studio开始 ...

  2. JEB 无源码调试 以dvm smali字节码方式,Demo尝试

    关于调试器看不到进程,无法attach的问题,网上也有很多教程,基本是修改ro.debugable =1  ,ro.secure = 0 让adbd有root权限 attach到其他进程,涉及到要修改 ...

  3. android加固系列—4.加固前先学会破解,无源码调试apk

    [版权所有,转载请注明出处.出处:http://www.cnblogs.com/joey-hua/p/5138585.html] 项目关键java代码为,将tv设置为从jni读取的字符串,这里的破解内 ...

  4. JDBC 程序的常见错误及调试方法

    详细介绍:http://dev.mysql.com/doc/refman/5.5/en/error-handling.html http://dev.mysql.com/doc/refman/5.5/ ...

  5. mysql 源码调试方法

     http://blog.itpub.net/29254281/viewspace-1847415/ 其中吕海波老师分享的内容是 <调试Oracle二三例:调试技术在日常运维中的应用>其中 ...

  6. 无源码调试smali

    0x01    工具①Android Studio最新版.(用的1.5)②apktool尽量使用最新版的.(反编译本人用baksmali-2.1.3.jar)③smalidea插件.下载地址https ...

  7. 在Linux手动把文件转码的方法,防止乱码出现

    iconv -f utf-8 -t gb2312 report.html  >  report_test.html

  8. eclipse 使用jetty调试时,加依赖工程的源码调试方法

    [1] 添加source eclipse-->debug as-->debug configurations-->source [2]若source不起作用 重新编译一下,mvn c ...

  9. IDA动态调试Android的DEX文件

    Android程序的dex文件的动态调试确实是个大问题,网上也有一些教程但是不是特别的详细,今天用到了IDA动态调试Android的DEX文件,特此记录一下. IDA 6.6新添加了对dex文件的调试 ...

随机推荐

  1. POJ-2253(最短路变形+dijikstra算法+求解所有路径中所有最长边中的一个最小值)

    frogger POJ-2253 这题的代码特别像prim求解最小生成树的代码,其实两者本来也很像. 这里的d数组不再维护的起点到该点的最短距离了,而是路径中的最长距离. #include<io ...

  2. 10个顶级Python实用库,推荐你试试!

    为什么我喜欢Python?对于初学者来说,这是一种简单易学的编程语言,另一个原因:大量开箱即用的第三方库,正是23万个由用户提供的软件包使得Python真正强大和流行. 在本文中,我挑选了15个最有用 ...

  3. ZooKeeper 基本概念并介绍RPC中Netty和Zookeeper的使用

    前言 ZooKeeper 是一个分布式协调服务,可用于服务发现,分布式锁,分布式领导选举,配置管理等.Zookeeper提供一个类似Linux文件系统的属性结构,每个节点可存储少量的内存文件,并提供每 ...

  4. scrapy框架爬取图片并将图片保存到本地

    如果基于scrapy进行图片数据的爬取 在爬虫文件中只需要解析提取出图片地址,然后将地址提交给管道 配置文件中:IMAGES_STORE = './imgsLib' 在管道文件中进行管道类的制定: f ...

  5. 记一次jstack命令定位问题

    今天天气不错,但是赶上恶意加班心情就不爽,怀着不爽的心情干活,总能创造出更多的问题,这不,今天就自己挖了一个坑,自己跳进去了,好在上来了 经过是这样的,开始调试canal采集binlog时,由于添加了 ...

  6. POJ_1273 Drainage Ditches 【网络流】

    一.题面 Drainage Ditches 二.分析 网络流的裸题. 1 Edmonds-Karp算法 求解网络流其实就是一个不断找增广路,然后每次找到一条增广路后更新残余网络的一个过程. EK算法主 ...

  7. Codeforces 1015E1 Stars Drawing (Easy Edition)

    题面: 传送门 题目描述: 要求用十字星星来画题目给出的"星"图.如果不能用十字星星来画"星"图,输出-1:如果能,则输出要在图的哪个位置画相应大小的十字星图. ...

  8. python网络编程-TCP服务端的开发

    #TCP服务端开发 2 #方法说明 3 """ 4 bind(host,port)表示绑定端口号,host是ip地址,ip地址一般不进 行绑定,表示本机的任何一个ip地址 ...

  9. JVM之对象创建、对象内存布局、对象访问定位

    对象创建 类加载过后可以直接确定一个对象的大小 对象栈上分配是通过逃逸分析判定.标量替换实现的,即把不存在逃逸的对象拆散,将成员变量恢复到基本类型,直接在栈上创建若干个成员变量 选择哪种分配方式由Ja ...

  10. 根据数据渲染DOM树形菜单——中途感想

    根据数据渲染DOM树形菜单,这个需求做了几天了.一开始觉得用while也可以实现一层一层查找数据,但后来发现while还是做不到,因为我查找这个动作必须有进入有出来然后进入下一个条目,但while只能 ...