J'ai installé une fausse application de localisation et modifié mon emplacement. Ensuite, ouvrez Google Maps et l'application Wechat,
Ensuite, je voulais éviter d’analyser mes emplacements réels précédemment reçus et mon nouvel emplacement fictif.
Mais même résultat, il détecte mon emplacement réel.
Je veux vraiment comprendre comment ils font cela. Des idées?
Qu'est-ce que j'ai essayé
MISE À JOUR
Utilise le GPS même lorsqu'il est désactivé.
07-02 11: 46: 15.504 2346-2356 /? D/LocationManagerService: request 434a7e28 demande de gps [ACCURACY_FINE gps demandé = + 1s0ms le plus rapide = + 1s0ms] de com.tencent.mm (10173)
CONCLUSION
Certains sdk d'emplacement tiers, tels que BaiduLocationSDK, ne reflètent pas la configuration de l'emplacement factice par le système.
C'est pour des raisons de sécurité.
La raison pour laquelle je posais les questions dans les commentaires, c’est que j’espérais que vous testiez la façon dont Wechat répond à différentes conditions.
Il existe deux autres moyens de détecter l’emplacement du périphérique que TestProvider
ne devrait pas affecter AFAIK. Ceci a besoin d'être testé mais voici quelques idées:
Edit: a ajouté l'option du gestionnaire de téléphonie.
Pour rechercher un faux emplacement, la plupart des applications recherchent les phrases GGA
et GSV
dans les données NMEA (National Marine Electronics Association)
qu'ils ont reçues. Les faux fournisseurs d’emplacement n’envoient pas de phrases NMEA avec l’emplacement. Ce paramètre peut donc être utilisé pour:
S'ils n'ont pas reçu et GGA
et GSV
phrases dans un laps de temps minimal, disons 100 secondes, ils signalent en rouge le fournisseur de localisation actuel.
Ce processus est répété jusqu'à ce qu'un ensemble valide de phrases NMEA ait été reçu, puis l'emplacement correspondant soit sélectionné.
Pour récupérer les données NMEA, LocationManager#addNmeaListener(GpsStatus.NmeaListener listener)
est appelé puis dans le programme d'écoute
void onNmeaReceived(long timestamp, String nmea) {
Log.d("Nmea Data",nmea);
}
pour plus d'informations, voir ajout d'un NmeaListener
les phrases NMEA, GGA
et GSV
se présentent comme suit
GGA - données de réparation essentielles fournissant des données de localisation et de précision 3D.
Exemple: "$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 - Satellites in View affiche les données relatives aux satellites que l'unité peut éventuellement trouver en fonction de son masque de visualisation et de ses données d'almanach. Il montre également la capacité actuelle de suivre ces données. Notez qu'une phrase GSV seulement peut fournir des données pour un maximum de 4 satellites et qu'il peut donc être nécessaire d'avoir 3 phrases pour l'information complète. Il est raisonnable que la phrase GSV contienne plus de satellites que ce que GGA pourrait indiquer, car GSV peut inclure des satellites qui ne font pas partie de la solution. Il n'est pas nécessaire que les phrases GSV apparaissent toutes en séquence. Pour éviter de surcharger la bande passante des données, certains destinataires peuvent placer les différentes phrases dans des échantillons totalement différents, chaque phrase identifiant la phrase en question.
Exemple: "$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 *
Source: NMEAData
@Authentique
Ensuite, vous pouvez supprimer TestProvider de LocationManager et obtenir l'emplacement réel.
Même si nous utilisions cette approche avant de demander des mises à jour d'emplacement, pour éviter que les fournisseurs ne soient imités par d'autres applications , comme ci-dessous
// HERE WECHAT APP
// WECHAT REMOVES THEM IF ANY (just supposition)
locationManager.removeTestProvider(LocationManager.GPS_PROVIDER);
locationManager.removeTestProvider(LocationManager.NETWORK_PROVIDER);
// WECHAT REQUESTING LOCATION UPDATES
// ....
Donc, cette approche provoque le lancement d’une exception IllegalArgumentException sur l’application de localisation faker. Même dans ce cas, je peux facilement gérer ce problème et continuer à usurper à nouveau les fournisseurs de GPS et de réseau ,
// 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) {}
}
Tout fonctionne parfaitement mais hors de WECHAT
De faux emplacements sont possibles si ALLOW_MOCK_LOCATION
est défini et qu'une TestProvider
est ajoutée à la LocationManager
. Pour obtenir le véritable emplacement, vous devez suivre ces deux étapes:
TestProvider
de la LocationManager
et obtenir l'emplacement réel.Checkout Jambaaz answer pour obtenir un exemple de la manière dont cela fonctionne dans le code.
Remarque: Pour supprimer une TestProvider
, vous devez disposer des autorisations Android.permission.ACCESS_MOCK_LOCATION
et ALLOW_MOCK_LOCATION
est maintenant obsolète depuis l'API 23. Vous pouvez maintenant vérifier si l'emplacement provient d'un fournisseur de test directement à partir de Location.isFromMockProvider()
J'ai réussi à usurper l'emplacement avec wechat et zalo, les deux semblent tout aussi difficiles.
Je voudrais charger un faux emplacement et une fausse application GPS. définir ma position. vérifier les cartes et voir si c'est correct, peut même se déplacer dans le monde et ça marche.
Mais wechat et zalo ne sont pas d'accord, ils disent que je suis dans mon sous-sol lol.
ALORS, je désinstalle une fausse application gps (je peux éventuellement forcer l'arrêt et la désactivation) et je vais sur wechat et effacez l'emplacement, etc. Cela ne restera pas ainsi après la fermeture de l'application wechat. c'est temporaire.
Ce n'est peut-être pas facile à faire, mais cela peut donner à quelqu'un un indice ou un chemin à regarder.