
Преобразует байт-код Dalvik (DEX/APK) в эквивалентный байт-код Java, позволяя инструментам анализа Java обрабатывать Android-приложения с высокой корректностью для граничных случаев.
Примечание: Этот репозиторий может быть устаревшим. Дальнейшая разработка будет вестись на https://github.com/Storyyeller/enjarify.
Enjarify — это инструмент для перевода байт-кода Dalvik в эквивалентный байт-код Java. Это позволяет инструментам анализа Java анализировать Android-приложения.
Enjarify — это чистое приложение на Python 3, так что вы можете просто клонировать репозиторий и запустить его. Для непосредственного запуска, если вы находитесь в корневой директории репозитория, просто выполните:
python3 -O -m enjarify.main yourapp.apk
Для обычного использования, вероятно, захочется использовать скрипты-обёртки и настроить их в PATH.
Для удобства предоставляется скрипт-обёртка enjarify.sh. Он попытается использовать Pypy, если он доступен, так как он быстрее CPython. Если вы хотите иметь возможность вызывать Enjarify из любого места, создайте символическую ссылку из какого-либо каталога в вашем PATH, например ~/bin. Для этого, находясь в корневой директории репозитория:
ln -s "$PWD/enjarify.sh" ~/bin/enjarify
Предоставляется пакетный скрипт-обёртка enjarify.bat. Чтобы вызывать его из любого места, просто добавьте корневую директорию репозитория в ваш PATH. Пакетный скрипт всегда будет вызывать python3 в качестве интерпретатора. Если вы хотите использовать pypy, просто отредактируйте скрипт.
Если вы правильно настроили скрипт в PATH, вы можете вызывать его из любого места, просто набрав enjarify, например:
enjarify yourapp.apk
Самая основная форма использования — просто указать apk-файл или dex-файл в качестве входных данных. Если вы укажете мультидекс apk, Enjarify автоматически переведёт все dex-файлы и выведет результаты в один объединённый jar. Если вы укажете dex-файл, будет переведён только этот файл. Например, если вы вручную извлекли dex-файлы, вы можете сделать:
enjarify classes2.dex
Файл вывода по умолчанию — [inputname]-enjarify.jar в текущем каталоге. Чтобы явно указать имя выходного файла, используйте опцию -o или --output.
enjarify yourapp.apk -o yourapp.jar
По умолчанию Enjarify откажется перезаписывать существующий выходной файл. Чтобы принудительно перезаписать, используйте опцию -f или --force.
Dex2jar — это более старый инструмент, который также пытается переводить Dalvik в байт-код Java. В большинстве случаев он работает достаточно хорошо, но множество малоизвестных функций или крайних случаев приводят к его сбою или даже незаметному получению некорректных результатов. Напротив, Enjarify спроектирован для работы в как можно большем количестве случаев, даже для кода, где Dex2jar не справится. Помимо прочего, Enjarify корректно обрабатывает имена классов в Unicode, константы, используемые как множественные типы, неявные приведения, обработчики исключений, переходящие в нормальный поток управления, классы, ссылающиеся на слишком много констант, очень длинные методы, обработчики исключений после обработчика catch-all и статические начальные значения неверного типа.
Enjarify в настоящее время не переводит опциональные метаданные, такие как атрибуты исходного файла, номера строк и аннотации.
Enjarify прилагает большие усилия для успешного перевода как можно большего числа классов, но существуют некоторые потенциальные случаи, когда это просто невозможно из-за ограничений в Android, Java или обоих. К счастью, это происходит только в надуманных обстоятельствах, так что на практике проблем быть не должно.
PyPy намного быстрее CPython. Для установки PyPy смотрите http://pypy.org/. Убедитесь, что вы используете PyPy3, а не обычный PyPy. Скрипт-обёртка для Linux автоматически использует команду pypy3, если она доступна. В Windows вам нужно будет отредактировать скрипт-обёртку самостоятельно.
По умолчанию Enjarify выполняет оптимизации байт-кода, которые делают его более читаемым для человека (распространение копий, удаление неиспользуемых значений и т.д.). Если вам это не нужно, вы можете ускорить работу, отключив оптимизации с помощью опции --fast. Обратите внимание, что в очень редком случае, когда класс слишком велик, чтобы поместиться в classfile без оптимизации, Enjarify автоматически повторит попытку со всеми включёнными оптимизациями, так что эта опция не влияет на количество успешно переведённых классов.
Это не официальный продукт Google (экспериментальный или иной), это просто код, который, так уж получилось, принадлежит Google.