一些应用程序(微信)如何忽略假位置然后检测真实位置?

我安装了一个虚假的位置应用程序并设置我的位置不同。 然后打开谷歌地图和微信应用,

  • 谷歌地图显示我的位置,我设置(假)
  • 微信应用程序忽略虚假位置并检测真实位置(如何?)

然后我想阻止微信分析我之前收到的真实位置和新假位置。

  • 卸载微信
  • 重启我的设备
  • 将我的位置设为假
  • 再次安装微信

但同样的结果,它检测到我的真实位置。

我真的很想了解他们是如何做到这一点的。 有任何想法吗?


我试过的

  • Gps提供者恶搞
  • 网络提供商恶搞
  • 融合位置提供商恶搞
  • IP地理定位恶搞
  • Gps提供商欺骗+ IP地理定位恶搞

UPDATE

即使在禁用时也使用GPS。

在此处输入图像描述

07-02 11:46:15.504 2346-2356 /? D / LocationManagerService:请求434a7e28 gps从com.tencent.mm请求[ACCURACY_FINE请求gps = + 1s0ms最快= + 1s0ms](10173)


结论

  • 您可以在较旧版本的微信上伪造位置(低于6.0)
  • 使用像BaiduLocationSDK这样的东西。 它不受任何通过LocationManager和Fused提供程序的模拟尝试的影响。
  • 我不确定但是,好像百度位置SDK通过硬件级别使用GPS。

像BaiduLocationSDK这样的第三方位置sdk并不反映系统的假位置设置。

这是出于安全目的。

@善意

然后,您可以从LocationManager中删除TestProvider并获取实际位置。

甚至微信也会在请求位置更新之前使用这种方法, 以避免提供商被其他应用程序欺骗 ,如下所示

// HERE WECHAT APP // WECHAT REMOVES THEM IF ANY (just supposition) locationManager.removeTestProvider(LocationManager.GPS_PROVIDER); locationManager.removeTestProvider(LocationManager.NETWORK_PROVIDER); // WECHAT REQUESTING LOCATION UPDATES // .... 

所以这种方法会导致在faker app上抛出IllegalArgumentException。 即使在这种情况下,我也可以轻松处理这个问题并继续欺骗GPS和NETWORK提供商

 // HERE LOCATION FAKER APP // LOCATION FAKER APP SETS FAKE LOCATIONS while (mRunning){ try { locationManager.setTestProviderLocation(LocationManager.GPS_PROVIDER, gpsLocation); } catch (IllegalArgumentException e){ locationManager.addTestProvider(LocationManager.GPS_PROVIDER, false, false, false, false, false, true, true, 1, 1); locationManager.setTestProviderEnabled(LocationManager.GPS_PROVIDER, true); } try { locationManager.setTestProviderLocation(LocationManager.NETWORK_PROVIDER, networkLocation); } catch (IllegalArgumentException e){ locationManager.addTestProvider(LocationManager.NETWORK_PROVIDER, false, false, false, false, false, true, true, 1, 1); locationManager.setTestProviderEnabled(LocationManager.NETWORK_PROVIDER, true); } gpsLocation.setTime(System.currentTimeMillis()); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { gpsLocation.setElapsedRealtimeNanos(SystemClock.elapsedRealtimeNanos()); } networkLocation.setTime(System.currentTimeMillis()); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { networkLocation.setElapsedRealtimeNanos(SystemClock.elapsedRealtimeNanos()); } try { Thread.sleep(500); } catch (Exception e) {} } 

一切都很完美,但是在WECHAT之外

我在评论中提出问题的原因是我希望你测试Wechat如何响应不同的条件。

还有其他几种检测设备位置的方法, TestProvider不应该影响AFAIK。 这需要测试,但这里有一些想法:

  • LocationManager.getLastKnownLocation(字符串提供程序) – 这允许您强制使用例如GPS提供程序并获取缓存数据。
  • GPS NMEA监听器和API 24中的新 监听器 – 这些API允许使用NMEA 0183协议监听来自GPS硬件的低级事件。
  • IP地址地理位置。
  • 您可以通过Telephony Manager获得国家级地理位置。

编辑:添加了电话管理器选项。

为了检查虚假位置,大多数应用程序在他们收到的NMEA (National Marine Electronics Association)数据中寻找GGAGSV句子。 虚假位置提供商不会发送NMEA句子以及位置,因此可以使用此参数
如果他们没有在阈值时间内收到GGAGSV句子,比如100秒,他们就会对当前位置提供者进行红旗标记。
重复该过程直到已经接收到一组有效的NMEA句子,然后选择相应的位置。

要检索NMEA数据,调用LocationManager#addNmeaListener(GpsStatus.NmeaListener listener)然后在监听器中

 void onNmeaReceived(long timestamp, String nmea) { Log.d("Nmea Data",nmea); } 

有关更多信息,请参阅添加NmeaListener
NMEA句子, GGAGSV如下

GGA – 提供3D位置和准确度数据的基本修复数据。

样品: "$GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,46.9,M,,*47"

 Where: GGA Global Positioning System Fix Data 123519 Fix taken at 12:35:19 UTC 4807.038,N Latitude 48 deg 07.038' N 01131.000,E Longitude 11 deg 31.000' E 1 Fix quality: 0 = invalid 1 = GPS fix (SPS) 2 = DGPS fix 3 = PPS fix 4 = Real Time Kinematic 5 = Float RTK
6 = estimated (dead reckoning) (2.3 feature) 7 = Manual input mode> 8 = Simulation mode 08 Number of satellites being tracked 0.9 Horizontal dilution of position 545.4,M Altitude, Meters, above mean sea level 46.9,M Height of geoid (mean sea level) above WGS84 ellipsoid (empty field) time in seconds since last DGPS update (empty field) DGPS station ID number *47 the checksum data, always begins with *

GSV – 视图中的卫星显示有关卫星的数据,该卫星可以根据其观察掩模和年历数据find。 它还显示了当前跟踪此数据的能力。 请注意,一个GSV语句只能提供最多4个卫星的数据,因此可能需要3个句子才能获得完整信息。 由于GSV可能包括未用作解决方案一部分的卫星,因此GSV句子包含的卫星比GGA可能指示的更多是合理的。 并不要求GSV句子全部按顺序出现。 为了避免数据带宽过载,一些接收器可以将各种句子放在完全不同的样本中,因为每个句子都标识出它是哪一个。

样本: "$GPGSV,2,1,08,01,40,083,46,02,17,308,41,12,07,344,39,14,22,228,45*75"

 Where: GSV Satellites in view 2 Number of sentences for full data 1 sentence 1 of 2 08 Number of satellites in view 01 Satellite PRN number 40 Elevation, degrees 083 Azimuth, degrees 46 SNR - higher is better for up to 4 satellites per sentence *75 the checksum data, always begins with * 

资料来源: NMEAData

如果设置了TestProvider并且将TestProvider添加到LocationManager则可以使用ALLOW_MOCK_LOCATION LocationManager 。 要获得真正的位置,您需要执行以下两个步骤:

  • 检测MockSettings是否已启用以及是否安装了Apps如何伪造该位置。
  • 然后,您可以从LocationManager删除TestProvider并获取实际位置。

Checkout Jambaaz回答了如何在代码中运行它的示例。

注意:要删除TestProvider您需要权限android.permission.ACCESS_MOCK_LOCATIONALLOW_MOCK_LOCATION现在不再使用API​​ 23.您现在可以直接从Location.isFromMockProvider()检查位置是否来自TestProvider