Как можно декомпилировать файлы Android DEX (VM bytecode) в соответствующий исходный код Java?
Как можно декомпилировать файлы Android DEX (VM bytecode) в соответствующий исходный код Java?
Ответы:
Получить эти инструменты:
1) dex2jar для перевода файлов dex в файлы jar
2) JD-GUI для просмотра файлов Java в банке
Исходный код вполне читабелен, так как dex2jar делает некоторые оптимизации.
А вот процедура о том, как декомпилировать:
Преобразуйте 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
илиbash
. Полная команда должна быть:
sh d2j-dex2jar.sh -f -o output_jar.jar apk_to_decompile.apk
Примечание 3: Кроме того, не забудьте добавить разрешение на выполнение в
dex2jar-X.X
каталог, напримерsudo chmod -R +x dex2jar-2.0
Откройте банку в JD-GUI
Чтобы уточнить, есть два основных пути, которые вы можете выбрать здесь в зависимости от того, чего вы хотите достичь:
Декомпилируйте байт-код Dalvik (dex) в читаемый исходный код Java. Вы можете легко сделать это с помощью dex2jar и jd -gui , как упоминает Фред . Полученный в результате источник полезен для чтения и понимания функциональности приложения, но, скорее всего, не даст 100% пригодного для использования кода. Другими словами, вы можете прочитать исходный код, но вы не можете изменить и упаковать его. Обратите внимание, что если исходный код был запутан с помощью proguard, результирующий исходный код будет значительно сложнее распутать.
Другая важная альтернатива - разбирать байт-код на smali , язык ассемблера, предназначенный именно для этой цели. Я обнаружил, что самый простой способ сделать это с помощью apktool . После того, как вы установили apktool, вы можете просто указать его на файл apk, и вы получите файл smali для каждого класса, содержащегося в приложении. Вы можете читать и изменять smali или даже полностью заменять классы, генерируя smali из нового источника Java (для этого вы можете скомпилировать ваш источник .java в файлы .class с помощью javac, а затем преобразовать ваши файлы .class в файлы .dex с помощью Android dx-компилятор, а затем используйте baksmali (smali disassembler) для преобразования файлов .dex в .smali, как описано в этом вопросе., Здесь может быть ярлык). Как только вы закончите, вы можете легко упаковать apk обратно с apktool снова. Обратите внимание, что apktool не подписывает полученный apk, поэтому вам нужно позаботиться об этом, как и в любом другом приложении Android .
Если вы пойдете по пути smali, вы можете попробовать APK Studio , IDE, которая автоматизирует некоторые из вышеперечисленных шагов, помогая вам декомпилировать и перекомпилировать apk и устанавливать его на устройство.
Короче говоря, вы можете либо декомпилировать в Java, которая более читабельна, но, вероятно, необратима, либо разбирать на smali, который труднее читать, но гораздо гибче вносить изменения и переупаковывать измененное приложение. Какой подход вы выберете, будет зависеть от того, чего вы хотите достичь.
Наконец, предложение о вызове также заслуживает внимания. Это инструмент ретаргетинга для преобразования файлов .dex и .apk в файлы java .class, чтобы их можно было проанализировать с помощью типичных инструментов статического анализа java.
Я действительно рекомендую пойти сюда: https://github.com/JesusFreke/smali
Он предоставляет BAKSMALI, который является превосходным инструментом обратного инжиниринга для файлов DEX. Это сделал JesusFreke, парень, который создал знаменитые ПЗУ для Android.
./apktool d myprogram.apk
. Смотри мой ответ .
Более полная версия Фреда «S ответ :
Сначала вам нужен инструмент для извлечения всех (скомпилированных) классов из DEX в JAR.
Один из них называется dex2jar и сделан китайским студентом.
Затем вы можете использовать jd-gui для декомпиляции классов в JAR до исходного кода.
Полученный источник должен быть достаточно читабельным, поскольку dex2jar применяет некоторые оптимизации.
Вы можете использовать APKTool . Он автоматически извлечет все классы ( .dex
), resources ( .asrc
), затем преобразует двоичный XML в читаемый человеком XML , а также разберет классы для вас.
Разборка всегда будет более надежной, чем декомпиляция, особенно с
JAR-файлами, скрытыми в Pro Guard!
Просто скажите APKTool, чтобы декодировать APK в каталог, затем измените то, что вы хотите,
и, наконец, закодируйте его обратно в APK. Это все.
Важно: APKTool разбирается . Это не декомпилируется .
Сгенерированный код не будет исходным кодом Java.
Но вы должны быть в состоянии прочитать его и даже отредактировать, если вы знакомы с жасмином .
Если вы хотите получить исходный код Java, пожалуйста, перейдите в ручном режиме .
Иногда вы получаете неработающий код при использовании dex2jar
/ apktool
, особенно в циклах. Чтобы избежать этого, используйте jadx , который декомпилирует байт-код dalvik в исходный код java, не создавая сначала файл .jar
/, .class
как это dex2jar
делает (я думаю, apktool использует dex2jar). Это также с открытым исходным кодом и в активной разработке. У него даже есть GUI, для GUI-фанатиков. Попробуй это!
javac "$(find . -name '*.java')"
?
я использовал
Но никто не сравнится с собственными инструментами Google
Поскольку никто не упомянул об этом, есть еще один инструмент: домашняя страница DED
Установка с практическими рекомендациями и некоторые пояснения: Установка .
Он был использован в довольно интересном исследовании безопасности популярных приложений на рынке (не очень связанном, просто если вам интересно): обзор безопасности приложений для Android
Поскольку Dheeraj Bhaskar
ответ относительно старый, как и много лет назад.
Вот мой последний (2019 год) ответ:
от dex
до java sourcecode
, в настоящее время есть два вида решения:
One Step
: напрямую конвертировать dex
вjava sourcecode
Two Step
: сначала преобразовать dex
в jar
, второй преобразовать jar
вjava sourcecode
dex
непосредственно кjava sourcecode
bin
папке можно увидеть jadx
версию командной строки или GUI jadx-gui
, дважды щелкните для запуска версии GUI:jadx-gui
dex
файлзатем может показать исходный код Java:
File
-> save as gradle project
затем получил исходный код Java:
dex
чтобыjar
скачать dex2jar zip , распаковать архивd2j-dex2jar.sh
, затем:
apk
к jar
:sh d2j-dex2jar.sh -f ~/path/to/apk_to_decompile.apk
dex
к jar
:sh d2j-dex2jar.sh -f ~/path/to/dex_to_decompile.dex
пример:
➜ 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
jar
чтобыjava sourcecode
many
код будет декомпилировать ошибкуminor
код декомпилирует ошибкуno
ошибка декомпиляции кода
Procyon
Здесь демо 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
для более подробного объяснения, пожалуйста, обратитесь к моей онлайн- книге на китайском языке : 安卓 应用 的 安全 和 破解
dex2jar-2.0>d2j-dex2jar.bat -f D:\android\some_dex_file.dex
просто java.io.IOException: the src file not a .dex or zip file
d2j-dex2jar.bat "D:\android\some_dex_file.dex"
нормально или нет?
>d2j-dex2jar.bat file.dex
но это не хорошо. может это из-за того, что мой .dex
файл был скопирован dalvik-cache
?
dex is copied from dalvik-cache
, должно бытьdex is decompiled from apk
После того, как вы загрузили файл APK, вам нужно выполнить следующие шаги, чтобы получить редактируемый код / документ Java.
С Dedexer вы можете разобрать .dex
файл в байт-код dalvik (.ddx
).
Насколько я знаю, декомпиляция в сторону Java невозможна.
О байт-коде dalvik вы можете прочитать здесь .
Возможен обратный инжиниринг Android . Выполните следующие действия, чтобы получить файл .java из файла apk.
Шаг 1 . Использование dex2jar
dex2jar sampleApp.apk
Шаг 2 . Декомпиляция .jar с использованием JD-GUI
Последние Debian имеют пакет Python androguard
:
Description-en: full Python tool to play with Android files
Androguard is a full Python tool to play with Android files.
* DEX, ODEX
* APK
* Android's binary xml
* Android resources
* Disassemble DEX/ODEX bytecodes
* Decompiler for DEX/ODEX files
Установите соответствующие пакеты:
sudo apt-get install androguard python-networkx
Декомпилировать файл DEX:
$ androdd -i classes.dex -o ./dir-for-output
Извлечение classes.dex
из Apk + Декомпилировать:
$ androdd -i app.apk -o ./dir-for-output
Apk-файл - это не более, чем Java-архив (JAR), вы можете извлечь файлы из архива через:
$ unzip app.apk -d ./dir-for-output
Многое изменилось, так как большинство из этих ответов были опубликованы. В настоящее время существует множество простых инструментов с графическим интерфейсом, например:
APK Easy Tool for Windows (GUI tool, friendly)
Bytecode Viewer - APK/Java Reverse Engineering Suite
URET Android Reverser Toolkit
Лучшее место для их поиска - на форуме разработчиков XDA.
Вы можете попробовать JADX ( https://bitbucket.org/mstrobel/procyon/wiki/Java%20Decompiler ), это идеальный инструмент для декомпиляции DEX.
И да, он также доступен онлайн на (моем: 0) новом сайте: http://www.javadecompilers.com/apk/
Это можно сделать в следующие пять шагов:
Самый простой способ декомпилировать андроид приложение , это загрузить приложение под названием ShowJava из playstore. Просто выберите приложение, которое нужно декомпилировать, из списка приложений. Существует три различных декомпилятора, которые вы можете использовать для декомпиляции приложения, а именно:
CFR 0.110, JaDX 0.6.1 или FernFlower (аналитический декомпилятор).
Если вы не хотите загружать dex2jar, просто используйте apk_grabber
скрипт python для декомпиляции любого apk в jar-файлы. Затем вы читаете их с помощью jd-gui.