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

时间:2016-05-11 23:48:44

标签: android location android-gps

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

  • Google地图会将我的位置显示为我设置的内容(假)
  • 微信应用忽略虚假位置,检测真实位置(如何?)

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

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

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

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

我尝试了什么

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

更新

即使在禁用时也使用GPS。

enter image description here

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

结论

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

6 个答案:

答案 0 :(得分:3)

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

出于安全目的。

答案 1 :(得分:2)

@Bona Fide

  

然后你可以从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

答案 2 :(得分:2)

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

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

修改:添加了Telephony manager选项。

答案 3 :(得分:2)

要检查虚假位置,大多数应用会在其收到的GGA数据中查找GSVNMEA (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 - 视图中的卫星显示有关该设备可能根据其查看掩码和年历数据找到的卫星的数据。它还显示了当前跟踪此数据的能力。请注意,一个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

答案 4 :(得分:1)

如果设置了ALLOW_MOCK_LOCATION并且LocationManager添加了TestProvider,则可能会出现假位置。要获得真正的位置,您需要执行以下两个步骤:

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

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

注意:要删除android.permission.ACCESS_MOCK_LOCATION,您需要自API 23以来的权限 String strLine1, strLine2; StringBuffer strFile2 = new StringBuffer(); //Store the contents of File2 in strFile2 while((strLine2 = br2.readLine()) != null) { strFile2.append(strLine2); } //Check whether each line of File1 is in File2 while((strLine1 = br1.readLine()) != null){ if(strFile2.toString().contains(strLine1)){ System.out.println(strLine1); } } ALLOW_MOCK_LOCATION。您现在可以检查位置是否为直接来自Location.isFromMockProvider()

的TestProvider

答案 5 :(得分:0)

我设法用微信和zalo欺骗了位置,两者似乎都一样困难。

我会加载一个模拟位置和伪造的gps应用。设置我的位置。检查地图,看看它是正确的,甚至可以在世界各地移动并且正在运行。

但是微信和扎洛不同意,他们说我在我的地下室里。

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

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