CSGOIndigo

CSGOINDIGO

Активируйте промо-код: SHLYAHTEN и получите 20 бесплатных монет на первые ставки!

Следим за девушкой с помощью Android

Следим за девушкой с помощью Android

Сегодня мы проведем небольшое шпионское исследование и попробуем незаметно собрать данные о передвижении интересующего нас объекта — подруги, ребенка или, скажем, бабушки. Разумеется, с их письменно заверенного разрешения на сбор и обработку личной информации. А как же иначе?

 

 

 

ШПИОН, ВЫЙДИ ВОН

 

Общеизвестно, что любой современный смартфон (или планшет) оснащен модулем системы глобального позиционирования GPS, а то и православным ГЛОНАСС. Но даже если ты умудришься найти аппарат без него, карты Google (и не только) все равно смогут быстро обнаружить тебя на этом многострадальном голубом шарике. Для этого используется методика определения координат с помощью вышек сотовой связи, информацию о положении которых собирают абсолютно все игроки рынка геолокационных сервисов.

Ok, Google, вырубаем GPS и вынимаем симку, запускаем «Карты» и... внезапно снова видим свое положение. Оказывается, информации об окружающих точках Wi-Fi вполне достаточно для определения местоположения смартфона, пускай и не такого точного. В этой связи примечателен давний скандал с «картомобилем» Google, который тихо-мирно себе ездил и снимал улицы, попутно собирая названия всех точек доступа Wi-Fi. Тогда Google заявляла о некоем техническом сбое (!), но мы-то знаем...

Одним словом, смартфон почти всегда сможет определить свою ориентацию в родной Солнечной системе, чем мы и воспользуемся.

 

ОПЕРАЦИЯ «СПЕКТР»

 

Театр начинается с вешалки, а приложение Android — с манифеста. Для доступа к GPS-приемнику необходимо добавить тег в секцию uses-permission:

 

 

Константа ACCESS_FINE_LOCATION задает высокий уровень точности  для определения местоположения пользователя. Есть еще ACCESS_COARSE_LOCATION для более грубой геолокации, но нам она принципиально не интересна. К слову, приложение, которому было выдано полномочие fine, автоматически получает еще и полномочие coarse.

В Android для работы с геолокацией используется специальный интерфейс, предоставляемый  системным  объектом LocationManager:

 

 

Вторая геосоставляющая — LocationProvider, набор источников данных, каждый из которых отражает отдельную технологию поиска местоположения. Так, GPS_PROVIDERосновываетсянаданных, полученныхсоспутников, NETWORK_ PROVIDER шпионит за вышками сотовой связи и Wi-Fi.

Наверное, в твоей голове уже созрел коварный план — периодически запрашивать координаты у GPS_PROVIDER и  NETWORK_PROVIDER (например, с помощью фонового сервиса) и отправлять их в командный центр. Такое решение в лоб, конечно, имеет  право на жизнь, но разве популярнейший журнал о безопасности стал бы о нем писать? Во-первых, это заметно — любое включение GPS отображается в статусной строке значком (рис. 1); во-вторых, это банально сажает батарею, что может заставить владельца задуматься и поискать прожорливое приложение; и, в-третьих, фоновый трафик прекрасно виден в системном журнале.

 

  

 

Специально для нас Google придумала отдельный провайдер  —  PASSIVE_PROVIDER, который получает информацию о местоположении только в том случае, если ее   запрашивает другое приложение. Благодаря этому наш шпион будет получать обновления скрытым образом, без активации какого-либо источника LocationProvider.

 

 

Иными словами, стоит пользователю запустить карту, клиент социальной сети, выйти в интернет, отправить сообщение и далее по списку, как наше приложе ние уже будет в курсе (рис. 2–3). Обратной стороной пассивности (и скрытности) является полное доверие к получаемым данным, мы никак не сможем проверить их достоверность.

 

КООРДИНАТЫ «СКАЙФОЛЛ»

 

Для получения координат от источника данных существует метод getLastKnownLocation:

 

 

Возвращаемый объект Location содержит всю информацию о местонахождении, которую поддерживает источник. Он может включать в себя время, точность полученных координат, широту, долготу, высоту над уровнем моря (вот оно, вмешательство в частную жизнь!) и скорость. Все эти свойства доступны через геттеры:

 

 

Как уже отмечалось, ни PASSIVE_PROVIDER, ни getLastKnownLocation не запрашивают у LocationProvider обновление местоположения. Если смартфон долго не обновлял текущую позицию, полученное значение может быть неактуальным или вовсе не существовать (например, сразу после загрузки).

Если ты снова подумал об использовании фонового сервиса для «дергания» PASSIVE_PROVIDER, спешу тебя огорчить: все гораздо проще. Наш выбор — широковещательный приемник.

 

НА СЕКРЕТНОЙ СЛУЖБЕ ЕЕ ВЕЛИЧЕСТВА

 

