11

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

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

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

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

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

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


我试过的

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

更新

即使在禁用时也使用 GPS。

在此处输入图像描述

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


结论

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

6 回答 6

4

为了检查虚假位置,大多数应用程序会在它们收到的数据中查找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);
}

有关更多信息,请参阅 在 NMEA 语句中添加 NmeaListener,如下所示
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 - 视图中的卫星显示该装置根据其查看掩码和历书数据可能能够找到的卫星数据。它还显示了当前跟踪此数据的能力。请注意,一个 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

于 2016-06-30T19:50:16.043 回答
4

某些 3rd 方位置 sdk (例如百度位置 SDK)不反映系统设置的虚假位置。

是出于安全目的。

于 2016-07-01T19:57:27.763 回答
3

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

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

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

于 2016-06-25T21:03:10.540 回答
2

@善意

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

因此,这种方法会导致在 location 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) {}
}

一切正常,但在微信之外

于 2016-06-25T10:56:03.187 回答
1

如果ALLOW_MOCK_LOCATION设置了并且将 aTestProvider添加到LocationManager. 要获得真实位置,您需要执行以下两个步骤:

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

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

注意:要删除TestProvider您需要的权限android.permission.ACCESS_MOCK_LOCATIONALLOW_MOCK_LOCATION现在自 API 23 起已弃用。您现在可以检查位置是否来自 TestProvider 直接来自Location.isFromMockProvider()

于 2016-05-12T06:42:39.740 回答
0

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

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

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

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

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

于 2018-09-17T05:02:58.283 回答