写点什么

模拟定位原理

用户头像
BUG侦探
关注
发布于: 2 小时前
模拟定位原理

背景描述

越来越多的 Spam 用户通过位置模拟的方式,将自己的位置伪造成任意地点。通过发布有暗示性内容的动态进行用户引流或者杀猪盘操作。今天不讨论这些 spam 用户,单纯从技术的角度分析一下位置模拟是怎么实现的。

目前常见位置信息模拟方式


  • 基于开发者模式的位置修改

实现方式:使用 Android 系统自带的调试 API,模拟 GPS Provider 的结果,从而实现模拟位置的功能。即利用手机自带的位置模拟功能,修改用户获取的位置信息。

Android 系统,在开发者模式中开启允许模拟位置。Android 6.0 以上的系统中开发者模式中去除了”允许模拟器位置“选项,但是增加了”选择模拟位置信息应用“选项。可以通过该选项,选择要开启模拟位置的应用,便可以通过 addTestProvider 进行位置信息模拟;


try {    //开启模拟位置服务    mLocationManager.addTestProvider(LocationManager.GPS_PROVIDER, false, false, false, false, true, true, true, 0, 5);    mLocationManager.setTestProviderEnabled(LocationManager.GPS_PROVIDER, true);} catch (Exception e) {    return false;}
......public Location getLocation() { mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); if (mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mLocationListener); mLocationManager.addNmeaListener(mNmeaListener); } return mlocation;}
复制代码


  • 基于 Hook 方式的位置修改

实现方式:对手机 Root 以后,利用 Hook 框架拦截系统或者地图类 SDK 获取位置信息的 API,并用伪造的位置数据替换原有的位置数据,从而实现模拟位置的功能。

以高德地图为例,通过 Xposed 框架对高德地图中获取位置信息的函数进行 Hook,从而达到修改位置信息的目的:


XposedHelpers.findAndHookMethod(Location.class, "getLongitude", new XC_MethodHook() {    @Override    protected void afterHookedMethod(MethodHookParam param) throws Throwable {
XposedBridge.log("修改经度坐标");
param.setResult(118.294623); }});
XposedHelpers.findAndHookMethod(Location.class, "getLatitude", new XC_MethodHook() { @Override protected void afterHookedMethod(MethodHookParam param) throws Throwable {
XposedBridge.log("修改纬度坐标");
param.setResult(38.665846); }});
复制代码


  • 基于虚拟容器的位置修改

实现方式:将 APP 安装在虚拟容器内,虚拟容器通过将应用注册到虚拟空间中。以 Xposedvirtual 为例,它是一套插件框架,允许应用以插件的方式运行在其构造的虚拟空间中,并自带 Root 权限和 Xposed Hook 框架,且宿主机无需 Root。这样便可以在任意的设备上利用 Hook 框架拦截系统或者地图类 SDK 获取位置信息的 API,并用伪造的数据替换原有的位置数据,从而实现模拟位置的功能。



  • 基于模拟器的位置修改

实现方式:将 APP 安装在模拟器内,利用模拟器提供的位置修改功能修改模拟器的位置信息,从而实现模拟位置的功能。

以夜神模拟器为例,修改模拟器的位置信息:



  • 基于修改系统源码的位置修改

实现方式:修改 Android 系统源码并编译打包,将系统中获取位置信息的 API 暴露出来,暴露的接口可以接收外部自定义的位置信息。当 APP 调用获取位置相关的 API 时,可以通过暴露的接口传入指定的位置信息,从而实现模拟位置的功能。







发布于: 2 小时前阅读数: 5
用户头像

BUG侦探

关注

还未添加个人签名 2021.06.08 加入

专注于发掘程序员/工程师的有趣灵魂,对工作中的思路与总结进行闪光播报。

评论

发布
暂无评论
模拟定位原理