Android多开/分身检测

摘要:
对于普通用户不需要打开多个应用程序的应用程序,一旦检测到该应用程序当前在多个开放环境中运行,就有理由限制用户的后续行为。在尝试在市场上打开多个应用程序后,总结了几种检测方案。它只对一些更开放的应用程序有效,例如360的拆分主机。许多更开放的应用程序将绕过此测试。目前,没有发现多个打开的应用程序绕过此检测,但缺点是需要收集所有多个打开应用程序的包名。一旦多个打开的应用程序的包名发生更改,它们将变得无效。

原文:https://blog.darkness463.top/2018/05/04/Android-Virtual-Check/

多开/分身原本用于方便有多个微信/QQ解决同时登录的问题,但近来年被各种黑产所利用,多见于薅羊毛,部分多开App甚至提供了篡改功能。对于普通用户根本不会有多开的需求的App,一旦检测到当前运行在多开环境下,有理由限制该用户的后续行为。

在尝试了目前市面上多款多开App后,总结了几种检测方案。

多开原理

目前市面上的多开App的原理类似,都是以新进程运行被多开的App,并hook各类系统函数,使被多开的App认为自己是一个正常的App在运行。

从形式上来说多开App有2种形式,一种是从多开App中直接加载被多开的App,如平行空间、VirtualApp等,另一种是让用户新安装一个App,但这个App本质上就是一个壳,用来加载被多开的App,其原理和前一种是一样的,市面上多开分身这款App是用的这种形式,用户每分身一个App需新安装一个包名为dkmodel.xxx.xxx的App。

检测方案

检测files目录路径

我们知道App的私有目录是/data/data/包名//data/user/用户号/包名,通过Context.getFilesDir()方法可以拿到私有目录下的files目录。在多开环境下,获取到目录会变为/data/data/多开App的包名/xxxxxxxx/data/user/用户号/多开App的包名/xxxxxxxx

举个例子,在我手机上,正常使用App上面的代码获取到的路径为/data/user/0/top.darkness463.virtualcheck/files。在多开分身的多开环境下,路径为/data/user/0/dkmodel.zom.rxo/virtual/data/user/0/top.darkness463.virtualcheck/files

当然,多开软件是可以hook处理让你拿到正常的目录,但截至写这篇文章为止,市面上大部分多开App没有绕过这项检测,仅有360家的分身大师可以绕过。

ps检测

这种检测方法见这篇文章。这里就不重复了,我简单说一下原理。

我们先通过执行ps命令并以自己的uid进行过滤,得到类似下面的结果。

1
2
3
4
5
6
7
// 正常情况下
u0_a148 8162 423 1806036 56368 SyS_epoll+ 0 S top.darkness463.virtualcheck

// 多开环境下
u0_a155 19752 422 4437612 62752 SyS_epoll+ 0 S top.darkness463.virtualcheck
u0_a155 19758 422 564234 54356 SyS_epoll+ 0 S com.lbe.parallel
u0_a155 19747 422 734562 24542 SyS_epoll+ 0 S com.lbe.parallel:mdserver

可以看到在多开环境下,会获取到自己的包名和多开App的包名这2个包名,通过这些包名去/data/data/下找会找到2个目录,而正常情况下只能在/data/data/下找到自己的App的目录。

具体的实现原文已经贴了,这里也不重复了。目前未发现有多开App能绕过该项检测,但在Google Pixel Android 8.0下执行ps获取不到进程信息,在Android 8.1的类AOSP rom下都能正常获取,不知道那个手机什么情况。

应用列表检测

这里的应用列表检测不是指简单的遍历应用列表判断是不是安装了多开App,我们并不阻止用户安装多开App并多开其他App,我们只是不希望用户多开我们自己的App,因此不能检测到用户安装了多开App就把他干掉。

多开App都会对context.getPackageName()进行处理,让这个方法返回原始App的包名,因此在被多开的App看来,多开App的包名和原始的那个App的包名一样,因此在多开环境下遍历应用列表时会发现包名等于原始App的包名的应用会有两个。

