多开/分身原本用于方便有多个微信/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多开/分身检测相关推荐

  1. Android多开分身 v7.2 破解永久VIP付费版

    此版特点 by Mrack # 破解永久VIP无限制,免费使用VIP会员高级插件: # 虚拟定位(可以钉钉打卡).机型伪装.红包助手: # 改内部版本号为v99,从而去后续检测升级提示: # 去多处广 ...

  2. Android安全防护/检查root/检查Xposed/反调试/应用多开/模拟器检测(持续更新1.0.5)

    参考地址:https://www.jianshu.com/p/c37b1bdb4757 多开软件检测 多开软件的检测方案这里提供5种,首先4种来自 <Android多开/分身检测> htt ...

  3. Android安全防护/检查root/检查Xposed/反调试/应用多开/模拟器检测(持续更新)

    转载请注明出处,转载时请不要抹去原始链接.代码已上传git,欢迎star/fork/issue https://github.com/lamster2018/EasyProtector 复制代码 文章 ...

  4. android 程序分身,Android应用分身检测

    最近app在推广过程中发现有大量的用户使用小号来领取邀请奖励,而小号的操作往往是利用多开软件开启应用分身来登录.为此,我需要区分出本体和克隆体. 当今市面上流行的分身主要有三类 1.修改Framewo ...

  5. Android应用分身检测

    最近app在推广过程中发现有大量的用户使用小号来领取邀请奖励,而小号的操作往往是利用多开软件开启应用分身来登录.为此,我需要区分出本体和克隆体. 当今市面上流行的分身主要有三类 1.修改Framewo ...

  6. Android NDK开发之 NEON基础介绍

    原文:http://blog.csdn.net/app_12062011/article/details/50434259 Android NDK开发之 NEON基础介绍 这是官方介绍: http:/ ...

  7. Android中的人脸检测入门

    原文作者 : Paul Trebilcox-Ruiz 译文出自 : 开发技术前线 www.devtf.cn 转载声明: 本译文已授权开发者头条享有独家转载权,未经允许,不得转载! 译者 : Langl ...

  8. Android官方开发文档Training系列课程中文版:目录

    原文地址 : http://android.xsoftlab.net/training/index.html 引言 在翻译了一篇安卓的官方文档之后,我觉得应该做一件事情,就是把安卓的整篇训练课程全部翻 ...

  9. Android安全开发之ZIP文件目录遍历

    1.ZIP文件目录遍历简介 因为ZIP压缩包文件中允许存在"../"的字符串,攻击者可以利用多个"../"在解压时改变ZIP包中某个文件的存放位置,覆盖掉应用原 ...

  10. android电池容量查看器,Android AccuBattery(电池损耗检测软件)V1.2.5 安卓专业版

    Android AccuBattery(电池损耗检测软件)是一款功能实用的提供安卓手机电池保持最佳状态而设计的电池管家软件.AccuBattery科学地维护电池健康,显示电池使用情况以及测量电池容量( ...

最新文章

  1. html 一条线两种颜色,HTML5/CSS3超酷进度条 不同进度多种颜色
  2. matplotlib 设置图形大小时 figsize 与 dpi 的关系
  3. Spring Data JPA 复杂/多条件组合分页查询
  4. python输入一个整数倒序输出_利用Python实现倒序任意整数
  5. Servlet获取Web应用程序的初始化参数
  6. java 模块分离部署_GitHub - yangjiu/Mis: 模块接口服务,如何在一个模块内维护其对外暴露的接口(包括打包发布),而不是把接口和接口实现分离到两个不同的模块?...
  7. 批量ssh免密登陆远程主机
  8. linux卸载cognos,在Linux上实战安装Cognos
  9. 【Python】使用Labelme标注自己的数据集并由json生成Ground Truth
  10. 快速入门linux(收藏版)
  11. 双三次插值算法的C++实现与SSE指令优化
  12. 卷积操作改进之Involution: Inverting the Inherence of Convolution for Visual Recognition
  13. 电音制作收割者宿主软件-Cockos REAPER v6.15 x86 x64 WiN
  14. 计算机设计大赛一人能报几个,我校在中国大学生计算机设计大赛获多个奖项
  15. 天梯赛java题解 L1-087 机工士姆斯塔迪奥分数 20
  16. 最节省计算机硬件,在Word 的文档视图中,最节省计算机硬件资源的是( )视图.
  17. my-mind在线思维导图软件
  18. 抖音纸短情长音乐计算机简谱,抖音纸短情长女版谁唱的 纸短情长计算器简谱完整版...
  19. go程序cpu过高问题排查方法
  20. 高等数学--导数、偏导数、梯度简介

热门文章

  1. 读取阿里云服务器图片到本地
  2. 模拟退huo算法的特点_模拟退火算法(有完整实例源代码)
  3. Invisible Backdoor Attack with Sample-Specific Triggers
  4. PX4 ---- Mixer
  5. docker的安装教程以及常用命令(一)
  6. vue运行之神奇的npm install --legacy-peer-deps
  7. 1024:程序员,你的身体还好吗?
  8. 刘宝瑞相声《珍珠翡翠白玉汤》台词
  9. ubuntu1604 golang环境
  10. 黑苹果常用 工具+Kext+ACPI+UEFI驱动 下载