5 неизвестных, но полезных комбинаций Android Studio
25 новых библиотек
Библиотеки
Сегодня в выпуске: взлом приложений с нативным кодом с помощью дебаггера, большое исследование использования обфускации в приложениях, магия асинхронного программирования на 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, а уже затем подключиться к процессу приложения. Это даст возможность отлаживать нативный код приложения, как только ему будет передано управление.
Взлом очень уязвимого приложения
A walk through the Damn Vulnerable Hybrid Mobile App (DVHMA) — пример разбора (взлома) приложения, написанного с помощью Apache Cordova, фреймворка, позволяющего создавать гибридные приложения с использованием HTML, CSS и JavaScript.
Автор последовательно разбирает три проблемы приложения.
Дефолтовый уровень логирования установлен в DEBUG, что приводит к сбросу в стандартный журнал Android (logcat) массы отладочной информации.
В ряде случаев приложение не производит валидацию данных, что можно использовать для XSS.
Injection.
Ты выполняешь обратную разработку и поиск уязвимостей в мобильных приложениях?
Да, в Android это особенно просто
Пока нет, но раз есть такие удобные инструменты — стоит попробовать
Только для аудита, не хочу запятнать белую шляпу
Загрузка ...
Структура файлов DEX
The Dex File Format — неплохая вводная статья в формат DEX, тот самый, что содержит байт-код любых приложений для Android. Автор рассказывает о структуре заголовков DEX, способе кодирования строк и методов, о том, как выглядит сам код в формате DEX. В конце приводится сравнение результатов работы старого компилятора DX и нового D8, который должен появиться в Android Studio 3.1. Как оказалось, этот компилятор способен сократить размер DEX-файла примерно на 12%. Кроме того, он увеличивает скорость компиляции.
Разработчику
Магия асинхронного программирования с 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-файла со строками следующее:
Третий. Не все строки необходимо переводить, но среда разработки будет ругаться на непереведенные строки и заблокирует сборку приложения. Чтобы этого не происходило, объявляй строки, которые не требуется переводить, так:
<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-файлы. Имей в виду, что взломщик может вырезать все эти механизмы защиты из приложения, это не так трудно сделать.
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 — существенно упрощает управление фрагментами;