web-dev-qa-db-ja.com

一部のアプリ(wechat)はどのように偽の場所を無視してから実際の場所を検出しますか?

偽のロケーションアプリをインストールし、ロケーションを変更しました。次に、GoogleマップとWechatアプリを開き、

  • Googleマップでは、現在地を設定したものとして表示します(偽)
  • Wechatアプリignores偽の場所とdetects実際の場所(方法?)

次に、以前に受け取った実際の場所と新しい偽の場所をwechatが分析しないようにしたかったのです。

  • Wechatをアンインストールしました
  • デバイスを再起動しました
  • 現在地を偽物として設定する
  • Wechatを再度インストールしました

しかし、同じ結果で、実際の位置が検出されます。

私は本当に彼らがこれをどのように行うかを理解したいです。何か案は?


私が試したこと

  • GPSプロバイダーのなりすまし
  • ネットワークプロバイダーのなりすまし
  • 融合ロケーションプロバイダーのなりすまし
  • IPジオロケーションスプーフィング
  • GPSプロバイダースプーフィング+ IPジオロケーションスプーフィング

[〜#〜] update [〜#〜]

無効な場合でもGPSを使用します。

enter image description here

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


[〜#〜]結論[〜#〜]

  • Wechatの古いバージョン(6.0未満)で場所を偽装できます
  • BaiduLocationSDKのようなものを使用します。 LocationManagerおよびFusedプロバイダーを介したモック試行の影響を受けません。
  • よくわかりませんが、BaiduLocationSDKはハードウェアレベルでGPSを使用しているようです。
10
blackkara

BaiduLocationSDKのような一部のサードパーティのロケーションSDKは、システムごとの偽のロケーション設定を反映していません。

安全のためです。

3
duanbo1983

コメントで質問したのは、Wechatがさまざまな条件にどのように反応するかをテストしてほしいと願っていたからです。

TestProviderがAFAIKに影響を与えないデバイスの場所を検出する方法は他にもいくつかあります。これはテストが必要ですが、ここにいくつかのアイデアがあります:

編集:テレフォニーマネージャーオプションを追加しました。

2
Timur_C

偽の場所を確認するために、ほとんどのアプリケーションは、受信した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);
}

詳細については、 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 [〜#〜]-ビューのサテライトには、ユニットが実行できるサテライトに関するデータが表示されます表示マスクと暦データに基づいて検索します。また、このデータを追跡する現在の能力も示しています。 1つの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

2
Sakchham

@本物の

次に、LocationManagerからTestProviderを削除して、実際の場所を取得できます。

Wechatでさえ、ロケーションの更新をリクエストする前にこのアプローチを使用しますプロバイダーが他のアプリケーションになりすますのを防ぐため

// 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) {}
}

すべてが完全に動作しますが、WECHAT以外

2
blackkara

_ALLOW_MOCK_LOCATION_ が設定され、TestProviderLocationManagerが追加されている場合、偽の場所が可能です。実際の位置を取得するには、次の2つの手順を実行する必要があります。

  • MockSettingsが有効になっているかどうか、およびインストールされているアプリがあるかどうかを検出して、場所を偽装する可能性があります。
  • 次に、TestProviderからLocationManagerを削除して、実際の場所を取得できます。

チェックアウト Jambaaz answer これがコードでどのように機能するかの例を取得します。

注:TestProviderを削除するには、パーミッション_Android.permission.ACCESS_MOCK_LOCATION_および _ALLOW_MOCK_LOCATION_ が必要です=はAPI 23以降廃止されました。ロケーションがTestProviderからのものかどうかを直接確認できるようになりました Location.isFromMockProvider()

1
Bona Fide

Wechatとzaloで場所を偽装しましたが、どちらも同じように難しいようです。

モックの場所と偽のgpsアプリをロードします。私の場所を設定します。マップをチェックして、それが正しいことを確認し、世界中を動き回ることもできます。

しかし、wechatとzaloは同意しません、彼らは私が地下室にいると言います笑。

次に、偽のgpsアプリをアンインストールし(強制的に停止して無効にできる場合があります)、wechatに移動して場所をクリアするなどして、もう一度やり直します。ただし、wechatアプリを閉じた後はそのままになりません。それは一時的なものです。

簡単なことではないかもしれませんが、誰かにヒントやヒントを提供するかもしれません。

0
user10373225