模拟定位原理

背景描述

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

目前常见位置信息模拟方式: 基于开发者模式的位置修改

实现方式:使用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时,可以通过暴露的接口传入指定的位置信息,从而实现模拟位置的功能。


比丘资源网 » 模拟定位原理

发表回复

提供最优质的资源集合

立即查看 了解详情