Вкратце напомню: в качестве механизма передачи сообщений на уровне системы намерения (Intent) способны отправлять структурированные данные от процесса к процессу (например, информацию от GPS-модуля). Для отслеживания таких данных и реакции на них реализуются специальные объекты — широковещательные приемники. Основное их достоинство (для нас) — они срабатывают даже тогда, когда приложение находится в фоне, а некоторые (например, прием СМС) вообще не требуют запуска родительского приложения.

Каркас нашего приемника представлен ниже:

 

 

Метод onReceive будет срабатывать всякий раз при изменении координат устройства, но сначала приведенный приемник необходимо зарегистрировать в манифесте:

 

 

Далее мы должны настроить частоту срабатывания приемника, иначе любое сколь угодно малое движение объекта наблюдения в пространстве попросту заDoSит наш жучок координатами. В тестовом примере поместим соответствующий код в метод onCreate главной (и единственной) активности:

 

 

Метод requestLocationUpdates, используемый для инициирования регулярных обновлений местоположения, принимает в качестве первого параметра название конкретного типа провайдера — PASSIVE_PROVIDER. Далее следует минимальный интервал и дистанция между обновлениями. В приведенном коде обновления координат будут поступать не чаще, чем раз в минуту (60 000 мс), и только в случае перемещения объекта на 25 м от последней точки. Почему эти числа нужно выбирать как можно аккуратнее, читай на врезке.

 

Последний параметр — ожидающее (или отложенное) намерение, которое и будет передано в широковещательный приемник LocationUpdateReceiver. Объекты PendingIntent используются для упаковки намерений, срабатывающих в ответ на будущие события, как, например, в нашем варианте — получение координат.

К слову, чтобы прекратить выполнение обновлений, вызывается метод removeUpdates:

 

 

Так как наша активность не предполагает никакого взаимодействия с пользователем, не содержит интерфейса, да и вообще работает негласно, логично будет ее закрыть, вызвав метод finish. При этом приемник LocationUpdateReceiver продолжит свою работу как ни в чем не бывало. Кстати, к статье я прикладываю небольшой исходник (естественно, только в мирных отладочных целях), в котором координаты выводятся на экран (рис. 4) в виде всплывающих сообщений (класс Toast).

 

 

И ЦЕЛОГО МИРА МАЛО

 

Итак, у нас есть множество координат объекта, то есть трекинг его передвижения. Возникает вопрос: что с этим массивом информации делать и как его хранить? В сентябрьском выпуске «Хакера» была отличная статья, касающаяся темы хранения пользовательской информации. Для нашей цели подойдет любой из описанных методов — Shared Preferences, Internal/External Storage, SQLite Database или даже Cache Files.

Я выбрал базу SQLite со следующей таблицей:

 

 

О том, как вносить записи в базу SQLite, «Хакер» рассказывает регулярно, так что я не буду касаться этой скучной темы, а вот об отправке накопленных данных поговорим.

Конечно, полученные координаты можно вовсе не помещать в базу данных, а отправлять сразу же, по факту, но весьма высока вероятность, что доступа в интернет в отдельно взятый момент времени не окажется. Кроме того, как мы уже говорили, фоновая передача данных довольно заметна (предполагаем, что у объекта обычный нерутованный смартфон). Другое дело Wi-Fi — отличная скорость, малое время отклика, да и вряд ли кому-нибудь придет в голову изучать трафик (бесплатно же!).

Следующий вопрос — что отправлять? Извлекать каждую строчку из базы и посылать? Можно, но как-то некрасиво, не по-хакерски, что ли. А что, если послать сразу всю базу в виде двоичного файла? Физически база находится в приватной директории приложения и доступна только нам, содержимое таблиц — только числа (размер будет минимальным), Wi-Fi — высокоскоростное подключение. В общем, сплошные плюсы.

Ну а чтобы довести идею до высот перфекционизма, перед отправкой поместим файл базы в архив, благо файлы SQLite очень хорошо сжимаются. Прямо из коробки Android в паре с Java поддерживает работу с архивами формата ZIP. Для архивирования произвольного файла соорудим функцию:

 

 

Путь к базе данных можно получить следующим образом:

 

 

Здесь «com.example.gpsspy» — имя пакета нашего примера, а «имя_базы» задается при ее создании (без расширения). Таким образом, приведенную выше функцию можно использовать так:

 

 

Чтобы не было никаких подвисаний в программе, процедуру архивирования рекомендую вынести в фоновую задачу (AsyncTask).

Полученный архив можно смело отправлять по сети. Механизм доставки будет зависеть от выбранной технологии — это могут быть сокеты, локальная шара, web-интерфейс, анонимный FTP, Wi-Fi Direct и тому подобное.

При использовании сокетов подход может быть таким:

 

 

В любом случае потребуется разрешение работы в интернете:

 

 

После передачи файла базу необходимо очистить. Сделать это можно с помощью традиционной SQL-команды DELETE * FROM имя_таблицы, но размер файла в этом случае не уменьшится, либо можно стереть сам файл:

 

 

При следующем обращении к базе данных Android автоматически создаст новый файл.

 

ЛУННЫЙ ГОНЩИК

 

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

