导读:群控系统一般由多个部分组成,例如在手机端运行的服务、在手机端用于模拟输入的输入法、在 PC 端用来对所有设备操作与监控的中控台、在服务器中运行的连接所有设备的服务端等。本文主要介绍对群控软件技术的相关研究与实践。
文|李伊洋 网易易盾 Android 安全工程师
群控功能:区别于模拟点击工具,群控系统一般由多个部分组成,例如在手机端运行的服务、在手机端用于模拟输入的输入法、在 PC 端用来对所有设备操作与监控的中控台、在服务器中运行的连接所有设备的服务端等。
群控系统的组成:作为一个系统,群控系统由 PC 中控模块、手机通信模块、功能实现模块三部分组成,但是不一定每个模块都是独立或是独一的,用某智控产品举例,只有 PC 中控软件与一个 APK 安装包两个软件,而某助手软件包含 PC 中控软件、输入法 APK、通信 APK、UIAutomator 功能 APK 四个软件。
PC 中控软件是整个系统的核心。核心功能可以分为对设备的监控与控制、对脚本的编写与控制两个部分。
对设备的监控是指会有大量的设备屏幕在这里被展示,通过颜色或是一些小标志,可以看到对应设备的手机通信模块是否正常运转。当指令下发时,没有正确执行指令的设备,由于屏幕不一致就会显现出来。黑灰产厂商能够快速排查问题,保证设备墙正常运转。这部分功能依赖于 adb 或是网络通信,做法可以根据手机内的通信模块而改变。
脚本的编写主要是依赖于对手机 Activity 树状结构的解析,使得 View 信息能被脚本开发人员获取,通过 View 的 id 或是 text 属性,从而定位 View 的坐标,完成脚本开发。
同时部分中控软件也支持脚本市场的功能,可以直接编写脚本开发人员已经编写好的脚本。
脚本由 PC 中控软件控制下发,做到批量执行、定期执行、延期执行、批量停止等操作。
主要用于对 PC 中控软件的指令进行解析,以及将屏幕图像传递给 PC 中控软件。以某老牌群控软件为例。
也用于弹出部分提示信息,例如查找指定设备,则会发出声音,并提示关闭提示倒计时:
每个群控系统都有他们特有的做法用来实现具体的功能。在整个群控系统中,这个模块是最接近被保护应用的,目前的检测思路主要也是围绕功能模块进行。下文会对这里提到的各个功能进行更具体的分析。
获取 Activity 结构:脚本开发和使用中,都需要获取到 View 的信息。为了获取这个信息,需要手机内的功能模块辅助完成。
模拟点击:模拟正常用户的点击,触发应用按钮、屏幕滑动等内容。模拟点击一般不会是单独的一个 apk,常见集成在输入法内。
其他:如截屏、开关 WIFI、重启设备等小功能就不再展开。
从群控实现了的功能出发,可以将其分为以下的功能:
对系统的操作、WIFI 开启或关闭、流量开启或关闭、应用的安装与卸载、应用 Activity 的启动、通讯录管理、文件的互传、剪贴板的互转、获取 Activity 的树状结构与其他。
对系统的监听、短信及其内容的监听、屏幕变化的监听与其他。
对输入的模拟、文本输入的模拟、坐标点击的模拟、多选框选择的模拟与其他。
对自身的逻辑、录制操作的保存、已录制操作的重放、已编写脚本的解析、延迟脚本的处理、各个部分间的通信、多个脚本的控制与其他。
群控往往是跨端实现功能,现在基本可分为本地群控和云控,区别在于是否开放外网操纵设备。
云控的好处在于设备本身可以是分散的,例如黑灰厂商向一个正常设备租下一段时间,通过云端发送指令操作,完成黑灰操作后再结算费用给散户。这样从设备的聚集性上就很难看出异常,不论是 ip 还是 gps 都没有任何的聚集性。
同时云控也有另外的做法,同样使用传统设备墙,设备墙连接一个中控服务器,服务器开放外网,这样就能随时随地操作设备墙,主要用于大型团队的操作。而本地群控就是最传统的做法,如果设备较少就可以直接通过集线器连接电脑,电脑直接通过群控系统跨端操作设备墙。如果设备过多,可以加入一个中转的中控服务器,但是不连接外网,而是通过路由器等在内网直接接受指令。
模拟点击:模拟点击的具体内容可以查看之前发过的 Android 模拟点击研究相关文章。
控件查找:控件查找对于任何一个群控系统与自动点击工具来说都是必备功能。除开通过 opencv 库做到的找图和 OCR 找字之外,对于控件查找更重要的能力在于对其属性的获取。例如一个界面中若是有两个都是长得一模一样的按钮,那么不论是找图还是 OCR 都只会返回第一个值,后一个按钮就失效了。
于是出于脚本稳定性考虑,群控系统和自动点击工具都会想方设法去获得控件的属性,例如唯一标识的 ID。
以现有的样本为例,群控系统获得控件属性的办法有两种,分别是类 Auto.js 做法与类 UIAutomator 做法。
类 Auto.js :该做法依赖于无障碍服务,所以需要注册无障碍服务,但并非所有软件都需要注册该服务
*/com.stardust.autojs.core.accessibility.AccessibilityService
优点:开发容易且稳定。缺点:依赖无障碍服务,通过获取无障碍服务列表可以检测。
类 UiAutoMator:这种做法来源于测试工具,appium 也是同样的做法。
大致思想是将 UIAutomator 调试桥植入设备,然后可以通过 adb shell uiautomator dump 命令,将当前的 activity 的树状结构 dump 成一个 xml 形式,然后解析该 xml,就可以得到 activity 中的所有控件属性。
可以看到在没有使用无障碍服务的情况下,获得了所有的 View 信息。
优点:脱离了对无障碍服务的依赖,使得检测更困难。缺点:类似于早期的 monitor 工具,所有的 xml 都需要 dump 然后解析,时效性较差且效率较低。
网络通信:目前发现群控基本都依赖于 socket 通信,对于一些处理不是很好或是开发时间较久的群控系**统,可以通过复占端口的方式检测。
模拟点击:模拟点击方式通过 adb 权限,MotionEcent.obtain 模拟,injectInputEvnet 注入,易盾 Android 反外挂能力已经拥有了对这种模拟行为的检测能力。点击免费试用网易易盾反外挂产品
安装包:在上文中提到过的相关模块,都可以作为检测的依据。