Droidbot 代码解析以及魔改:增加自动登录、权限授予等


最近执行安卓动态测试,魔改Droidbot,进行一些记录。

工具仓库:https://github.com/honeynet/droidbot

Droidbot 结构介绍

Droidbot 是轻量级测试输入生成器。它可以向 Android 应用程序发送随机或脚本输入事件,更快地实现更高的测试覆盖率,并在测试后生成 UI 转换图 (UTG)。

这里简述它的结构:
首先,python面向对象编写,最核心的类是InputManager/InputPolicy 、InputEvent和Device。(其他类比如App、logcact、Minicap等等都不重要,暂时不关心)
整个Droidbot的逻辑结构是:

Device类

  1. Device 管理设备的属性和操作
    • 操作包括安装APK卸载APK或者截图等等

    • 属性中最关键的是View的结构信息,这个信息会提供给InputManager,然后InputManager根据指定的策略选择合适的View生成合适的Event然后再发回给Device执行。

    • 注意:
      View结构信息是通过辅助功能拿到的,所以会和uiaotumator2冲突。
      本身没有提供xml的保存,但是state信息中的view结构就和xml差不多。我们本次需要保存xml,所以写了一个json2xml的函数,将last_acc_event转换成xml文件。用adb uiautomator dump 的问题是:有时候会不能得到空闲状态,报错。不过这种方法要注意json转xml的时候有些特殊符号需要转义不然也会有bug。
      在这里插入图片描述

InputEvent类

  1. InputEvent: 输入事件,包装了包括触摸、滑动、拖拽等一系列操作,实际操作是调用device.adb发送命令的,但是这里做了包装,比如转换成str进行log的格式,比较重要的包装包括传给他state和要点击的view,他会从state中提取发送的x,y位置,然后调用device发送。

InputManager和InputPolicy 类

  1. InputManager/InputPolicy :InputManager顾名思义 输入管理类,通过输入的POLICY,选择不同的策略(InputPolicy类),安排event。
    • 它会像device要state,根据state中view的信息,然后过滤筛选生成出可能的点击行为(通过view可不可点击可不可拖动等属性进行点击事件的生成)。
    • 生成的event事件,根据不同的策略,挑选出那一个去执行的,比如贪婪策略是最后生成一个back事件,这样按照顺序执行,最后会回到上一页,再往后接着走;随即策略就会shuffle所有事件,然后随机选一个。

最外层面向类:Droidbot,管理所有类,做一些前置准备之后(logcat输入输出设置,device连接,app安装等等)就开始交给InputManager,然后根据不同的Policy,InputPolicy 不断生成事件和执行。
在这里插入图片描述

UTG图

DeviceState类

其它稍微重要的类是State这个概念,为了提高覆盖率,有一个DeviceState,这个类表示一个状态,状态包括界面的view、service等等信息,一个简单的流程中会获取三次state,首先每次生成event之前会获取当前状态,然后去选择event生成,生成后需要发送event,在事件发送之前,再获取一次当前状态,然后等待一定时间,event效果结束,再获取一次state。这个state变化会用于生成utg的图。他会记录上一个state和event之后state,如果有变化说明event引起了state的变化,从而记录。此外,每次选择哪个event执行的时候也会检测state,从而尽可能探索未探索的state。

在这里插入图片描述

Droidbot魔改

增加场景检测——登陆注册

思路:要实现在登陆注册的时候进行相应操作,很显然是要识别到登陆注册的场景,然后进行相应event的行为。所以,需要修改Input_Policy类,在生成相应event之前,检测是不是登陆或者注册的情况,是的话,使用对应的event行为。
在generate_event函数中,增加对view text的检测,检测到有相关登录、注册、验证码、手机号等的button、edittext,进行点击或者手机号输入。

权限授予

Droidbot自带的权限授予rule,是安装的时候可以选择填不填加 -g 命令

adb install -r -g xx.apk

这个设置后,会默认全部授予,使用这个命令查看授予情况,会全部是true,也就是说不会有申请弹出,这样如果要记录调用情况,就不能获得了。

adb shell dumpsys package packagename | findstr "runtime permission"

怎么修改呢:
思路:两个办法,第一个办法首先类似登录,检测GrantPermissionsActivity
在这里插入图片描述
然后找到按钮进行点击
在这里插入图片描述
第二个办法:
实测有效,也是我最后选择的办法:可以使用DeviceOwner设置App权限授予的策略。
如何设置DeviceOwner,在我之前的文章中有些,不需要root但是需要先把手机中的账号删除,执行adb命令激活才有用,不然可能报错也可能卡住了。

DeviceOwener设置权限授予策略的一些注意点:是安装的时候设置,安装后,修改策略,那个应用是不生效的。
有三种策略,拒绝、同意、申请
这里选择同意,检查一下权限授予情况,可以看到都是False。

adb shell dumpsys package packagename | findstr "runtime permission"

但是在实际运行过程中,会被自动授予,且可以被Hook看到,非常好!!!!

在这里插入图片描述
再次查看相关权限,都变成True了。也就是说设置同意策略也是在申请时同意的,而不是最开始直接全部true了,就可以知道是什么时候变成同意的了。

在这里插入图片描述

状态栏问题

Droidbot进行下拉操作时,有一定几率召唤出状态栏,但是这个问题使用DeviceOwner可以禁止状态栏,所以也可以解决。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值