Как декомпилировать DEX в исходный код Java?
Как можно декомпилировать файлы Android DEX (байт-код виртуальной машины) в соответствующий исходный код Java?
Переведено автоматически
Ответ 1
Это просто
Получите эти инструменты:
Исходный код вполне читаем, поскольку dex2jar вносит некоторые оптимизации.
Процедура:
И вот процедура декомпиляции:
Шаг 1:
Конвертируйте classes.dex в test_apk-debug.apk в test_apk-debug_dex2jar.jar
d2j-dex2jar.sh -f -o output_jar.jar apk_to_decompile.apk
d2j-dex2jar.sh -f -o output_jar.jar dex_to_decompile.dex
Примечание 1: На компьютерах с Windows все
.sh
скрипты заменены на.bat
скрипты
Примечание 2: В linux / mac не забывайте о
sh
orbash
. Полная команда должна быть:
sh d2j-dex2jar.sh -f -o output_jar.jar apk_to_decompile.apk
Примечание 3: Также не забудьте добавить разрешение на выполнение в
dex2jar-X.X
каталог, напримерsudo chmod -R +x dex2jar-2.0
Шаг 2:
Откройте jar в JD-GUI
Ответ 2
Чтобы внести некоторую ясность, здесь есть два основных пути, которыми вы можете воспользоваться, в зависимости от того, чего вы хотите достичь:
Декомпилируйте байт-код Dalvik (dex) в читаемый исходный код Java. Вы можете легко сделать это с помощью dex2jar и jd-gui, как упоминает Фред. Полученный исходный код полезен для чтения и понимания функциональности приложения, но, скорее всего, не создаст код, пригодный для использования на 100%. Другими словами, вы можете прочитать исходный код, но вы не можете его реально изменить и переупаковать. Обратите внимание, что если исходный код был запутан с помощью proguard, полученный исходный код будет значительно сложнее распутать.
Другой важной альтернативой является дизассемблирование байт-кода в smali, языке ассемблера, разработанном именно для этой цели. Я обнаружил, что проще всего это сделать с помощью apktool. После установки apktool вы можете просто указать им на файл apk, и вы получите обратно файл smali для каждого класса, содержащегося в приложении. Вы можете прочитать и изменить smali или даже полностью заменить классы, сгенерировав smali из нового исходного кода Java (для этого вы могли бы скомпилировать свой исходный код .java в файлы .class с помощью javac, затем преобразовать свои файлы .class в файлы .dex с помощью dx-компилятора Android, а затем использовать baksmali (дизассемблер smali) для преобразования файлов .dex в .smali, как описано в этом вопросе. Здесь может быть короткий путь). Как только вы закончите, вы можете легко снова упаковать apk-файл обратно с помощью apktool. Обратите внимание, что apktool не подписывает результирующий apk, поэтому вам нужно позаботиться об этом, как и о любом другом приложении для Android.
Если вы пойдете по пути smali, возможно, вам захочется попробовать APK Studio, IDE, которая автоматизирует некоторые из вышеперечисленных шагов, чтобы помочь вам с декомпиляцией и перекомпиляцией apk и установкой его на устройство.
Короче говоря, ваш выбор в значительной степени заключается либо в декомпиляции на Java, которая более удобочитаема, но, вероятно, необратима, либо в дизассемблировании на smali, который сложнее читать, но гораздо более гибок для внесения изменений и переупаковки измененного приложения. Какой подход вы выберете, будет зависеть от того, чего вы хотите достичь.
Наконец, предложение dare также заслуживает внимания. Это инструмент для преобразования файлов .dex и .apk в файлы java .class, чтобы их можно было анализировать с помощью типичных инструментов статического анализа java.
Ответ 3
На самом деле я бы рекомендовал обратиться сюда: https://github.com/JesusFreke/smali
Он предоставляет BAKSMALI, самый превосходный инструмент обратного инжиниринга для файлов DEX. Он сделан Иисусом Фриком, парнем, который создал знаменитые ROM для Android.
Ответ 4
Поскольку ответ Dheeraj Bhaskar
относительно старый, прошло столько же лет.
Вот мой последний ответ (2019 года выпуска):
Основная логика
от dex
до java sourcecode
в настоящее время существует два вида решений:
One Step
: прямое преобразованиеdex
вjava sourcecode
Two Step
: первое преобразованиеdex
вjar
, второе преобразованиеjar
вjava sourcecode
Одноэтапное решение: dex
непосредственно в java sourcecode
Инструменты
Процесс
- скачать jadx-0.9.0.zip, разархивировать, в
bin
папке можно увидеть командную строкуjadx
или версию с графическим интерфейсомjadx-gui
, дважды щелкните, чтобы запустить версию с графическим интерфейсом:jadx-gui
- открыть
dex
файл
тогда можно показать исходный код Java:
File
->save as gradle project
then got java sourcecode:
Two Step solution
Step1: dex
to jar
Tools
Process
download dex2jar zip, unzip got d2j-dex2jar.sh
, then:
apk
tojar
:sh d2j-dex2jar.sh -f ~/path/to/apk_to_decompile.apk
dex
tojar
:sh d2j-dex2jar.sh -f ~/path/to/dex_to_decompile.dex
example:
➜ v3.4.8 /Users/crifan/dev/dev_tool/android/reverse_engineering/dex-tools/dex-tools-2.1-SNAPSHOT/d2j-dex2jar.sh -f com.huili.readingclub8825612.dex
dex2jar com.huili.readingclub8825612.dex -> ./com.huili.readingclub8825612-dex2jar.jar
➜ v3.4.8 ll
-rw------- 1 crifan staff 9.5M 3 21 10:00 com.huili.readingclub8825612-dex2jar.jar
-rw------- 1 crifan staff 8.4M 3 19 14:04 com.huili.readingclub8825612.dex
Шаг 2: jar
чтобы java sourcecode
Инструменты
- jd-gui: самый популярный, но
many
ошибка декомпиляции кода - CRF: популярно,
minor
ошибка декомпиляции кода - Procyon: популярное,
no
ошибка декомпиляции кода- Графический инструмент, основанный на
Procyon
- Графический инструмент, основанный на
- Прочее
- Krakatau
- Fernflower
- старый: AndroChef
- и др.
Процесс
здесь демонстрация Procyon
преобразование jar в исходный код Java:
скачать procyon-decompiler-0.5.34.jar
затем используя синтаксис:
java -jar /path/to/procyon-decompiler-0.5.34.jar -jar your_to_decompile.jar -o outputFolderName
пример:
java -jar /Users/crifan/dev/dev_tool/android/reverse_engineering/Procyon/procyon-decompiler-0.5.34.jar -jar com.huili.readingclub8825612-dex2jar.jar -o com.huili.readingclub8825612
использование редактора VSCode для открытия экспортированного исходного кода выглядит следующим образом:
Заключение
Корректность преобразования : Jadx
> Procyon
> CRF
> JD-GUI
Рекомендуем использовать: (Одноэтапное решение) Jadx
для более подробного объяснения, пожалуйста, обратитесь к моей онлайн-китайской электронной книге: