Сегодня в выпуске: взлом приложений с нативным кодом с помощью дебаггера, большое исследование использования обфускации в приложениях, магия асинхронного программирования на 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 — статья с рассказом о способе исследования (взлома) приложений, использующих нативный код. В данном случае используется не статический анализ приложения с помощью дизассемблирования и декомпиляции, а запуск приложения под отладчиком.

В целом суть метода в следующем:

  1. Распаковываем приложение-жертву и дизассемблируем его в низкоуровневый код smali с помощью утилиты backsmali (на самом деле все это можно сделать с помощью apktool).
  2. Импортируем код приложения (smali) в Android Studio и настраиваем отладчик.
  3. Включаем отладку нужного приложения на устройстве с помощью команды типа am start -W -D com.skout.android/com.skout.android.activities.Skout (требует права root).
  4. В Android Studio устанавливаем брейк-пойнт на метод onCreate в главной активности приложения.
  5. В Device Monitor (DDMS) находим нужное приложение на устройстве.
  6. Запускаем отладку приложения.

Таким способом можно построчно отладить и, как следствие, изучить поведение приложения. Но это еще не все: если установить на смартфон и запустить gdbserver, с его помощью можно будет подключиться к устройству, используя отладчик GDB, а уже затем подключиться к процессу приложения. Это даст возможность отлаживать нативный код приложения, как только ему будет передано управление.

Отладка приложения с помощью GDB
Отладка приложения с помощью GDB
 

Взлом очень уязвимого приложения

A walk through the Damn Vulnerable Hybrid Mobile App (DVHMA) — пример разбора (взлома) приложения, написанного с помощью Apache Cordova, фреймворка, позволяющего создавать гибридные приложения с использованием HTML, CSS и JavaScript.

Автор последовательно разбирает три проблемы приложения.

  1. Дефолтовый уровень логирования установлен в DEBUG, что приводит к сбросу в стандартный журнал Android (logcat) массы отладочной информации.
  2. В ряде случаев приложение не производит валидацию данных, что можно использовать для XSS.
  3. Injection.

Ты выполняешь обратную разработку и поиск уязвимостей в мобильных приложениях?

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

Структура файлов DEX

The Dex File Format — неплохая вводная статья в формат DEX, тот самый, что содержит байт-код любых приложений для Android. Автор рассказывает о структуре заголовков DEX, способе кодирования строк и методов, о том, как выглядит сам код в формате DEX. В конце приводится сравнение результатов работы старого компилятора DX и нового D8, который должен появиться в Android Studio 3.1. Как оказалось, этот компилятор способен сократить размер DEX-файла примерно на 12%. Кроме того, он увеличивает скорость компиляции.

Сравнение скорости компиляции с помощью D8 и устаревшего DX
Сравнение скорости компиляции с помощью 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 — несколько простых, но достаточно спорных советов, как защитить свое приложение от воровства (мои комментарии курсивом):

  1. Всегда используй ProGuard. Инструмент ProGuard входит в состав Android Studio и позволяет сократить размер кода и одновременно запутать его с помощью замены имен классов, методов и переменных на бессмысленные одно-двухбуквенные комбинации. Этот инструмент может запутать только совсем неопытного взломщика, зато ты потратишь уйму времени на его настройку.
  2. Замени JSON бинарным протоколом, например ProtoBuf (реализация для Android). Так взломщику будет труднее разобраться в трафике, генерируемом приложением. Обратная сторона медали: отлаживать код, работающий с JSON, намного проще. К тому же автор забыл добавить, что начиная с Android N ты можешь использовать SSL Pinning, чтобы усложнить выполнение атаки MiTM.
  3. Используй различные методы для проверки приложения на целостность (было ли приложение изменено): сверка контрольной суммы установленного APK с заведомо правильной контрольной суммой, сохраненной на сервере; механизм Google App Licensing, позволяющий подтвердить, что приложение было установлено из Google Play; вынос частей приложения в expansion-файлы. Имей в виду, что взломщик может вырезать все эти механизмы защиты из приложения, это не так трудно сделать.
97% — доля взломанных приложений для Android
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.

Как тебе подборка инфы и библиотек в этой статье?

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

1 комментарий

  1. AppMaster

    20.02.2018 at 14:41

    Спасибо! Побольше бы таких материалов!

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

Check Also

Ugears. Новые модели подвижных конструкторов из дерева

Услышав слова «деревянный конструктор», ты, наверное, представляешь себе этакий Lego для с…