
Фреймворк Redexer для двоичной инструментации Dalvik-байткода
Redexer — это инструмент реинжиниринга для работы с бинарными файлами приложений Android. Он позволяет анализировать DEX-файл и преобразовывать его в структуру данных в памяти; определять, с какими параметрами приложение использует определённые разрешения (эту функцию мы называем RefineDroid); изменять и обратно преобразовывать эту структуру данных для получения выходного DEX-файла (эти функции мы называем Dr. Android, что расшифровывается как Dalvik Rewriting for Android).
Инструмент протестирован с OCaml 4.09.0 и Ruby 1.8.6(7), поэтому необходимо установить их (или более новые версии).
Для работы с SHA-1-подписью (хэшем) в формате DEX мы используем библиотеку OCaml SHA через ocamlfind/findlib, менеджер библиотек OCaml. Проще всего установить их с помощью OPAM, менеджера пакетов OCaml, который содержит оба пакета — OPAM ocamlfind и OPAM sha.
Также можно собрать и/или установить оба пакета напрямую. Если вы используете Linux, вы легко найдёте соответствующие дистрибутивы.
В противном случае (например, на Mac) придётся собирать их самостоятельно.
Исходные коды можно найти здесь.
Соберите их с помощью make и поместите полученную директорию в корневую директорию site-lib ocamlfind; или выполните sudo make install.
Если вы работаете на ПК, сначала установите ocamlfind/findlib и FlexDLL. Убедитесь, что переменные окружения настроены правильно:
OCAMLLIB=C:\OCaml\lib
CAML_LD_LIBRARY_PATH=%OCAMLLIB%\stublibs
FLEXLINKFLAGS=-L%MinGW%\lib -L%MinGW%\lib\gcc\mingw32\N.N.N
Пакеты OPAM:
Android SDK (или исходники)
Для распаковки и упаковки apk-файлов мы используем apktool, инструмент реинжиниринга APK с открытым исходным кодом.
Поскольку он использует aapt (Android Asset Packaging Tool), необходимо установить Android SDK или исходники. Кроме того, мы используем
zipalign, который также входит в Android SDK, для оптимизации перезаписанных приложений.
Пути к базовым инструментам Android можно задать, добавив в профиль следующее:
ANDROID_HOME=$HOME/android-sdk # ваш собственный путь!
export ANDROID_HOME
PATH=$PATH:$ANDROID_HOME/tools
PATH=$PATH:$ANDROID_HOME/platform-tools
PATH=$PATH:$ANDROID_HOME/build-tools/19.0.0 # номер установленной версии
export PATH
Основные скрипты написаны на Ruby и требуют RubyGems, менеджера пакетов Ruby, и Nokogiri, библиотеки XML для работы с манифест-файлами.
Если вы хотите просматривать графы (например, граф вызовов, потоков управления, дерево доминаторов и т.д.), установите graphviz dot.
Чтобы собрать redexer, просто выполните make! Исполняемый файл redexer появится в корневой директории.
$ make (clean)
Перед использованием инструмента пользователю необходимо установить последнюю версию платформенного файла для apktool. Например, нужно выполнить
$ java -jar tools/apktool.jar if [подходящий платформенный файл]
Также можно сгенерировать API-документацию в формате html.
$ make api
Вы можете увидеть все доступные опции инструмента:
$ ruby scripts/cmd.rb -h
$ ruby scripts/cmd.rb --help
Подобно dexdump из Android SDK, redexer позволяет просмотреть внутреннее содержимое указанного dex-файла в формате YAML.
$ ruby scripts/cmd.rb target.(apk|dex) --cmd unparse [--to blah.yml]
Эта опция выводит инструкции для указанного метода.
$ ruby scripts/cmd.rb target.(apk|dex) --cmd dump_method --mtd cls.mtd
Эта функция предназначена для тестирования модулей разбора и дампа redexer. Она, вероятно, генерирует идентичный dex-файл.
$ ruby scripts/cmd.rb target.(apk|dex) --cmd id [--to blah.dex]
Вы также можете просмотреть базовую статистику о dex-файле, например, количество инструкций.
$ ruby scripts/cmd.rb target.(apk|dex) --cmd info
Эта опция выводит все имена классов, определённых в dex-файле.
$ ruby scripts/cmd.rb target.(apk|dex) --cmd classes
Может быть полезно для поиска сторонних библиотек, например:
$ ruby scripts/cmd.rb target.(apk|dex) --cmd classes | egrep 'apache'
Эта опция выводит использование API в dex-файле.
$ ruby scripts/cmd.rb target.(apk|dex) --cmd api [--sdk android.]
$ ruby scripts/cmd.rb target.(apk|dex) --cmd api --sdk com.facebook.
Вам не интересно, насколько редко используются некоторые коды операций в байт-коде Dalvik? Будет показана гистограмма всех кодов операций, или вы можете узнать, как часто используется конкретный код операции в указанном приложении.
$ ruby scripts/cmd.rb target.(apk|dex) --cmd opstat [--op opcode1,opcode2,...]
Например,
$ ruby scripts/cmd.rb ~/apps/top24/com.whatsapp.apk --cmd opstat
$ ruby scripts/cmd.rb ~/apps/top24/com.whatsapp.apk --cmd opstat --op div-int/lit16,nop
Эта опция проводит анализ разрешения Intent на основе распространения и выводит переходы между классами Activity.
$ ruby scripts/cmd.rb target.(apk|dex) --cmd intent
Эта опция генерирует pdf-файл, изображающий граф вызовов указанного файла. Если не указать имя pdf-файла, будет использован cg.pdf.
$ ruby scripts/cmd.rb target.(apk|dex) --cmd cg [--to blah.pdf] [--no-pdf]
Эта опция генерирует pdf-файл, показывающий граф потока управления указанного метода. Добавьте имя метода к имени класса через точку: имя_класса.имя_метода
$ ruby scripts/cmd.rb target.(apk|dex) --cmd cfg --mtd cls.mtd [--to blah.pdf] [--no-pdf]
Эта опция аналогична предыдущей, за исключением того, что она изображает дерево (пост)доминаторов.
$ ruby scripts/cmd.rb target.(apk|dex) --cmd (p)dom --mtd cls.mtd [--to blah.pdf] [--no-pdf]
Эта опция выполняет классический обратный анализ потока данных.
$ ruby scripts/cmd.rb target.(apk|dex) --cmd live --mtd cls.mtd
Эта опция выполняет классический прямой анализ потока данных.
$ ruby scripts/cmd.rb target.(apk|dex) --cmd const --mtd cls.mtd
Эта опция выполняет классический прямой анализ потока данных.
$ ruby scripts/cmd.rb target.(apk|dex) --cmd reach --mtd cls.mtd
Эта опция находит зависимости классов.
$ ruby scripts/cmd.rb target.(apk|dex) --cmd dependants --mtd cls.mtd
Эта опция выводит имя запускаемой активности указанного apk.
$ ruby scripts/cmd.rb target.apk --cmd launcher
Эта опция показывает, какие компоненты доступны извне.
$ ruby scripts/cmd.rb target.apk --cmd exported
Эти опции выводят базовые компоненты Android, объявленные в манифесте.
$ ruby scripts/cmd.rb target.apk --cmd [activity | service | provider | receiver]
Эта опция просматривает определения макетов в ресурсах и выводит пользовательские представления.
$ ruby scripts/cmd.rb target.apk --cmd custom_views
Эта опция просматривает определения макетов в ресурсах и выводит элементы Fragment.
$ ruby scripts/cmd.rb target.apk --cmd fragments
Эта опция просматривает определения макетов в ресурсах и выводит кнопки, а также их id (или текст) и метод обратного вызова (если есть).
$ ruby scripts/cmd.rb target.apk --cmd buttons
Эта опция выводит разрешения, которые использует apk.
$ ruby scripts/cmd.rb target.apk --cmd permissions
Эта опция выводит, какую версию SDK требует apk.
$ ruby scripts/cmd.rb target.apk --cmd sdk
Если вы не хотите распаковывать apk-файл, фактически, вы можете сделать то же самое с помощью комбинации команд:
$ aapt dump badging target.apk | grep 'targetSdkVersion' | tr -dc 0-9.\\n
Эта опция генерирует dex-файл, который выводит простое сообщение. Этот dex-файл создаётся только с использованием API redexer.
$ ruby scripts/cmd.rb --cmd hello
Проверьте его внутреннее содержимое:
$ dexdump -d results/classes.dex
Если вам интересно, вы можете протестировать этот dex-файл следующим образом. Предполагается, что путь к ANDROID_SDK установлен.
// создать временный jar, подходящий для Dalvik VM
$ aapt add temp.jar results/classes.dex
// (опционально) если вы не создали avd, создайте его.
$ android create avd -n myAVD1 -t android-8
// запустите эмулятор
$ emulator -avd myAVD1 &
// отправьте временный jar
$ adb push temp.jar /data
// подключитесь к adb shell
$ adb shell
// наконец, запустите dex
# /system/bin/dalvikvm -Xbootclasspath:/system/framework/core.jar \
-classpath /data/temp.jar Hello
Hello, DEX
#
Это вариант функции перезаписи. С помощью этой функции вы можете
записывать поведение приложений с определённых точек зрения.
Готовый dex-файл для библиотеки логирования предоставляется: data/logging.dex. Если вы хотите добавить
больше функций или утилит, соберите его следующим образом:
$ cd logging
$ gradle copyDex
$ cd ..
Затем используйте следующую команду:
$ ruby scripts/cmd.rb target.apk --cmd logging
trim.py может захватывать последовательности вызовов и возвратов инструментированного приложения. (Сначала вы должны инструментировать тестируемое приложение с помощью redexer.)
Если эти журналы достаточно короткие, то есть телефон (или эмулятор) может хранить всю информацию в памяти, вы можете использовать офлайн-режим скрипта:
$ ./scripts/trim.py -d
Обратите внимание, что все параметры командной строки будут переданы adb logcat, и
по умолчанию передаётся org.umd.logging:I *:S для фильтрации нерелевантных сообщений.
Если журналы переполняются, следует использовать онлайн-режим:
$ ./scripts/trim.py
Скрипт перехватывает прерывание клавиши, поэтому вы можете завершить логирование нажатием Ctrl+C.
В любом режиме журналы сохраняются в log.txt и одновременно отображаются на экране. Таким образом, после сбора журналов вам может понадобиться переместить этот файл, например:
$ mv log.txt app.scenario.txt
Функция логирования выше является общей в том смысле, что вы можете указать, что логировать
на уровне метода. (См. модуль logging для подробностей.)
Однако иногда это слишком подробно и может вызывать снижение производительности.
Эта функция предназначена для логирования только взаимодействий с пользователем. С её помощью
вы можете захватывать только события, связанные с UI. Аналогично,
готовый dex-файл для библиотеки логирования предоставляется: data/logging-ui.dex. Если вы хотите изменить
подробность информации о UI, соберите его следующим образом:
$ cd logging-ui
$ gradle copyDex
$ cd ..
Затем используйте следующую команду:
$ ruby scripts/cmd.rb target.apk --cmd logging_ui
Библиотека логирования наследуется от android a11y service, которая требует
явного согласия пользователя. Таким образом, после установки перезаписанного apk перейдите в
Settings/Accessibility и включите службу UI Logging.
(Этот шаг аналогичен включению режима отладки устройства.)
В logcat сообщения с тегами org.umd.logging_ui.* представляют собой взаимодействия
между пользователем и тестируемым приложением.
Эта опция находит пути перехода между компонентами, ведущие к вызовам целевых методов.
$ ruby scripts/cmd.rb target.apk --cmd directed
Вы можете указать целевые методы для вызова в data/directed.txt
Эти пути перехода между компонентами используются для управления приложениями с целью тестирования уязвимостей безопасности в сторонних библиотеках. Более подробно описано в следующей статье:
* Brahmastra: Driving Apps to Test the Security of Third-Party Components.
R. Bhoraskar, et al., In 23rd Usenix Security Symposium (Security '14).
withTimeout.rb может автоматически создать файл пропуска (skip file) для приложения. Этот скрипт запускает cmd.rb с определённым таймаутом, чтобы ограничить время, затрачиваемое на инструментирование любого отдельного класса. Это временное решение для редких классов, которые зависают в цикле во время инструментирования. Когда этот скрипт находит класс, который вызывает сбой, он добавляет его в файл пропуска и продолжает с того места, где остановился. После завершения withTimeout в директории data будет файл с именем [имя apk]-skip.txt, который можно использовать для создания полностью инструментированного приложения для этого apk. Чтобы использовать withTimeout, просто вызовите
$ ruby scripts/withTimeout.rb ТАЙМАУТ КОМАНДЫ
Где ТАЙМАУТ — длина таймаута в секундах (рекомендуется 300), а КОМАНДЫ — все обычные аргументы командной строки, которые вы бы передали scripts/cmd.rb для этого apk.