Сегодня в выпуске: отслеживание смартфона с выключенным GPS, взлом продвинутого упаковщика Qihoo, восстановление истории переписки и удаленных сообщений WhatsApp, модификация приложений в рантайме. А также: советы по использованию шифрования в своих приложениях, обзор библиотеки Android KTX, способы распознавания отпечатков, лица и голоса и, конечно же, подборка свежих библиотек.
 

Инструменты

  • StaCoAn — инструмент для автоматизированного статического анализа приложений для Android; ищет захардкоженные API-ключи, API-эндпойнты, ключи шифрования и ошибки;
  • Quiet — не новая, но весьма интересная библиотека для передачи данных (протокол TCP) с помощью звука;
  • Electra — jailbreak для iOS 11.0–11.1.2;
  • LibScout — инструмент для поиска уязвимых версий библиотек в приложении (может работать с обфусцированным кодом).
 

Почитать

 

Отслеживание смартфона с выключенным GPS

PinMe: Tracking a Smartphone User around the World — исследование, посвященное отслеживанию перемещений смартфона (и его владельца) без использования GPS, геолокации по базовым станциям и точкам доступа Wi-Fi. Вместо этого исследователи из Института инженеров электротехники и электроники использовали акселерометр, гироскоп, барометр и компас, которые позволили отследить маршрут перемещений с точностью GPS.

Суть метода в следующем. На смартфон устанавливается приложение PinMe. В момент запуска оно получает информацию о последнем IP-адресе смартфона и таким образом определяет его приблизительное местоположение. Затем начинается сбор информации с датчиков, который позволяет определить скорость движения, периодичность остановок и высоту над уровнем моря. Эта информация используется для определения способа передвижения (ходьба, автомобиль, общественный транспорт, самолет) с помощью нейросети. Другая нейросеть используется для определения точного местоположения по косвенным признакам, таким как высота, расписание рейсов и другие данные.

Результат оказался весьма впечатляющим. Исследователям удалось добиться точности, сопоставимой с GPS. Однако есть и ограничения: PinMe не будет работать в лесу и других местах, где нет дорог, он плохо работает в плоской негористой местности с похожей топологией улиц (например, Манхэттен с его квадратными улицами). Также PinMe не сработает, если на смартфоне активирован Tor-туннель (IP-адрес отправной точки будет неправильным).

Черным отмечен маршрут, построенный с использованием GPS, желтым и зеленым — при помощи PinMe
Черным отмечен маршрут, построенный с использованием GPS, желтым и зеленым — при помощи PinMe

Каков технический принцип работы PinMe?

Загрузка ... Загрузка ...
 

Пентест для новичков

A Virgil’s Guide to Pentest: Operation Android — основы пентеста для начинающих. Статья довольно сумбурно написана, но из нее можно вынести многие интересные вещи. Например:

  • два главных инструмента — jadx-gui (декомпилятор) и apktool (позволяет разобрать APK и собрать его обратно);
  • самый простой способ обойти SSL pinning — Android-SSL-TrustKiller;
  • самый удобный инструмент автоматического поиска уязвимостей — Drozer;
  • значения ro.build.version.release, ro.product.model и ro.product.brand в эмуляторе стоит изменить. Некоторые приложения используют их для идентификации эмулируемой среды;
  • если в эмуляторе есть root-доступ и приложение отказывается работать, просто переименуй файлы /system/app/SuperUser.apk (SuperSU.apk) и /system/bin/su.
 

Анализ приложения, защищенного упаковщиком Qihoo

Dissecting mobile native code packers. A case study — анализ приложения, защищенного с помощью упаковщика Qihoo. В статье приведено огромное количество деталей, остановимся на некоторых из них.

  1. DEX-файл приложения весит больше четырех мегабайт, однако при его анализе становится ясно, что там просто нет столько кода: все, что он делает, — это передает управление нативной библиотеке. Так происходит потому, что большую часть файла занимает дописанный в его конец зашифрованный фрагмент.
  2. Загруженная нативная библиотека выполняет несколько проверок на то, не работает ли она под отладчиком, а затем расшифровывает и загружает в память вторую библиотеку. Кроме проверок на присутствие отладчика, библиотека также использует другой метод защиты — виртуальную машину, которая исполняет байт-код вместо нативного кода ARM.
  3. Вторая нативная библиотека — это загрузчик DEX-файлов. Он извлекает из конца оригинального DEX-файла зашифрованный фрагмент, расшифровывает его, подготавливает рантайм для исполнения, а затем передает ему управление.

Используемые техники защиты от дебаггинга:

  • чтение файла /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

WhatsApp Forensics: Decryption of Encrypted Databases and Extraction of Deleted Messages on Non-Rooted Android Devices — простая, но в ряде моментов интересная статья о том, как извлечь историю переписки WhatsApp из Android-смартфона. Три основных метода:

  1. Сделать бэкап переписки с помощью самого WhatsApp. Бэкап будет зашифрован, и авторы не рассказывают, как извлечь ключ, зато обещают выпустить фирменную утилиту для автоматического дампа бэкапа.
  2. Получить права root и скопировать базу данных WhatsApp из приватного каталога (файл msgstore.db). Она не зашифрована, поэтому ее легко просмотреть с помощью любого SQLite-вьюера.
  3. Сделать бэкап средствами Android. Некоторые производители добавляют в свои смартфоны функцию бэкапа, и многие из них даже не заботятся о том, чтобы его зашифровать. На примере смартфона компании Oppo авторы делают бэкап данных установленных приложений, а затем без всяких проблем извлекают из него данные WhatsApp (включая msgstore.db).

