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

我已经安装了一个假的位置应用程序,并设置我的位置不同。 然后打开Goog​​le地图和微信应用程序,

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

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

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

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

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


我曾试过

  • GPS提供商恶搞
  • networking提供商恶搞
  • 融合的位置提供商恶搞
  • IP地理位置欺骗
  • Gps提供商恶搞+ IP地理位置恶搞

UPDATE

即使禁用,也使用GPS。

在这里输入图像说明

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


结论

  • 您可以伪造旧版微信(低于6.0)的位置,
  • 使用类似BaiduLocationSDK的东西。 它不受任何通过LocationManager和Fused供应商的模拟尝试的影响。
  • 我不确定,但似乎BaiduLocationSDK通过硬件级别使用GPS。

某些第三方位置sdk(如BaiduLocationSDK)不反映系统设置的虚假位置。

这是为了安全目的。

@善意

然后,您可以从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应用程序的位置抛出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

我在评论中提问的原因是,我希望你能testing微信如何回应不同的情况。

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

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

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

为了检查假的位置,大多数应用程序在他们收到的NMEA (National Marine Electronics Association)数据中寻找GGAGSV句子。 假的位置提供者不会随着位置发送NMEA句子,所以这个参数可以用来
如果他们还没有收到GGAGSV句子的时间阈值,比如说100秒,他们就会标记当前的位置提供者。
重复这个过程直到收到一组有效的NMEA句子,然后select相应的位置。

要检索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<br/> 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可能包含未被用作解决scheme的一部分的卫星,因此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

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

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

结帐Jambaaz答案来得到一个例子如何在代码中工作。

注意:要删除一个TestProvider你需要权限android.permission.ACCESS_MOCK_LOCATIONALLOW_MOCK_LOCATION现在已经不赞成API 23了。现在你可以检查Location是否来自TestProvider直接从Location.isFromMockProvider()