Сегодня в выпуске: отслеживание смартфона с выключенным GPS, взлом продвинутого упаковщика Qihoo, восстановление истории переписки и удаленных сообщений WhatsApp, модификация приложений в рантайме. А также: советы по использованию шифрования в своих приложениях, обзор библиотеки Android KTX, способы распознавания отпечатков, лица и голоса и, конечно же, подборка свежих библиотек.
PinMe: Tracking a Smartphone User around the World — исследование, посвященное отслеживанию перемещений смартфона (и его владельца) без использования GPS, геолокации по базовым станциям и точкам доступа Wi-Fi. Вместо этого исследователи из Института инженеров электротехники и электроники использовали акселерометр, гироскоп, барометр и компас, которые позволили отследить маршрут перемещений с точностью GPS.
Суть метода в следующем. На смартфон устанавливается приложение PinMe. В момент запуска оно получает информацию о последнем IP-адресе смартфона и таким образом определяет его приблизительное местоположение. Затем начинается сбор информации с датчиков, который позволяет определить скорость движения, периодичность остановок и высоту над уровнем моря. Эта информация используется для определения способа передвижения (ходьба, автомобиль, общественный транспорт, самолет) с помощью нейросети. Другая нейросеть используется для определения точного местоположения по косвенным признакам, таким как высота, расписание рейсов и другие данные.
Результат оказался весьма впечатляющим. Исследователям удалось добиться точности, сопоставимой с GPS. Однако есть и ограничения: PinMe не будет работать в лесу и других местах, где нет дорог, он плохо работает в плоской негористой местности с похожей топологией улиц (например, Манхэттен с его квадратными улицами). Также PinMe не сработает, если на смартфоне активирован Tor-туннель (IP-адрес отправной точки будет неправильным).
Каков технический принцип работы PinMe?
Загрузка ...
A Virgil’s Guide to Pentest: Operation Android — основы пентеста для начинающих. Статья довольно сумбурно написана, но из нее можно вынести многие интересные вещи. Например:
ro.build.version.release
, ro.product.model
и ro.product.brand
в эмуляторе стоит изменить. Некоторые приложения используют их для идентификации эмулируемой среды;/system/app/SuperUser.apk
(SuperSU.apk
) и /system/bin/su
.Dissecting mobile native code packers. A case study — анализ приложения, защищенного с помощью упаковщика Qihoo. В статье приведено огромное количество деталей, остановимся на некоторых из них.
Используемые техники защиты от дебаггинга:
/proc/self/status
и проверка, что значение TracerPid равно нулю;/system/bin/linker
) и проверка первого байта функции rtld_db_activity
(если отладчик не подключен — эта функция будет пустой заглушкой);/proc/PID/cmdline
всех процессов (к которым есть доступ) в поисках определенных строк (android_server, gdb, gdbserver и других);/proc/net/tcp
на содержание строки 00000000:23946
(это означает, что к устройству подключен IDA);/proc/self/mem
и /proc/self/pagemap
, чтобы узнать, что никакое другое приложение не прочитало их.Зачем защищать приложение упаковщиком?
Загрузка ...
WhatsApp Forensics: Decryption of Encrypted Databases and Extraction of Deleted Messages on Non-Rooted Android Devices — простая, но в ряде моментов интересная статья о том, как извлечь историю переписки WhatsApp из Android-смартфона. Три основных метода:
msgstore.db
). Она не зашифрована, поэтому ее легко просмотреть с помощью любого SQLite-вьюера.msgstore.db
).В качестве бонуса авторы рассказывают, как в ряде случаев можно восстановить удаленные сообщения. Дело в том, что перед записью сообщения в базу данных WhatsApp сначала пишет его в кеш (файл msgstore.db-wal
), а затем переносит в msgstore.db
. При удалении сообщения оно будет удалено из основной базы, но иногда может остаться в кеше, откуда его легко извлечь.
Mobile Application Hacking Diary Ep.2 — статья с описанием техник, изменяющих поведение приложений Android и iOS, на примере обхода проверок наличия прав root на устройстве. Итак, три разные техники:
android:debuggable
в AndroidManifest.xml на true, запаковываем обратно. Подключаемся к приложению с помощью отладчика AndBug и выполняем трассировку в поисках нужного нам метода. Затем подключаемся к приложению с помощью jdb, ставим брейк-пойнт на нужный метод и изменяем возвращаемое им значение.Зачем может использоваться рантайм-модификация приложений?
Загрузка ...
Developer Brings Full Project Treble Compatibility to the Xiaomi Redmi Note 4 — занятная статья о том, как разработчику с форумов XDA Developers удалось портировать фреймворк Treble на Xiaomi Redmi Note 4.
Напомню, что инициатива Treble предполагает полностью реорганизовать низкоуровневые компоненты Android, ответственные за поддержку железа. Начиная с восьмой версии Android разделен на две части, которые располагаются в разных разделах: vendor
и system
. Первый содержит исключительно код, зависящий от железа: драйверы и компоненты HAL. Второй — это сам Android. Между собой эти части связываются с помощью сообщений и никогда не вызывают друг друга напрямую.
Идея здесь в том, что новые версии ОС, выпущенные после Android 8, будут полностью совместимы с vendor-компонентами от предыдущих версий, таким образом сам процесс портирования прошивки существенно упростится (на самом деле Google даже выпускает сборку Android под названием Generic System Image, ее можно прошить на любой смартфон с поддержкой Treble, и она заработает). Проблема в том, что требование поддерживать Treble распространяется только на смартфоны, изначально работающие на Android 8, и ее вряд ли получат устройства, выпущенные с Android 6 или 7 и лишь затем обновленные до восьмой версии.
Разработчик abhishek987 обошел эту проблему. Он портировал компоненты Treble на Xiaomi Redmi Note 4, использовав раздел cust, нужный MIUI для хранения информации об устройстве, в качестве раздела vendor.
Поддержка Treble на Xiami Redmi Note 4 |
Basic Android Encryption Do’s and Don’ts — статья с набором быстрых советов о том, что надо и что не надо делать при использовании шифрования в Android. Краткая выжимка:
Не используй AES в режиме ECB. По умолчанию Android (и Java) при шифровании по алгоритму AES применяет режим ECB. Проблема режима ECB в том, что он может раскрыть подробности зашифрованной информации. Вместо него следует использовать режимы CBC и GCM:
// Как надо делать Cipher.getInstance("AES/GCM/NOPADDING"); // Как не надо делать Cipher.getInstance("AES");
Всегда используй случайный IV:
// Как надо делать SecureRandom secureRandom = new SecureRandom(); byte[] iv = new byte[IV_LENGTH]; secureRandom.nextBytes(iv); myCipher.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(iv)); // Как не надо делать myCipher.init(Cipher.ENCRYPT_MODE, key); byte[] iv = myCipher.getIV();
Заполняй важные массивы нулями после использования. Ты можешь забыть очистить массив, содержащий ключ, и взломщик воспользуется этим, чтобы извлечь ключ напрямую из оперативной памяти:
byte[] decrypt(byte[] dataToDecrypt, byte[] secretKey) { // Расшифровываем данные ... // Очищаем ключ Arrays.fill(secretKey, (byte) 0); return decryptedData; }
How to secure your Android application? — статья с немного неуместным названием о том, как использовать распознавание пальцев, лица и голоса в своих приложениях. Никаких откровений, все просто:
val fmanager = FingerprintManagerCompat.from(getApplicationContext()) fmanager.authenticate(cryptoObject, 0, cancellationSignal, authenticationCallback, null)
Распознавание лиц. Здесь у разработчика два пути: либо использовать библиотеку OpenCV, предназначенную для реалтайм-распознавания объектов на изображении (внимание: это не нейросеть), либо воспользоваться услугами Microsoft и Google. Проблема последнего варианта в том, что сервисы MS и Google платные и требуют постоянного подключения к сети.
Распознавание голоса. Три наблюдения: 1) Google Assistant умеет определять человека по голосу; 2) в ранних версиях Android 5.0 была функция Trusted Voice, которая позволяла разблокировать смартфон голосом; 3) Google не предоставляет сторонним разработчикам никаких API для распознавания голоса. Фактически вариант только один: платные сервисы MS.
Exploring KTX for Android (перевод) — хорошее введение в библиотеку Android KTX, которую 5 февраля анонсировала компания Google. Android KTX представляет собой набор функций и классов, способных существенно упростить разработку для Android на Kotlin. Вот лишь некоторые (не буду скрывать, наиболее сочные) примеры:
// Модификация настроек sharedPreferences.edit { putBoolean(key, value) } // Работа с временем и датами val day = DayOfWeek.FRIDAY.asInt() val (seconds, nanoseconds) = Instant.now() val (hour, minute, second, nanosecond) = LocalTime.now() val (years, month, days) = Period.ofDays(2) // Создание бандлов val bundle = bundleOf("some_key" to 12, "another_key" to 15) // Работа с AtomicFile val fileBytes = atomicFile.readBytes() val text = atomicFile.readText(charset = Charset.defaultCharset()) atomicFile.writeBytes(byteArrayOf()) atomicFile.writeText("some string", charset = Charset.defaultCharset()) // SpannableString val builder = SpannableStringBuilder(urlString) .bold { italic { underline { append("hi there") } } } // Трансформация строки в URI val uri = urlString.toUri() // Работа с Drawable и Bitmap val bitmap = drawable.toBitmap(width = someWidth, height = someHeight, config = bitMapConfig) val bitmap = someBitmap.scale(width, height, filter = true) // Операции над объектом View view.postDelayed(delayInMillis = 200) { // some action } view.postOnAnimationDelayed(delayInMillis = 200) { // some action } view.setPadding(16) val bitmap = view.toBitmap(config = bitmapConfig) // ViewGroup viewGroup.forEach { doSomethingWithChild(it) } val view = viewGroup[0]
Automate your app screenshots — статья о том, как автоматизировать получение «чистых» скриншотов для Google Play с помощью утилиты screengrab и скрипта, который переводит смартфон в деморежим, позволяющий в том числе настроить строку состояния. Сам скрипт можно скачать здесь, а вот самая вкусная часть — включение/отключение деморежима:
function start_clean_status_bar { # Включаем деморежим adb shell settings put global sysui_demo_allowed 1 # Показываем время 12:00 adb shell am broadcast -a com.android.systemui.demo -e command clock -e hhmm 1200 # Показываем иконки мобильной и Wi-Fi-сетей без дополнительных значков adb shell am broadcast -a com.android.systemui.demo -e command network -e mobile show -e level 4 -e datatype false adb shell am broadcast -a com.android.systemui.demo -e command network -e wifi show -e level 4 -e fully true # Скрываем все уведомления adb shell am broadcast -a com.android.systemui.demo -e command notifications -e visible false # Показываем полный заряд батареи adb shell am broadcast -a com.android.systemui.demo -e command battery -e plugged false -e level 100 } function stop_clean_status_bar { adb shell am broadcast -a com.android.systemui.demo -e command exit }
Читайте также
Последние новости