В качестве бонуса авторы рассказывают, как в ряде случаев можно восстановить удаленные сообщения. Дело в том, что перед записью сообщения в базу данных WhatsApp сначала пишет его в кеш (файл msgstore.db-wal), а затем переносит в msgstore.db. При удалении сообщения оно будет удалено из основной базы, но иногда может остаться в кеше, откуда его легко извлечь.

Удаленное сообщение, оставшееся в кеше
Удаленное сообщение, оставшееся в кеше
 

Рантайм-модификация приложений

Mobile Application Hacking Diary Ep.2 — статья с описанием техник, изменяющих поведение приложений Android и iOS, на примере обхода проверок наличия прав root на устройстве. Итак, три разные техники:

  1. Изменение кода. Декомпилируем приложение с помощью Bytecode Viewer (автор рекомендует использовать именно его из-за наличия сразу нескольких движков декомпиляции в комплекте). Находим нужный участок кода, дизассемблируем приложение с помощью apktool, находим тот же участок кода и изменяем возвращаемое им значение (например, true на false). Собираем обратно и устанавливаем.
  2. Изменение кода на лету с помощью отладчика. Распаковываем приложение с помощью apktool, изменяем значение поля android:debuggable в AndroidManifest.xml на true, запаковываем обратно. Подключаемся к приложению с помощью отладчика AndBug и выполняем трассировку в поисках нужного нам метода. Затем подключаемся к приложению с помощью jdb, ставим брейк-пойнт на нужный метод и изменяем возвращаемое им значение.
  3. Автоматическое изменение кода на лету с помощью Frida. Инструмент Frida позволяет выполнить трассировку и внедрить свой код в любое приложение на смартфоне. В примере автор использует скрипт для поиска нужного метода, а затем приводит пример скрипта, который находит этот метод и изменяет возвращаемое им значение. Однако в большинстве случаев тебе даже не придется самому писать скрипты. В репозитории Frida CodeShare можно найти множество уже готовых.

Зачем может использоваться рантайм-модификация приложений?

Загрузка ... Загрузка ...
 

Кастомный Project Treble

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 на Xiaomi Redmi Note 4

Поддержка Treble на Xiaomi Redmi Note 4

Поддержка Treble на Xiaomi 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? — статья с немного неуместным названием о том, как использовать распознавание пальцев, лица и голоса в своих приложениях. Никаких откровений, все просто:

  • Отпечатки пальцев. Вопреки расхожему мнению, приложение, запрашивающее твой отпечаток пальца, на самом деле никогда его не увидит и не сможет отправить на удаленный сервер. Отпечатки пальцев (в виде математической модели) хранятся в security-сопроцессоре (TTE), получить доступ к которому может только ОС. Разработчику приложений остается только сделать запрос отпечатков и получить ответ (в колбэке) о совпадении или несовпадении:

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.

 

Изучаем Android KTX

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
}
 

Библиотеки

  • backgroundable-android — список механизмов энергосбережения разных смартфонов и интенты, позволяющие открыть их настройки (чтобы пользователь мог добавить приложение в список исключений);
  • kotlin-android-examples — множество различных примеров кода на Kotlin;
  • RichUtilsKt — набор утилит на все случаи жизни (диалоговые окна, работа с изображениями, файлами, буфером обмена и многое другое);
  • AwesomeBar — красивый анимированный ActionBar;
  • Fluid Slider — эффектный анимированный слайдер;
  • Sneaker — библиотека для показа сообщений в верхней части экрана;
  • ColorPickerPreference — диалог выбора цвета;
  • Videoapparat — простая в использовании библиотека для работы с видеокамерой;
  • ScrollingPagerIndicator — индикатор горизонтальной прокрутки в виде точек;
  • Android-Goldfinger — простая в использовании библиотека для аутентификации по отпечатку пальца;
  • KFormMaster — порт библиотеки для создания форм на Kotlin;
  • Prefekt — удобная в использовании библиотека для работы SharedPreferences из Kotlin;
  • Scripto — библиотека для обмена сообщениями между Java и JavaScript, который исполняется внутри WebView;
  • Light — альтернативная реализация снекбара (snackbar) с возможностью кастомизации.

2 комментария

  1. r0uly

    11.03.2018 at 19:34

    Отличная подборка! Наконец-то в Хакере начали раскрывать тему пентеста мобильных приложений… Примеры на Kotlin тоже понравились и появилось желание ознакомиться с ним, т.к. выглядит более продуманным, чем Android SDK на Java.

Оставить мнение

Check Also

Пишем стилер. Как вытащить пароли Chrome и Firefox своими руками

Ты наверняка слышал о таком классе зловредных приложений, как стилеры. Их задача — вытащит…