首页
论坛
专栏
课程

[安全资讯] [原创]QTrace动态逆向分析Android程序

2019-12-10 12:55 1164

[安全资讯] [原创]QTrace动态逆向分析Android程序

2019-12-10 12:55
1164

QTrace动态逆向分析Android程序

一、QTrace概述

     QTrace是Android软件动态分析工具,它就像一个X光扫描仪,实时打印一个类中所有函数的执行情况(比如函数堆栈,相关变量等), 同时还可以用UML序列图的方式展示程序的执行情况。

     可以借助QTrace来分析混淆的程序, 可以在混淆代码中快速的定位到相关的代码, 并理清代码的运行逻辑。

     QTrace(http://www.qtrace.top)下载地址:https://pan.baidu.com/s/1kkPZgRWepe_FIEWNAsO8sw

     (注:要动态分析程序,首先要保证程序可以Debug的, 或者需要root手机。如何将程序重新打包成可debug的或者root手机,网络上相关文档一大把,自己baidu一下, 这里不再赘述>

二、如何逆向分析

     逆向分析时,最麻烦的事情当然是程序被混淆了。一则包名被混淆了,所以无法知道该看那个类。 二则每个类的代码被混淆了,根本无法知道执行了那个函数。

下图为一个混淆后的程序,如果要分析一个功能,从类名根本无法判断该从那个文件开始分析。


    本文将演示QTrace如何解决这两个问题.

三、类文件的定位

1.定位当前Activity

    这个执行adb dumpsys就可以得到了。打开QTrace, 打开Terminal面板。

点击Current Activity图标:


2.根据类加载信息定位使用到的类

      定位到Activity往往还是不够的,毕竟Activity类文件只占了类文件的一小部分。分析一个功能,还需要看下它使用到了那些类。

由于Android与Java一样,对于一个要使用的类,都是需要使用时才加载的,所以可以根据加载的类,来分析一个功能执行时大概会调用那些相关的类。

查看类加载信息具体操作如下:

1.打开QTrace, 同时保证电脑ADB连接上手机

2.执行运行->调试进程,选择要调试的程序


3.打开控制台面板, 在该面板上可以看到类加载信息

下图就是执行了一个处理后,类的加载信息, 分析该功能,可以从如下类入手。


     注意:

1.类加载后,下次就不会加载了。第一次执行某个功能会提示类加载信息,第二次执行往往就不会提供类加载信息了。

2.之前执行别的功能,已经加载了某类,及时该功能需要这个类,也不会提示类加载信息。

     虽然,分析类加载有诸多限制,但是打印类加载信息成本很低的,所以还是一个非常有效的方法。

3.跟踪类实例化(跟踪new一个类)

     分析一个功能使用到了那些类,还有更精确的方法: 跟踪类的初始化。比如一个功能, 会使用到某些类, 同时会new来构造这些类实例。 如果能监视类的初始化,就能看到这个功能使用到了那些类。 该方案说起来简单,做起来缺不容易,如果用Android Studio, 则需要一个个打开类文件,然后在类的构造函数上打断点。解决QTrace则可以一步到位设置断点。

     具体方法如下:

1.打开QTrace, 同时保证电脑ADB连接上手机

2.执行运行->调试进程,选择要调试的程序

3.打开左侧''设备''面板.

该面板列出了,当前程序所有已经加载的类。​ 比如这个例子中,要监视a.开头的类,选择目录a, 执行右键菜单'实例初始化断点', 完成断点设置。


    断点的结果也还是在控制台查看


    QTrace可以批量的设置类的断点,不用一个个的设置。并且该方法开销不大,在一般性能的手机上测试,都不会出现手机卡顿。

四、函数的定位

     上一节讨论了定位使用到的类的方法。这一节会进一步的讨论,如何定位使用到的函数。比如点击一个Button, 到底执行那些函数呢。

     在上面的'跟踪类实例化'例子中,我们分析到了这个功能,调用的类都是在a.a.a.b包下。 我们接着分析这个功能时,那些函数会被执行。具体方法如下:

1.监视函数运行

1.打开QTrace, 同时保证电脑ADB连接上手机

2.执行运行->调试进程,选择要调试的程序

3.打开左侧''设备''面板. 选择a.a.a.a目录,执行右键菜单'类断点'

4.结果还是在控制台面板中。


注意: 该方法会有较大的开销,需要性能较好的手机进行测试,不要一下监视太多的类,同时注意在''断点'','序列图跟踪'页面中去掉不需要的断点设置。

2.监视函数堆栈

     上面例子中,打印的信息只包含执行了什么函数,以及执行该函数时的变量信息。在很多时候,还需要知道该函数是谁调用的,也就是需要查看函数栈信息。要打印堆栈信息,在设置断点时,修改脚本就可以了。

1.打开断点面板, 删除已有的断点设置.

2.打开左侧''设备''面板. 选择a.a.a.a目录, 重新设置类断点。

设置脚本内容为<trace>


3.打印的结果如下


五、UML 序列图

      如上分析函数的方法,都是一个个函数分析的。QTrace还提供了UML序列图的方式展示了函数之间的调用关系,可以更直观,更快速的分析程序执行的脉络。

      具体方法如下:

1.打开QTrace, 同时保证电脑ADB连接上手机

2.执行运行->调试进程,选择要调试的程序

3.打开左侧''设备''面板. 选择a目录,执行右键菜单'序列图跟踪'


4.UML序列图显示如下


     从UML序列图就可以很直观的看到程序是如何执行的。

六、程序的调试

     对于分析程序执行,单步执行等这些基本的Debug方法也是必须的。反编译程序后,用Eclipse,Android Studio都可以进行Debug。QTrace也提供了相同的功能,这里说明下QTrace如何调试程序。

1.反编译程序

QTrace支持反编译APK, jar。 打开左侧'源码'面板,将apk文件拖到'源码'面板, 然后添加路径到源码。

QTrace会自动完成APK的反编译,反编译后的源码可以用于调试。

也可以采用别的反编译工具进行反编译得到源码,然后将源码路径添加到项目。

2.调试

如果反编译后的代码行信息对的,那么可以打开对应的源码文件,然后在对应的代码行上打断点(按F9)。

如果反编译后的代码行信息不对,那么可以采用函数断点。选择函数声明,按F9打断点。保证类型为函数,同时保证选择了'断住', '生效'选项。


    QTrace的调试方法与AndroidStudio,Eclipse是一样的,可以逐行调试,可以查看变量。




2020安全开发者峰会(2020 SDC)议题征集 中国.北京 7月!

最后于 2019-12-13 22:33 被mb_genqvyus编辑 ,原因: 更新程序,解决部分Window下无法连接到手机
最新回复 (12)
Ddddz 2019-12-10 14:45
2
0
666
壹久玖 2019-12-10 14:47
3
0
牛逼
东湖飞燕 2019-12-10 14:48
4
1
deadxing 2019-12-10 14:53
5
0
999
小豆芽 2019-12-10 14:57
6
0
66666666
mb_ckcnzsyk 2019-12-10 15:02
7
0
非常强大的方便的一个工具
StriveMario 2019-12-10 15:04
8
0
牛逼
yuyuyu蛤 2019-12-10 15:16
9
0
666  有windows版吗
yuyuyu蛤 2019-12-10 15:17
10
0
看到了  有windows版
yuyuyu蛤 2019-12-10 15:22
11
0
谢谢大佬分享
上海刘一刀 2 2019-12-11 22:03
12
0
感谢分享 大佬可以在写一个调试native层的
mb_genqvyus 2019-12-13 22:48
13
0
更新了一个版本,https://pan.baidu.com/s/1kkPZgRWepe_FIEWNAsO8sw
修复了部分Window系统下,无法连接的问题。
游客
登录 | 注册 方可回帖
返回