Android类似钉钉类的APP 实现禁止用户虚拟定位

article/2025/11/9 21:07:41

参考:https://blog.csdn.net/mawei7510/article/details/80250416

在应用开发中,如果有签到打卡之类的功能,我们肯定需要在项目中禁止用户开启虚拟定位,导致在***米之外的距离模拟定位然后进行了打卡操作!

(一)

首先:获取用户手机是否打开了  “允许模拟位置”  选项?

其实很简单,这些设置项,基本都是写在数据库里,所以只要看看setting的源码(或者查看logcat可能也可以得到些有用的信息),就能知道该配置是写了数据库的哪个字段。

boolean isOpen = Settings.Secure.getInt(context.getContentResolver(),Settings.Secure.ALLOW_MOCK_LOCATION, 0) != 0;
//很明显,Settings.Secure.ALLOW_MOCK_LOCATION 就是存放允许模拟位置的数据库字段了
//当isOpen为ture时,则是用户打开了允许模拟位置的选项,否则则没有开启!

(二)

其次:虚拟定位可以通过一些第三方应用,然后把我们自己的应用克隆一个。在启动的时候需要在第三方的应用里面来启动,这样的话在私有文件里面生成的包名势必会和直接启动自己的应用有区别,知道了这些,我们将通过以下三个方法来一一检测;

 

首先介绍一些那些使用应用分身双开和虚拟定位的应用和自己的应用在私有目录下生成的包名有什么区别:

我们知道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家的分身大师可以绕过。

下面开始正式检测:

1. ps检测(详见https://www.jianshu.com/p/216d65d9971e)

我们先通过执行对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的目录。看下具体代码实现;

public static boolean isRunInVirtual() {String filter = getUidStrFormat();String result = exec("ps");if (result == null || result.isEmpty()) {return false;}String[] lines = result.split("\n");if (lines == null || lines.length <= 0) {return false;}int exitDirCount = 0;for (int i = 0; i < lines.length; i++) {if (lines[i].contains(filter)) {int pkgStartIndex = lines[i].lastIndexOf(" ");String processName = lines[i].substring(pkgStartIndex <= 0? 0 : pkgStartIndex + 1, lines[i].length());File dataFile = new File(String.format("/data/data/%s",processName, Locale.CHINA));if (dataFile.exists()) {exitDirCount++;}}}return exitDirCount > 1;}

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

2.应用列表检测

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

3.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;
}

 

以上三种检测方法有的会被第三方虚拟定位软件或者多开分身软件躲避掉,有的则不会,所以使用的时候建议三种方法全部用上。


http://chatgpt.dhexx.cn/article/esEoSKKe.shtml

相关文章

uni-app 实现用户点击后自动拨打指定电话号码

