Следующая новость
Предыдущая новость

Фиктивный адрес. Как подменить геолокацию на Android, чтобы обманывать приложения

09.07.2020 14:42
Фиктивный адрес. Как подменить геолокацию на Android, чтобы обманывать приложения

Содержание статьи

  • Реверсим FakeGPS
  • Пишем код
  • Тестируем
  • Исправляем ошибки

В Android существует замечательная возможность назначать поставщиком геокоординат любую программу, и вся система будет использовать те широту и долготу, которые она выдаст. В этой статье я покажу, как этим пользоваться и как самому написать программу для спуфинга координат GPS.

Идея родилась у меня в процессе написания статьи «Мониторим мониторинг. Что внутри у приложения для изоляции на дому» — именно тогда я обнаружил возможность менять поставщика координат в операционной системе, что открывает для пользователей много интересных возможностей.

С точки зрения юзера все очень просто: нужно лишь установить специальное приложение, затем включить в настройках режим разработчика и выбрать установленное приложение в качестве поставщика фиктивного местоположения. Таких программ великое множество — от простеньких до довольно развесистых, умеющих не только подменять координаты на заданные, но и менять их по расписанию или проигрывать заранее записанные треки, чтобы имитировать движение телефона по какому-то маршруту. В общем, вбивай запрос «Fake GPS» и выбирай по вкусу.

Сразу предупреждаю: надежность этого метода не очень высокая. При желании можно программно отследить наличие на телефоне такой программы-поставщика, и если программа серьезная, то просто так обдурить ее может не получиться.

Я же захотел разобраться, как именно работает этот механизм, и создать собственное приложение для спуфинга. А начал я с того, что посмотрел, как этот алгоритм реализован в одном из бесплатных приложений. Не читать же документацию, верно?

Реверсим FakeGPS

В качестве подопытного кролика было взято приложение FakeGPS 5.0.0. Внешне приложение представляет собой карту, на которой можно установить маркер в произвольную точку и с помощью кнопок «Старт» и «Стоп» запускать или останавливать трансляцию координат выбранной точки.

Вооружившись JEB Decompiler, открываем и смотрим. Первое, что бросается в глаза, — это наличие в манифесте пермишена android.permission.ACCESS_MOCK_LOCATION.

<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" /> <uses-permission android:name="android.permission.WRITE_SETTINGS" /> <uses-permission android:name="com.android.vending.BILLING" /> 

В основной активити ничего интересного не обнаружено, обычная инициализация и настройка, но есть сервис с говорящим названием FakeGPSService.

Попытаемся прорваться сквозь дебри обфускации и посмотреть, что в нем есть интересного.

В методе onCreate имеется такой код:

this.f = "gps"; this.d = (LocationManager)this.getSystemService("location"); try {   if(this.d == null) {     goto label_46;   }   this.d.removeTestProvider(this.f);   goto label_46; } catch(IllegalArgumentException | NullPointerException unused_ex) {   goto label_46; }  label_46: if(this.d != null) {   this.d.addTestProvider(this.f, false, false, false, false, true, false, false, 0, 5);   this.d.setTestProviderEnabled(this.f, true); } 

Если проще, то инициализируем LocationManager значением this.getSystemService("location"), затем удаляем тестового провайдера
"gps" функцией removeTestProvider и добавляем заново с помощью функции addTestProvider, не забывая после этого включить его функцией setTestProviderEnabled("gps", true). Всё, тестовый провайдер добавлен и включен. А далее при изменении пользователем координат создаем и устанавливаем новое местоположение в функции onEventMainThread:

// Создаем long v1 = System.currentTimeMillis(); Location v3 = new Location(""); v3.setProvider("gps"); v3.setLatitude(arg10.latitude); v3.setLongitude(arg10.longitude); v3.setAltitude(((double)FakeGPSService.p)); v3.setBearing(((float)FakeGPSService.q)); v3.setTime(v1); v3.setAccuracy(((float)FakeGPSService.o)); v3.setElapsedRealtimeNanos(SystemClock.elapsedRealtimeNanos());  // И устанавливаем try {   this.d.setTestProviderLocation(this.f, v3);   Log.d("GpsMockProvider", v3.toString()); } catch(IllegalArgumentException unused_ex) { } 

Вроде бы все более-менее ясно, можно приступать к написанию своего провайдера фиктивных местоположений.

Продолжение доступно только участникам

Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».

Присоединяйся к сообществу «Xakep.ru»!

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», увеличит личную накопительную скидку и позволит накапливать профессиональный рейтинг Xakep Score! Подробнее

1 год

7690 р.

1 месяц

720 р.

Я уже участник «Xakep.ru»

Источник

Последние новости