
Фреймворк 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