最近app在推广过程中发现有大量的用户使用小号来领取邀请奖励,而小号的操作往往是利用多开软件开启应用分身来登录。为此,我需要区分出本体和克隆体。
当今市面上流行的分身主要有三类
1.修改Framework
手机厂商实现的分身功能就是用这种方式实现的
检测方案:手上有个小米测试机,正好自带分身,通过getFileDir()的api试了下,在本体得到的是data/data/com.xxx.xxx/files,克隆体得到的是data/user/10/com.xxx.xxx/files
2.修改apk
通过反编译apk,修改apk包名、签名等将apk伪装成另外一个app。市面上常见的第三方多开app大部分都是使用的这种技术。其特点是每次制作一个分身都需要时间拷贝、并且在应用列表中可以看到
检测方案:
跟上面一样,可以用getFileDir()来检测,只不过一个是data/data/com.xxx.xxx/files,另一个是data/data/com.xyz.xyz/files
3.虚拟操作系统
虚拟一个操作系统,克隆体app在这个虚拟系统中运行,在应用列表不可见,代表产品:360分身大师
检测方案:
这个据说是唯一一种绕过getFileDir()的分身方式,确实这种方式让我耗费了很长时间,下面以360的分身大师举例,详细说下分析过程
- 首先通过getFileDir()尝试,本体和克隆体输出一致。失败!!
- 通过在本体和克隆体登录不同账号获取SP中存储的账号信息,确定获取的信息不同,证明存储位置不一致
- 通过文件管理器查看最近修改的文件,发现系统根目录下有一个docker的文件夹,里面包含了跟根目录类似的结构,在其里面的Android/data下就会发现我们自己的包名,分身的本地数据就存放在这里。
- 找到分身的本地存储后,本想向其中存储数据用来标记是否为分身,但本体运行时报了一个无权限写入的异常,因此改为了判断当前是否有对该目录的写入权限
PS:据说“平行空间”原理和“360分身大师”相同,经测试发现通过getDirFile()就可以判断出来,至此,分身检测基本完成
网友评论