代码如下。只对部分多开App有效,例如360的分身大师,不少多开App会绕过这项检测。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
private boolean checkPkg(Context context) {
try {
if (context == null) {
return false;
}
int count = 0;
String packageName = context.getPackageName();
PackageManager pm = context.getPackageManager();
List<PackageInfo> pkgs = pm.getInstalledPackages(0);
for (PackageInfo info : pkgs) {
if (packageName.equals(info.packageName)) {
count++;
}
}
return count > 1;
} catch (Exception ignore) {}
return false;
}

maps检测

读取/proc/self/maps,多开App会加载一些自己的so到内存空间,举个例子,360的分身大师加载了其目录下的某个so,/data/app/com.qihoo.magic-gdEsg8KRAuJy0MuY18BlqQ==/lib/arm/libbreakpad-jni-1.5.so,通过对各种多开App的包名的匹配,如果maps中有多开App的包名的东西,那么当前就是运行在多开环境下。

目前没有发现多开App绕过该项检测,但缺点是需要收集所有多开App的包名,一旦多开App改个包名就失效了。

伪代码如下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

Set<String> virtualPkgs; // 多开App包名列表
private boolean check() {
BufferedReader bufr = null;
try {
bufr = new BufferedReader(new FileReader("/proc/self/maps"));
String line;
while ((line = bufr.readLine()) != null) {
for (String pkg : virtualPkgs) {
if (line.contains(pkg)) {
return true;
}
}
}
} catch (Exception ignore) {

} finally {
if (bufr != null) {
try {
bufr.close();
} catch (IOException e) {

}
}
}
return false;
}
总结

这些方法有的已经被部分多开App绕过了,有的暂时还未绕过,建议所有的检测都加上,而且可以Java层和C层都进行检测。当然,与黑产斗争的道路我们永远处于劣势。

免责声明:文章转载自《Android多开/分身检测》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇TreeView中节点勾选设置fabric基础设施管理-(四)多机-动态新增组织节点下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

使用Charles抓取APP之HTTPS请求

Charles是一款非常好用的抓包工具,通常使用它来进行APP开发抓包调试,尤其是HTTPS请求。 一、安装Charles 去官网(https://www.charlesproxy.com/)下载软件并安装。 安装完毕后,开启系统代理(本测试在windows环境进行),菜单->Proxy->Windows Proxy前面打钩,就开启了windo...

C-Sharp网络编程案例解析(Socket类的使用)

Server端: using System; using System.Collections.Generic; using System.Text; using System.Net; using System.Net.Sockets; namespace Server {     class Program     {         static v...

ASP操作Excel技术总结

目录一、环境配置二、ASP对Excel的基本操作三、ASP操作Excel生成数据表四、ASP操作Excel生成Chart图五、服务器端Excel文件浏览、下载、删除方案六、附录正文一、环境配置服务器端的环境配置从参考资料上看,微软系列的配置应该都行,即:1.Win9x+PWS+Office2.Win2000Professional+PWS+Office3....

动画开发之PIXI开发

简单的移动小游戏只要引入pixi.min.js就可以, 如果要用spine动画(龙骨也支持导出spine格式的)就要引入pixi-spine.js 如果还有声音的支持引入pixi-sound.js 学习网址:   - 官网http://www.pixijs.com   - API http://pixijs.download/release/docs/...

Alfred Workflow

实用的 Alfred Workflow Alfred Workflow 介绍 alfred-pkgman-workflow 快速从各个软件仓库(maven, gradle 等等)中查找需要的软件包 AlfredHanziSourceWorkflow 快速从象形字典、汉语字典、说文解字等站点查询字源 AlfredGoogleTranslat...

【原创】简单快速软件开发平台,C/S架构二次开发平台

简单快速软件开发平台,二次开发平台 二次开发平台可根据企业的需求,灵活快速搭建企业业务管理系统,充分满足企业个性化的需求。C/S系统快速开发框架为企业和个人提供快速开发能力,能快速搭建C/S架构模式的企业管理应用系统。C/S系统快速开发框架提供开发大型软件系统的底层模板,基于开发框架的VS解决方案源码,改名为自己的软件系统名称,如:MyERP,MyMES等...