qt android 逆向,[原创]QTrace动态逆向分析Android程序

QTrace动态逆向分析Android程序

一、QTrace概述

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

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

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

二、如何逆向分析

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

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

76dc4454ec1905e76185c2777dc7bc9b.png

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

三、类文件的定位

1.定位当前Activity

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

点击Current Activity图标:

2e3f5208e02b803438106b5da4ae4020.png

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

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

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

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

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

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

663bb091402dd2e512924c9c311a6a0d.png

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

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

051af9ccb19ea6cb470c56503cb146c6.png

注意:

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

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

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

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

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

具体方法如下:

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

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

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

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

3b39e6a6c78521ee85a4a0aa3379b715.png

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

7bfe5224dd637a89ba8e1dd46f1a0467.png

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

四、函数的定位

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

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

1.监视函数运行

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

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

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

3b880a14e4cb6e4371f1bb30ada190d9.png

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

5edba77719fd93bb5904bcc43ad118e0.png

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

2.监视函数堆栈

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

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

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

设置脚本内容为

44c1820c4a4185d57f0ff8846b2e9408.png

3.打印的结果如下

f72e18123fe84bdaafbc592e64e5ef88.png

五、UML 序列图

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

具体方法如下:

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

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

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

e8a9560364511f08ef192ac921b938df.png

4.UML序列图显示如下

66e4c1ef5fd1e90df193b70a1c793e54.png

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

六、程序的调试

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

1.反编译程序

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

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

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

2.调试

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

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

4ac3f61a52fdb975cee15bce03f0c933.png

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

最后于 2019-12-13 22:33

被mb_genqvyus编辑

,原因: 更新程序,解决部分Window下无法连接到手机

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值