偽のロケーションアプリをインストールし、ロケーションを変更しました。次に、GoogleマップとWechatアプリを開き、
次に、以前に受け取った実際の場所と新しい偽の場所をwechatが分析しないようにしたかったのです。
しかし、同じ結果で、実際の位置が検出されます。
私は本当に彼らがこれをどのように行うかを理解したいです。何か案は?
私が試したこと
[〜#〜] update [〜#〜]
無効な場合でもGPSを使用します。
07-02 11:46:15.504 2346-2356 /? D/LocationManagerService:要求434a7e28 gps Request [ACCURACY_FINE gps requested = + 1s0ms最速= + 1s0ms] com.tencent.mm(10173)から
[〜#〜]結論[〜#〜]
BaiduLocationSDKのような一部のサードパーティのロケーションSDKは、システムごとの偽のロケーション設定を反映していません。
安全のためです。
コメントで質問したのは、Wechatがさまざまな条件にどのように反応するかをテストしてほしいと願っていたからです。
TestProvider
がAFAIKに影響を与えないデバイスの場所を検出する方法は他にもいくつかあります。これはテストが必要ですが、ここにいくつかのアイデアがあります:
編集:テレフォニーマネージャーオプションを追加しました。
偽の場所を確認するために、ほとんどのアプリケーションは、受信した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
@本物の
次に、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以外
_ALLOW_MOCK_LOCATION
_ が設定され、TestProvider
にLocationManager
が追加されている場合、偽の場所が可能です。実際の位置を取得するには、次の2つの手順を実行する必要があります。
TestProvider
からLocationManager
を削除して、実際の場所を取得できます。チェックアウト Jambaaz answer これがコードでどのように機能するかの例を取得します。
注:TestProvider
を削除するには、パーミッション_Android.permission.ACCESS_MOCK_LOCATION
_および _ALLOW_MOCK_LOCATION
_ が必要です=はAPI 23以降廃止されました。ロケーションがTestProviderからのものかどうかを直接確認できるようになりました Location.isFromMockProvider()
Wechatとzaloで場所を偽装しましたが、どちらも同じように難しいようです。
モックの場所と偽のgpsアプリをロードします。私の場所を設定します。マップをチェックして、それが正しいことを確認し、世界中を動き回ることもできます。
しかし、wechatとzaloは同意しません、彼らは私が地下室にいると言います笑。
次に、偽のgpsアプリをアンインストールし(強制的に停止して無効にできる場合があります)、wechatに移動して場所をクリアするなどして、もう一度やり直します。ただし、wechatアプリを閉じた後はそのままになりません。それは一時的なものです。
簡単なことではないかもしれませんが、誰かにヒントやヒントを提供するかもしれません。