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

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

Android笔记:判断是否为模拟器(实测夜神通过)

多开原理

目前市面上的多开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进行过滤,得到类似下面的结果。


// 正常情况下
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会绕过这项检测。


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改个包名就失效了。

伪代码如下。


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安全防护/检查root/检查Xposed/反调试/应用多开/模拟器检测(持续更新)

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

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

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

  3. Android笔记:判断是否为模拟器(实测夜神通过)

    因为不确定因素太多,最近公司需要禁止本程序在虚拟机上运行. 我网上找了好多,各种方法什么设备号,拨打电话,蓝牙设备,模拟器的检测往往是防作弊中的重要一关,这里把这两天收集到的代码写在这偏文章里,和大家 ...

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

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

  5. Android应用分身检测

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

  6. android的多开器解析和检测实现

    多开理论基础 app多开常用于做一些不合法的事情,如高羊毛,黑灰产,甚至会对app的功能做破坏修改.因此多开在实际app应用中是有一定危害性的,因此对多开环境的识别是很重要的,通过识别多开环境有利于让 ...

  7. Android中高级进阶开发面试题冲刺合集(七)

    以下主要针对往期收录的面试题进行一个分类归纳整理,方便大家统一回顾和参考.本篇是第七集~ 强调一下:因篇幅问题:文中只放部分内容,全部面试开发文档需要的可在公众号<Android苦做舟>获 ...

  8. Android studio无法连接识别检测各种模拟器和手机的问题

    Android Studio运行程序时检测不到模拟器的解决方法: 现在我们公司好多新手Android开发对于模拟器无法连接非常苦恼,逐一给他们调试也很麻烦,尤其是一些Java也想运行一下Android ...

  9. 双开助手多开分身版 v5.1.8

    类型:系统工具 版本:v5.1.8 大小:6.1M 更新:2019/3/6 语言:简体 等级: 平台:安卓, 4.0以上 下载地址: 双开助手多开分身版 v5.1.8(1) 双开助手多开分身版 v5. ...

  10. 多开分身苹果版_【苹果/安卓】影分身,我们每个人都会!

    点击上方蓝字 关注我们 黑 科 技 资 · 源 · 研 · 究 · 社 往期资源推荐: 购物省钱,分享赚钱的一款APP.非常给力! 想要下载版权收费音乐?需要花钱?不存在的! [苹果/安卓]集万千宠爱 ...

最新文章

  1. golang OOP面向对象
  2. 此心拖泥带水,是人生最苦处
  3. PostgreSQL免安装部署方法
  4. maven 配置文件 settings.xml
  5. oracle 叠加代码写法,利用st_geometry进行图形叠加分析
  6. 10个非常有用的CSS hack和技术
  7. 公众平台关注用户达到5万即可开通流量主功能 可以推广APP应用
  8. Java调用跟踪系统_Tracer:在分布式系统中的调用跟踪和日志相关
  9. (十五)深入浅出TCPIP之Hello CDN
  10. 赌还是不赌 你应该辞职去创业吗?
  11. jquery获取和设置属性_jQuery获取属性,设置属性,删除属性
  12. 文件系统挂载、卸载及相关的工具 ⑨
  13. js中0.1+0.2 与0.3的对比
  14. linux 端口映射设置
  15. python返回对象_函数返回一个对象-python
  16. 批量模糊匹配的三种方法
  17. matlab潮流计算编程教学,潮流计算 程序_牛拉法潮流计算程序_matlab潮流计算教程...
  18. 惠普hp暗影精灵2 Hackintosh黑苹果安装过程
  19. 计算机关机后,电脑关机后自动重启怎么解决?
  20. 手机保护壳让手机信号变更差?

热门文章

  1. 关于sip软电话嵌入到网页web端的学习----第一天(2)(高手指点)遇到问题了jssip
  2. [无忧网络验证]代理使用教程
  3. 20170627——【肿瘤】肿瘤的异质性
  4. Win10修改登录/锁屏界面背景
  5. 电子面单打印通用解决方案(PHP代码示例)
  6. 10个CSS技巧,极大提升用户体验
  7. hihocoder 1378(有向图求最小割集)
  8. 设置outlook开机自动启动
  9. APP消息推送-个推java端实现
  10. ios10前台收到推送_APP在前台收到推送消息时也会弹出提醒?