uni 内部提供了一个makePhoneCall函数 那我们就直接看代码 <template><view click "phone">13510657575</view> </template><script>export default {data() {return {}},onLoad() {},methods: {phone() {uni.makePhoneCall({phoneN…

移动端uni-app拨打电话

需求&#xff1a;点击电话图标&#xff0c;手机打开拨号界面并已复制电话号码 官方API&#xff1a;uni.makePhoneCall(OBJECT) | uni-app官网 很简单的一个点击事件就可以完成了&#xff1a; <view class"base-icon phone" click"goPhone(item)">…

虚拟中间号的具体用法

虚拟中间号要说怎么用&#xff0c;不如说用在哪儿。广义上来说&#xff0c;所有需要用到手机号的场景&#xff0c;虚拟码号同样也是适用的。 虚拟中间号的核心应用场景第一是“换”&#xff0c;即使用虚拟码号替换真实的手机号码&#xff0c;用这种方法实现对于真实号码的隐藏…

Delphi D10.X安卓APP开发中获取硬件信息及手机号

Demo与代码已上传到CSDN下载。 这里简单说一下代码内容&#xff0c;完整代码请自行下载&#xff0c;不清楚的欢迎留言交流。 前言 演示Demo使用了我自己开发的一个控件&#xff0c;TLayoutPro 《Delphi D10.3 LayoutsPro 控件简介 -避免输入焦点被虚拟键盘遮挡》请查看并下载…

饿了么虚拟号码可以发短信吗_饿了麽APP逆向及爬虫实现详参

一、前言 今天主要以饿了麽为例,讲解一下APP逆向的大致流程,以及遇到问题的处理办法。 二、概述 APP逆向的目的是为了了解APP本身的运行逻辑,进行修改或进行还原。涉及到的技术和工具,见下图。 对于抓包我就不详细讲了,不清楚的看一下我之前的文章。 HTTPS抓包与手机抓包,…

手机app访问服务器数据库数据库文件夹,手机app怎么访问服务器数据库

手机app怎么访问服务器数据库 内容精选 换一换 华为云提供两种连接方式通过SQL Server客户端连接实例:非SSL连接和SSL连接。其中,SSL连接实现了数据加密功能,具有更高的安全性。准备弹性云服务器通过内网连接华为云关系型数据库实例,您需要购买一台弹性云服务器。创建并连接…

mysql-修改数据存储位置

前提&#xff1a;win10 &#xff0c;c盘不够用&#xff0c;将mysql存储位置改为d盘。 参考文章指路在这里&#xff1a;Windows10下配置自定义的MySQL8的数据存储路径_反反复复的昵称的博客-CSDN博客_mysql8 windows 配置文件路径 1、停止mysql的服务 2、找到文件存储的路径…

如何抓包微信小程序修改数据

如果通过手机接入电脑作为代理抓包&#xff0c;其实相对要复杂得多&#xff0c;但是有的游戏转发出来&#xff0c;在电脑端打开&#xff0c;就不能正常进行。 所以我们要解决的第一个问题是&#xff0c;在微信电脑端打开小程序&#xff0c;方法很简单。 进入游戏中&#xff0c;…

达梦数据库更改数据文件路径

在日常运维的时候偶尔会遇到由于前期磁盘规划等原因&#xff0c;或者资源限制等原因&#xff0c;在数据不断增长的情况下。要移动数据文件目录的情况。具体操作如下。 原来目录是&#xff1a;/dmdata 新目录是&#xff1a;/newdata 1.记录原环境信息。 2.停止数据库相关服务…

powerbi 修改数据源路径

将本地Excel文件导入power bi成为数据源&#xff0c;如果文件路径改动&#xff0c;在更新数据时就会出现错误。 更正路径的方法&#xff1a; 首先点击‘转换数据’ 点击 ‘数据源设置’ 选择出错的数据源&#xff0c;点击最左侧的‘更改源’ 选择正确的路径即可

oracle修改数据文件名称

环境&#xff1a;ora10g 在一次添加数据文件时&#xff0c;错把文件名写成了别的表空间的名称&#xff0c;虽然不改不影响数据库&#xff0c;但是后期维护可能会造成不便。生产环境不方便操作测试&#xff0c;因此在测试机上也试一下。 首先百度了下&#xff0c;网上说有三种…

Mysql修改数据存储目录

修改已经使用的mysql数据存储目录 1. 查询Mysql数据存储原来的存储目录 cat /etc/my.cnf2. 建立新的Mysql存储目录 mkdir /home/mysqldata3. 将数据文件copy到新目录 cp -R /var/lib/mysql /home/mysqldata/4. 设置新目录权限 chown -R mysql:mysql /home/mysqldata5. 修改…

vue3 操作修改数据

vue2.x改变数据&#xff1a; <template> <div class"v2"> 这是数据展示&#xff1a; <div v-for"item in nm" :key"item">name: {{item.name}}, type: {{item.type}}</div> <div click"chfn">点击改变数…

clickhouse修改数据存储目录

clickhouse默认数据目录是&#xff1a; /var/lib/clickhouse。 修改方案&#xff1a;先停止数据库&#xff0c;然后转移该目录到指定位置&#xff0c;最后软连接回原地址并启动&#xff1b;即无需修改config.xml实现对数据目录的修改。 1、停止数据库 service clickhouse-ser…

SQL Server 修改数据

1.Insert Into语句&#xff1a; Insert Into语句用于向表中新增数据。 语法&#xff1a;Insert Into有两种编写方式&#xff1a; ①不需要指定插入数据的列名&#xff0c;只需提供插入值&#xff0c;不指定要插入数据的列名&#xff0c;需要列出插入行的每一列数据&#xff…

ORACLE 修改数据

今天说一下ORACLE修改数据库中数据的几种方法: 1、UPDATE 确定条件批量修改 --批量修改 UPDATE cux_oa_person_b t --表名 SET t.person_number 111 --需要修改的数据 WHERE t.person_name xxx --条件 2、FOR DATE 可视化修改 --与查询一样&#xff0c;只是后面多了 FOR…

数据库修改数据类型

数据库修改数据类型 在日常使用数据库中&#xff0c;或多或少都会遇到要修改数据库表中字段的数据类型&#xff0c;有一种方法是直接点“设计”&#xff0c;就可以修改了&#xff0c;但往往都不行&#xff0c;会提示为“不允许保存修改” 那就用另一种方法。可以看到&#xff…

SQLServer修改数据

数据库的修改数据要用到insert这个语句,使用INSERT 语句向表中添加新行 首先表的名称通过模式名称引用表名称其中,其次表名称后的括号内要指定要在其中插入数据的一个或多个列的列表。必须将列列表括在括号中并用逗号 分隔列。 如果列在列列表中没有出现&#xff0c;则SQL Serv…

Fiddler抓包,并修改请求数据

浏览器抓包&#xff08;工具&#xff1a;fiddler&#xff09;并 修改请求内容 工具下载&#xff1a;https://pan.baidu.com/s/1pyKdAwgTdNNvoWA2bGlk9A 1、正常打开网页&#xff0c;输入要提交的内容 2、打开工具&#xff0c;f11暂停了页面的所有提交动作 3、这时再点击提…

开源的在线答题小程序分享

联系方式 大家如果对在线答题类小程序感兴趣或者是小程序开发者欢迎与我联系&#xff0c;请备注"小程序" 相关介绍 从业资格&#xff0c; 主要面向金融用户&#xff0c;提供证券从业资格真题题库、基金从业资格考试真题题库&#xff0c;后面会拓展其他类目的从业资格…