Android虚假定位的实现与防护

Android中常用的定位方式

一,GPS定位

定义:全球卫星定位系统,直接和卫星交互,获取设备经纬度

优点:

  • 走卫星通信通道,无需打开Wifi或流量就能获得位置信息

  • 精确度最高,几米到几十米

缺点:

  • 需要手机支持GPS模块(大部分智能机基本都有)

  • 耗电量大

  • 大部分用户可能关闭GPS

  • 定位慢,特别是从GPS模块启动到获取到第一次定位数据,需要的时间较长

  • 室内、地下室基本无法使用 

二,Network定位

三角定位:由于每个基站的位置是固定的,手机通过扫描到附近的三个基站的信号,因其必然在这三个基站的共同覆盖范围内,从而利用电磁波在这三个基站间中转所需要时间,来算出手机所在的准确坐标。但因大部分手机都只能获取到单个基站的ID,所以此方法基本无法实行

单基站定位:利用获取最近的基站的信息,其中包括基站ID,lac、mcc、mnc和信号强度,将这些数据发送到Google的定位Web服务里,就能拿到当前所在的位置信息,误差一般在几十米到几百米之内。其中信号强度这个数据很重要

优点:

  • 只要网络通畅即可定位

  • 可以在室内使用

缺点:

  • 精确度很差,一般有几百米,甚至上千米的误差。误差和基站的信号覆盖半径有关,Wifi覆盖半径大概100米左右,而基站则到千米级别

三,WIFI定位

根据一个固定的WifiMAC地址,通过收集到的该Wifi热点的位置,然后访问网络上的定位服务以获得经纬度坐标。因为它和基站定位其实都需要使用网络,所以在Android也统称为Network方式。

优点:

  • 精度相对GPS差一点,但也能到十几米、几十米的误差

  • 低耗电

四,IP定位

根据设备上获得的IP地址,访问网络上的定位服务以获得经纬度坐标

五,AGPS定位

辅助全球卫星定位系统,结合GSM或GPRS与传统卫星定位,利用基站代送辅助卫星信息,缩减GPS芯片获取卫星信号的延迟时间,受遮盖的室内也能借基站讯号弥补,减轻GPS芯片对卫星的依赖度

优点:

  • 在室外等空旷地区,其精度在正常的GPS工作环境下,可达10米左右,堪称目前定位精度最高的一种定位技术

  • 首次捕获GPS信号的时间一般仅需几秒,不像GPS的首次捕获时间可能要2~3分钟

缺点:

  • 需要在手机内增加GPS接收机模块,并改造手机天线,同时要在移动网络上加建位置服务器、差分GPS基准站等设备。如果要提高该方案在室内等GPS信号屏蔽地区的定位有效性,该方案还提出需要增添类似于EOTD方案中的位测量单元(LMU)。

虚拟定位与检测防护 

一,开发者模式下,打开设置里面的模块位置开关,进行虚拟定位。

防护措施:

1,通过系统Api可检测到是否打开了模拟定位开关

Settings.Secure.getInt(context.getContentResolver(),
 Settings.Secure.ALLOW_MOCK_LOCATION, 0) != 0;

2,在定位前先调用removeTestProvider方法,移除虚拟定位。

二,使用模拟器进行虚假定位

在PC上安装模拟器,使用一些特定软件模拟虚假IP,达到虚拟定位的效果

防护措施:

在Android中通过系统Api检测当前设备是否是模拟器,进行相关的提醒与限制。

boolean isEmulator = Build.FINGERPRINT.contains("generic")
        || Build.FINGERPRINT.contains("vbox")
        || Build.FINGERPRINT.contains("generic_x86")
        || Build.FINGERPRINT.contains("emulator")
        || Build.FINGERPRINT.contains("simulator");

三,使用xposed对获取定位的软件进行Hook修改获取的经纬度

xposed使用的前提是需要当前设备拥有root权限,针对root过的设备进行hook修改系统的api,致使获取经纬度的应用获取到虚假的经纬度

防护措施:

针对此种方案,目前只能检测当前设备是否root,做相应的提醒或限制处理,无法做到实质的防护处理。

检测当前设备是否Root

public boolean isRooted() {
    Process process = null;
    try {
        process = Runtime.getRuntime().exec(new String[]{"su", "-c", "whoami"});
        BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
        String line;
        while ((line = reader.readLine()) != null) {
            if (line.trim().equals("root")) {
                return true;
            }
        }
        return false;
    } catch (IOException e) {
        return false;
    } finally {
        if (process != null) {
            process.destroy();
        }
    }
}

四,反编译App,修改源码,植入虚拟定位相关逻辑

防护措施:

1,针对定位核心代码进行混淆处理,对apk进行加固,增加破解难度。

2,检测当前设备是否安装了模拟定位的软件。

fun areThereMockPermissionApps(context: Context): Boolean {
    var count = 0
    val pm = context.packageManager
    val packages = pm.getInstalledApplications(PackageManager.GET_META_DATA)
    for (applicationInfo in packages) {
        try {
            val packageInfo = pm.getPackageInfo(applicationInfo.packageName,
                PackageManager.GET_PERMISSIONS)            // Get Permissions         
            val requestedPermissions = packageInfo.requestedPermissions
            if (requestedPermissions != null) {
                for (i in requestedPermissions.indices) {
                    if (requestedPermissions[i] == "android.permission.ACCESS_MOCK_LOCATION" && applicationInfo.packageName != context.packageName) {
                        count++
                    }
                }
            }
        } catch (e: NameNotFoundException) {
            Log.e("Got exception " + e.getMessage())
        }
    }
    return count > 0
}

五,重新编译修改Android系统,然后烧录相关设备

防护措施:

暂无解

  • 11
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值