中文站

“群控软件”助长黑灰产套利的零和游戏,硬核技术打击隐秘的不公

导读:群控系统一般由多个部分组成,例如在手机端运行的服务、在手机端用于模拟输入的输入法、在 PC 端用来对所有设备操作与监控的中控台、在服务器中运行的连接所有设备的服务端等。本文主要介绍对群控软件技术的相关研究与实践。

文|李伊洋    网易易盾 Android 安全工程师

群控功能

区别于模拟点击工具,群控系统一般由多个部分组成,例如在手机端运行的服务、在手机端用于模拟输入的输入法、在 PC 端用来对所有设备操作与监控的中控台、在服务器中运行的连接所有设备的服务端等。

群控系统的组成

作为一个系统,群控系统由 PC 中控模块、手机通信模块、功能实现模块三部分组成,但是不一定每个模块都是独立或是独一的,用某智控产品举例,只有 PC 中控软件与一个 APK 安装包两个软件,而某助手软件包含 PC 中控软件、输入法 APK、通信 APK、UIAutomator 功能 APK 四个软件。

一、PC 中控模块

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 反外挂能力已经拥有了对这种模拟行为的检测能力。点击免费试用网易易盾反外挂产品


安装包

在上文中提到过的相关模块,都可以作为检测的依据。