Класс WiFiManager представляет собой сервис для работы с Wi-Fi в Андроиде. Он может применяться как для установки соединения с точкой доступа, так и для отслеживания состояния подключения. Так как мы используем пассивный алгоритм работы, то единственное, что нужно сделать, — дождаться активного подключения к точке Wi-Fi и попробовать отправить файл.

Официальный SDK от Google определяет несколько действий для срабатывания широковещательного приемника при изменении статуса Wi-Fi: WIFI_ STATE_CHANGED_ACTION,      SUPPLICANT_CONNECTION_CHANGE_ACTION и NETWORK_STATE_CHANGED. Описывать их смысла нет, так как они банально не работают. Нет, все компилируется и запускается, но приемник не срабатывает. Причина такого поведения мне неизвестна (может быть, Google постепенно превращается в Microsoft?).

В любом случае ситуация вовсе не безвыходная. Независимо от вида соединения (Wi-Fi, 3G, GPRS/EDGE) в Android предусмотрено действие CONNECTIVITY_CHANGE, которое срабатывает при включении и отключении передачи данных. Используя класс ConnectivityManager, предназначенный для управления сетевыми подключениями, мы можем определить тип подключения, что нам и нужно.

Итак, добавляем в манифест разрешения для доступа к состоянию сетевых интерфейсов:

 

 

Определяем широковещательный приемник:

 

 

Наконец, код самого приемника:

 

 

Здесь в цикле перебираются все активные подключения, и, если найдено активное Wi-Fi, базы координат начинают передаваться в командный центр. Отдельно отмечу, что при подключении к точке Wi-Fi данный приемник может сработать несколько раз, имей это в виду.

 

ЗАВТРА НЕ УМРЕТ НИКОГДА

 

Сегодня мы познакомились с пассивным геопозиционированием в Android, научились архивировать и отправлять базу данных SQLite по сети, а также познакомились с разными видами широковещательных приемников. Одним словом, с основными инструментами тайного агента!

 

Шаровая молния

 

Данные GPS, возвращаемые методом getLastKnownLocation или широковещательным приемником, не изменятся, пока хотя бы одна программа не запросит обновление местоположения. В итоге при первом запуске эмулятора getLastKnownLocation, скорее  всего,  вернет  null, а приемник и вовсе откажется срабатывать.

Чтобы это исправить, можно воспользоваться следующим трюком:

 

 

Поместив это код в OnCreate активности, мы заставим приложение непрерывно опрашивать координаты, что приведет к срабатыванию нашего же широковещательного приемника. Разумеется, после отладки этот код на стероидах нужно выжечь раскаленным железом. Не забудь!

 

 

УМРИ, НО НЕ СЕЙЧАС

 

При настройке requestLocationUpdates мы указывали минимальный  промежуток  времени и приемлемое расстояние для срабатывания широковещательного приемника. Android 5 очень внимательно следит за всеми приложениями, запрашивающими координаты (даже  в пассивном режиме), и выискивает наиболее прожорливые. Чтобы не попасть в топ, старайся устанавливать как можно большие значения для минимального временного интервала и дистанции между обновлениями.

 

 

ИЗ РОССИИ С ЛЮБОВЬЮ

 

Геокодирование в Android позволяет переводить координаты (широту и долготу) в уличный адрес и наоборот. Чтобы получить строку с адресом, можно воспользоваться этой функцией:

 

 

Метод getFromLocation вернет список адресов, которые так или иначе совпадают с переданными координатами. В рассмотренном примере берется только первый адрес, из которого извлекаются все дополнительные строки, после чего добавляется область, почтовый индекс и страна. Точность этой информации зависит от детализации карт региона в сервисе Google Maps.

 

БРИЛЛИАНТЫ  НАВСЕГДА

 

Для перевода старого доброго UNIX-time в формат, понятный нам и шпионам, можно использовать Java-объект «Календарь» (Calendar):

 

 

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

7 2Rabbit Android / Статьи 2 930 12 декабрь 2015

Рекомендуем также

Как используя смартфон остаться анонимным?
Как используя смартфон остаться анонимным?

За последние годы отношение к конфиденциальности личной жизни стало куда более серьезным. Хранение...

Безопасность смартфона рутованного и не только
Безопасность смартфона рутованного и не только

Все кто делает root на своем смартфоне сталкивается с одной серьезной проблемой — резким...

AIDA64
AIDA64

Популярная программа для вывода системной информации...

PixelKnot или Как скрыть информацию в картинке?
PixelKnot или Как скрыть информацию в картинке?

Pixelknot это Android приложение, которое позволяет пользователям скрывать текстовые сообщения в...


Комментарии (2)

Kris Masera Гости 19 декабря 2015 09:14
А женский пол то у нас превередлив, им Android страшен, IOS красив.
JohnnyBobber Посетители 26 сентября 2016 01:05 Не в сети
Цитата: Kris Masera
А женский пол то у нас превередлив, им Android страшен, IOS красив.

Во истину мудрейшие слова

Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.

iOS cydia small iconRepo [cydia.shlyahten.ru]

G iconGAPPS (все версии)