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

标签 android location android-gps

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

  • Google map 将我的位置显示为我设置的(假的)
  • 微信应用忽略虚假位置并检测真实位置(如何?)

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

  • 已卸载微信
  • 重新启动我的设备
  • 将我的位置设为假
  • 重新安装了微信

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

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


我尝试过的

  • GPS 提供商欺骗
  • 网络提供商欺骗
  • 融合位置提供商欺骗
  • IP 地理定位欺骗
  • GPS 提供商欺骗 + IP 地理定位欺骗

更新

即使在禁用时也能使用 GPS。

enter image description here

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


结论

  • 老版本微信(6.0以下)可以伪造位置
  • 使用 BaiduLocationSDK 之类的东西。它不受通过 LocationManager 和 Fused 提供程序进行的任何模拟尝试的影响。
  • 我不确定,但 BaiduLocationSDK 似乎通过硬件级别使用 GPS。

最佳答案

要检查虚假位置,大多数应用程序会查找 GGAGSV NMEA (National Marine Electronics Association)中的句子他们收到的数据。虚假位置提供者不会随位置一起发送 NMEA 语句,因此此参数可用于
如果他们没有收到和 GGAGSV在阈值时间量内说出句子,比如说 100 秒,他们会用红色标记当前位置提供者。
重复此过程,直到收到一组有效的 NMEA 语句,然后选择相应的位置。

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

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

有关详细信息,请参阅 adding a 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 - View 中的卫星显示有关设备根据其查看掩码和年历数据可能能够找到的卫星的数据。它还显示了当前跟踪此数据的能力。请注意,一个 GSV 语句最多只能提供 4 颗卫星的数据,因此可能需要 3 个语句才能提供完整信息。 GSV 语句包含比 GGA 可能指示的更多卫星是合理的,因为 GSV 可能包括未用作解决方案一部分的卫星。不要求 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

关于android - 某些应用程序(微信)如何忽略虚假位置然后检测真实位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37175039/

相关文章:

java - GSON:不调用我的解串器

java - 两个不同 Activity 的两个不同背景会使应用程序崩溃

Android,在熄屏状态下获取位置

java - 为什么location.getSpeed()总是返回0

android - 如何要求用户在应用程序启动时启用 GPS?

java - 为 REST API 客户端证明 GPS 坐标的原点

android - 通过 Flutter 插件访问 ExternalStorageDirectory 的权限被拒绝

android-maven-plugin - 如何设置 apkMetaIncludes?

android - LocationManager 禁用 NETWORK_PROVIDER

ios - 应用程序未运行时基于位置的推送通知?