Android: взлом с помощью дебаггера, обфускация приложений и асинхронная магия Kotlin
Сегодня в выпуске: взлом приложений с нативным кодом с помощью дебаггера, большое исследование использования обфускации в приложениях, магия асинхронного программирования на Kotlin, большой гайд по Material Design и теням в интерфейсе, рассказ о структуре файлов DEX, защита приложений от взлома и, конечно же, большая подборка свежих библиотек.
Инструменты
- QARK — мощный инструмент для поиска уязвимостей в приложениях (как в исходном коде, так и в APK);
- android-scripts — небольшая коллекция скриптов для реверса Android-приложений;
- edlrooter — root-эксплоит для Nexus 6 с использованием Qualcomm Emergency Download (EDL) Mode (CVE-2017-13174, CVE-2016-10277);
- AndroidIdChanger — Xposed-модуль для изменения информации об устройстве (IMEI, Android ID, Serial Number, Wifi Mac Address и другое);
- VirtualHook — фреймворк для рантайм-модификации приложений (нечто вроде Xposed, не требующего прав root);
- exploit_me — уязвимое ARM-приложение для тренировки навыков взлома (присутствуют практически все возможные баги);
- SdkSearch — приложение для поиска документации по Android SDK.
Почитать
Анализ использования обфускации в приложениях
A Large Scale Investigation of Obfuscation Use in Google Play — исследование на тему использования обфускаторов разработчиками приложений для Android. Обфускаторы — утилиты, способные сделать код приложения гораздо более запутанным и сложным для чтения.
Один из самых популярных обфускаторов — ProGuard входит в состав Android Studio. В первую очередь он предназначен для оптимизации кода путем сокращения имен. Существуют и более продвинутые версии обфускаторов: DexGuard, Allatory, DexProtector и многие другие. Кроме сокращения имен, они также выполняют шифрование строк и используют многие другие типы обфускации (например, заменяют прямой вызов методов рефлексией).
По словам исследователей, только 24,9% приложений из проанализированных 1,7 миллиона защищены обфускаторами. И это плохо, так как в мире Android процветает то, что называется перепаковкой приложений. Простые цифры:
- 86% вирусов — это перепакованные версии обычных приложений;
- 13% приложений в сторонних маркетах — перепакованные версии приложений других разработчиков (зачастую с включением рекламы).
В то же время, по словам опытных исследователей кода приложений, ProGuard увеличивает общее время анализа всего лишь в два раза. Другими словами, если приложение должно быть исследовано — оно будет исследовано.
Общие результаты:
- 64,51% приложений включают код, обфусцированный с помощью ProGuard (необязательно код самого приложения, возможно — код библиотек);
- 0,16% используют продвинутые техники обфускации, такие как использование зарезервированных в Windows ключевых слов (так делают DexGuard и некоторые конфигурации Allatory);
- 0,05% приложений обфусцированы с помощью DexGuard;
- 0,01% обфусцированы с помощью Bangle.
Взлом приложения с нативным кодом
Debugging Android third-party Java apps with native methods — статья с рассказом о способе исследования (взлома) приложений, использующих нативный код. В данном случае используется не статический анализ приложения с помощью дизассемблирования и декомпиляции, а запуск приложения под отладчиком.
В целом суть метода в следующем:
- Распаковываем приложение-жертву и дизассемблируем его в низкоуровневый код smali с помощью утилиты backsmali (на самом деле все это можно сделать с помощью apktool).
- Импортируем код приложения (smali) в Android Studio и настраиваем отладчик.
- Включаем отладку нужного приложения на устройстве с помощью команды типа am start -W -D com.skout.android/com.skout.android.activities.Skout (требует права root).
- В Android Studio устанавливаем брейк-пойнт на метод onCreate в главной активности приложения.
- В Device Monitor (DDMS) находим нужное приложение на устройстве.
- Запускаем отладку приложения.
Таким способом можно построчно отладить и, как следствие, изучить поведение приложения. Но это еще не все: если установить на смартфон и запустить gdbserver, с его помощью можно будет подключиться к устройству, используя отладчик GDB, а уже затем подключиться к процессу приложения. Это даст возможность отлаживать нативный код приложения, как только ему будет передано управление.
Отладка приложения с помощью GDB
Взлом очень уязвимого приложения
A walk through the Damn Vulnerable Hybrid Mobile App (DVHMA) — пример разбора (взлома) приложения, написанного с помощью Apache Cordova, фреймворка, позволяющего создавать гибридные приложения с использованием HTML, CSS и JavaScript.
Автор последовательно разбирает три проблемы приложения.
- Дефолтовый уровень логирования установлен в DEBUG, что приводит к сбросу в стандартный журнал Android (logcat) массы отладочной информации.
- В ряде случаев приложение не производит валидацию данных, что можно использовать для XSS.
- Injection.
Структура файлов DEX
The Dex File Format — неплохая вводная статья в формат DEX, тот самый, что содержит байт-код любых приложений для Android. Автор рассказывает о структуре заголовков DEX, способе кодирования строк и методов, о том, как выглядит сам код в формате DEX. В конце приводится сравнение результатов работы старого компилятора DX и нового D8, который должен появиться в Android Studio 3.1. Как оказалось, этот компилятор способен сократить размер DEX-файла примерно на 12%. Кроме того, он увеличивает скорость компиляции.
Сравнение скорости компиляции с помощью D8 и устаревшего DX
Разработчику
Магия асинхронного программирования с Kotlin
Simple asynchronous loading with Kotlin Coroutines — еще одна великолепная демонстрация мощи Kotlin и основанной на корутинах модели многопоточного программирования. Автор показывает, как за десять минут написать микробиблиотеку, которая позволит сделать такое:
load {
loadBitmapFromMediaStore(imageId, imagesBaseUri)
} then {
imageView.setImageBitmap(it)
}
Данный код запускает функцию loadBitmapFromMediaStore() в отдельном потоке, затем берет возвращенное ей значение и использует его как аргумент метода setImageBitmap() объекта imageView. И все это не блокируя основной поток приложения.
Красота этого примера (а точнее, статьи) в том, что он хорошо иллюстрирует сразу несколько мощных возможностей Kotlin: корутины, позволяющие выполнять асинхронный код без блокировок, инфиксные функции, позволяющие создавать нечто вроде языка в языке (в данном примере then — инфиксная функция), синтаксический сахар, позволяющий опустить скобки в функциях, если лямбда — их единственный аргумент, и, конечно же, сами лямбды.
Трюки со строками
Android Strings XML Tips & Tricks — статья, рассказывающая о нескольких трюках, связанных со строками и переводом приложений.
Саммари:
Первый. Среда разработки Android позволяет форматировать строки. Например:
<string name="welcome_messages">You have %d new messages.</string>
val text = resources.getString(R.string.welcome_message, 4) // "You have 4 new messages."
Это очень удобная возможность, однако если ты укажешь в строке нечто, подобное %d of %d left, то получишь сообщение Multiple substitutions specified in non-positional format; did you mean to add the formatted=”false” attribute?. Но это неправильная рекомендация, правильным решением будет указать позиции форматируемых элементов:
%1$d of %2$d left
Второй. Если ты разрабатываешь приложение с поддержкой лишь одного, отличного от английского, языка, среда разработки будет постоянно сообщать тебе о проблемах с правописанием. Чтобы этого избежать, добавь в начало XML-файла со строками следующее
<resources xmlns:tools="http://schemas.android.com/tools" tools:locale="pl">
Третий. Не все строки необходимо переводить, но среда разработки будет ругаться на непереведенные строки и заблокирует сборку приложения. Чтобы этого не происходило, объявляй строки, которые не требуется переводить, так:
<string name="author" translatable="false">Droids On Roids</string>
Material Design и тени
Mastering Shadows in Android — хорошая вводная статья в Material Design и создание интерфейсов, имеющих глубину. Основные моменты:
- Material Design отличается от других языков дизайна тем, что активно использует концепцию глубины. Разные уровни глубины олицетворяют собой важность графических элементов: если на столе лежат несколько бумаг, наиболее важной из них будет та, что сверху.
- Порядок расположения элементов определяется Z-значением, которое, в свою очередь, состоит из двух компонентов: высоты (elevation) и translation Z. Первый статичен, второй может меняться и обычно используется для анимации. Пример: по умолчанию FloatingActionButton (круглая кнопка внизу экрана) имеет высоту 6 dp, но при нажатии значение translation Z меняется с 0 до 6 dp, так что в результате высота становится 12 dp и кнопка «поднимается» над экраном.
- В зависимости от того, на какой высоте находятся элементы, они будут иметь разные тени. Для формирования теней используется два виртуальных источника света. Один находится над верхней частью экрана и повернут к нему под углом (так что тени от элементов будут находиться снизу), второй направлен непосредственно на экран под прямым углом (он создает мягкую тень вокруг элемента).
- Для формирования теней фреймворк Android использует контур (outline) графического элемента (view). Но если ты создашь собственный View с динамически изменяемым размером, контура у него не будет и Android не сможет создать тень. Для решения этой проблемы необходимо использовать ViewOutlineProvider.
Все элементы на экране имеют глубину
Защита приложений от взлома
Bang! Bang! You have been hacked — несколько простых, но достаточно спорных советов, как защитить свое приложение от воровства (мои комментарии курсивом):
- Всегда используй ProGuard. Инструмент ProGuard входит в состав Android Studio и позволяет сократить размер кода и одновременно запутать его с помощью замены имен классов, методов и переменных на бессмысленные одно-двухбуквенные комбинации. Этот инструмент может запутать только совсем неопытного взломщика, зато ты потратишь уйму времени на его настройку.
- Замени JSON бинарным протоколом, например ProtoBuf (реализация для Android). Так взломщику будет труднее разобраться в трафике, генерируемом приложением. Обратная сторона медали: отлаживать код, работающий с JSON, намного проще. К тому же автор забыл добавить, что начиная с Android N ты можешь использовать SSL Pinning, чтобы усложнить выполнение атаки MiTM.
- Используй различные методы для проверки приложения на целостность (было ли приложение изменено): сверка контрольной суммы установленного APK с заведомо правильной контрольной суммой, сохраненной на сервере; механизм Google App Licensing, позволяющий подтвердить, что приложение было установлено из Google Play; вынос частей приложения в expansion-файлы. Имей в виду, что взломщик может вырезать все эти механизмы защиты из приложения, это не так трудно сделать.
97% — доля взломанных приложений для Android
5 неизвестных, но полезных комбинаций Android Studio
Top (unknown) keyboard shortcuts in Android Studio. Краткая выжимка:
- Ctrl + Shift + U — изменение регистра строки под курсором;
- Alt + выделение — выделение прямоугольного блока текста;
- Ctrl + Shift + V — история буфера обмена;
- Ctrl + Y — удаление строки;
- Ctrl + D — повторение строки.
25 новых библиотек
25 new Android libraries and projects to check at the beginning of 2018 — 25 новых библиотек, которые стоит попробовать в 2018 году. Выжимка:
- transitioner — динамическая трансформация одного View в другой, библиотека написана на Kotlin и очень хорошо документирована;
- FragmentRigger — существенно упрощает управление фрагментами;
- AnimatedPieView — анимированная круговая диаграмма;
- FloatWindow — позволяет создавать плавающие окна;
- hyperlog-android — библиотека логирования, отправляющая логи на удаленный сервер;
- ExpansionPanel — реализация расширяемых панелей;
- Cipher.so — позволяет разместить важные данные в зашифрованной нативной библиотеке;
- FancyToast — позволяет создавать стилизованные Toast-сообщения;
- RecyclerViewCardGallery — библиотека для создания каруселей с помощью RecyclerView;
- ig-lazy-module-loader — библиотека для динамической загрузки внешних модулей/библиотек в приложение.
Библиотеки
- FingerPaintView — View, позволяющий рисовать пальцем поверх изображения;
- AndroidGodEye — инструмент для мониторинга производительности смартфона с помощью браузера;
- Arrow — библиотека функционального программирования для Kotlin;
- FancyWalkthrough — библиотека для создания визардов и путеводителей;
- colored-time-selector — удобный ползунок для выбора временных отрезков;
- FancyGifDialog-Android — библиотека для создания красивых анимированных диалоговых окон;
- videochatguru — позволяет создавать видеочаты на основе WebRTC;
- WhatsNew — автоматически показывает changelog после обновления приложения;
- Paper — быстрая NoSQL БД;
- MusicVisualization — визуализация музыки с помощью OpenGL.
Комментарии