QTrace动态逆向分析Android程序
一、QTrace概述
QTrace是Android软件动态分析工具,它就像一个X光扫描仪,实时打印一个类中所有函数的执行情况(比如函数堆栈,相关变量等), 同时还可以用UML序列图的方式展示程序的执行情况。
所以可以借助QTrace来分析混淆的程序, 可以在混淆代码中快速的定位到相关的代码, 并理清代码的运行逻辑。
QTrace官网:http://www.qtrace.top
QTrace下载地址:https://pan.baidu.com/s/145JBPOmI9zv3S6VGvoUnJw
(注:要动态分析程序,首先要保证程序可以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, 执行右键菜单'实例初始化断点', 完成断点设置。
4.断点的结果也还是在控制台查看
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是一样的,可以逐行调试,可以查看变量。