【问题标题】:How does some apps(wechat) ignore fake location and then detect the real one?一些应用程序(微信)如何忽略虚假位置,然后检测到真实位置?
【发布时间】:2016-09-07 14:05:07
【问题描述】:

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

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

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

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

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

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


我的尝试

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

更新

即使在禁用时也使用 GPS。

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


结论

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

【问题讨论】:

  • 我想知道它是否取决于应用程序用来获取位置的 api。据推测,谷歌地图将使用 google play api,就像大多数使用位置的应用程序一样。微信可能正在使用本机 sdk 中的 android 位置管理器,并且可能不受虚假位置应用程序的影响。试一试。
  • 我们可以理解接收到的位置是假的还是真的,没有问题。问题是微信如何检测真实位置,而 LocationManager 和 FusedLocationProvider 提供固定的假位置。
  • 反对者,这个问题有什么问题?
  • @Blackkara 您是否在 API 23 设备上进行测试,其中删除测试提供程序不起作用?当您试图伪造并实际移动时,微信是否仍会检测到您的位置(即您的虚假位置不会改变,但真实的位置会改变,并且微信可以检测到这一点)?
  • @Timur_C 我发布了第二个回复。这也间接回答了您的问题。

标签: android location android-gps


【解决方案1】:

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

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

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

欲了解更多信息,请参阅adding a NmeaListener
NMEA 语句 GGA 和 GSV 如下所示

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 - 卫星视图显示有关卫星的数据,该设备可能会根据其查看掩码和历书数据找到这些卫星。它还显示了当前跟踪此数据的能力。请注意,一个 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

【讨论】:

  • 要检查虚假位置,大多数应用程序会在它们收到的 NMEA(美国国家海洋电子协会)数据中查找 GGA 和 GSV 语句: 还有 GPRMC。但这不是正确的方法。因为某些设备不发送这些句子(或其中任何一个)例如我的测试设备(samsung galax s3)只发送 $PGLOR 句子而没有欺骗。
  • 伪造的位置提供者不会将 NMEA 语句与位置一起发送: 没关系,当您欺骗 gps 时,将不会收到任何语句。
  • 重复此过程,直到收到一组有效的 NMEA 语句,然后选择相应的位置。 : 即使他们将当前提供者标记为欺骗(GPS),也无法在欺骗后接收 nmea 语句。此外,意味着无法获取位置。
【解决方案2】:

一些 3rd 方位置 sdk,如百度位置 SDK,不反映系统设置的虚假位置。

这是出于安全目的。

【讨论】:

  • 微信用百度是对的。可悲的是,似乎不可能欺骗微信。我说的对吗?
  • 这并没有回答他们是如何做到的。这个BaiduLocationSDK 使用了哪些Android API?
  • @Timur_C 没有关于BaiduLocationSDK的英文文档,但我看到一些中文博客解释了它如何接收位置。它不使用 LocationManager(或融合的提供者)来接收位置。它使用 H.A.L(硬件抽象层),直接与 GPS 硬件而不是 android API 通信。这就是为什么微信不受任何通过 LocationManager 进行的欺骗的影响。
  • 所以,如果可以在硬件层面欺骗GPS,那么我们也可以欺骗BaiduLocationSDK和微信。
  • 我的猜测是 NMEA 是 HAL(看起来很低级)。我在文档中找不到任何其他 API。
【解决方案3】:

我在 cmets 中提问的原因是希望你测试一下微信对不同情况的反应。

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

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

【讨论】:

  • getLastKnownLocation(String provider) : 在不断欺骗 GPS 和 NETWORK 提供者的同时,getLastKnownLocation(String provider) 方法返回每个提供者的模拟位置,onLocationChanged 回调方法也提供模拟位置.当我查看谷歌地图应用程序时,它显示模拟位置,但微信检测到我的真实位置。 IP 地址地理位置: 同时,在第一种方法中,我通过 VPN 应用程序欺骗了 IP 地址。例如,我更改为 ip Singapure。但微信仍然检测到我的真实位置。
  • GPS NMEA 监听器:我没有对此进行测试。但它的来源是 GPS,我已经欺骗了 GPS 提供商。所以没有什么不同。 Nmea 字符串将包含我的模拟位置的值。
  • @Blackkara 您是否尝试过在欺骗位置的同时实际移动设备?移动时微信是否正确跟踪?微信定位有多精确?如果它是国家级的,您可以使用电话管理器(请参阅我编辑的答案)。我认为 NMEA 监听器值得测试,它可能处于不同的级别并且不可欺骗。
  • 微信定位有多精确? : 谷歌地图显示我的位置模拟时,它完美地确定了我的真实位置,因此 TelephonyManager 选项将无法治愈。 Timur,当您欺骗 GPS 提供商(或其他任何提供商)时,它会影响整个 android 系统。不仅是特定于应用程序的 AFAIK。我不认为,但我会使用 NMEA 选项。
【解决方案4】:

@善意

然后您可以从 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
// ....

因此,这种方法会导致在位置伪造应用程序上抛出 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) {}
}

一切都很完美,但在微信之外

【讨论】:

    【解决方案5】:

    如果设置了ALLOW_MOCK_LOCATION 并将TestProvider 添加到LocationManager,则可能存在虚假位置。要获取真实位置,您需要执行以下两个步骤:

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

    结帐Jambaaz answer 以获取如何在代码中工作的示例。

    注意:要删除TestProvider,您需要权限android.permission.ACCESS_MOCK_LOCATION,而ALLOW_MOCK_LOCATION 现在自API 23 起已弃用。您现在可以直接从@ 检查位置是否来自TestProvider 987654324@

    【讨论】:

    • 我想测试 Jambaz 的答案。但是, removeTestProvider() 方法需要 android.permission.ACCESS_MOCK_LOCATION 权限。你有没有测试过这个?
    • 是的,很遗憾它需要这个权限。我自己没有尝试过,但它在技术上应该可以工作,而且它适用于 Jambaaz。
    • 我确实测试了所有关于欺骗位置的合理方法,但我对微信不走运。在我的第二篇文章中,我解释了如何克服 jambaaz 的答案。
    【解决方案6】:

    我已经设法用微信和 zalo 来欺骗位置,看起来都一样困难。

    我会加载一个模拟位置和假 gps 应用程序。设置我的位置。检查地图,看看它是否正确,甚至可以在世界各地移动并且它正在工作。

    但是微信和zalo不同意,他们说我在地下室lol。

    然后我卸载假 gps 应用程序(可能能够强制停止和禁用)并转到微信并清除位置等,然后再试一次,它通常会将我移动到假 gps 位置。关闭微信应用程序后,它不会保持这种状态。这是暂时的。

    这可能并不容易做到,但可能会给某人一个提示或路径。

    【讨论】:

      猜你喜欢
      • 2017-01-02
      • 2012-02-28
      • 1970-01-01
      • 2014-04-04
      • 2014-11-10
      • 2014-11-04
      • 1970-01-01
      • 1970-01-01
      • 2017-07-22
      相关资源
      最近更新 更多