декомпиляция DEX в исходный код Java

706

Как можно декомпилировать файлы Android DEX (VM bytecode) в соответствующий исходный код Java?

Будет
источник
Посмотрите здесь . Вы получите возможные выводы оттуда, чтобы двигаться дальше.
Кевин Бойд
Обновленная информация доступна в блоге хаберов
Md Mohsin,
Если у вас есть деньги, купите Jeb , в противном случае используйте JADX , посмотрите здесь, почему
Polym
Существует новый кросс-платформенный (java) и инструмент с открытым исходным кодом, который позволяет вам это сделать, просто извлеките bytecodeviewer: stackoverflow.com/a/36557898/795245
Gomino

Ответы:

882

Это просто

Получить эти инструменты:

1) dex2jar для перевода файлов dex в файлы jar

2) JD-GUI для просмотра файлов Java в банке

Исходный код вполне читабелен, так как 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или 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

документация dex2jar

Шаг 2:

Откройте банку в JD-GUI

Декомпилированный источник

Dheeraj Bhaskar
источник
57
+1. Я пробовал и Баксмали, и Декс2джар. Dex2Jar + JD-Gui побеждает за то, что предоставил вам отлично читаемый исходный код для большинства файлов .dex.
Джонатан Думайн
привет, не могли бы вы поделиться тем, как вы идете? Я буду очень благодарен вам.
Арслан Анвар
2
Вышеприведенное предложение прозвенело в колокольчике - похоже, здесь кавычка : geeknizer.com/decompile-reverse-engineer-android-apk (или наоборот?). Связанные статьи кратко объясняют вышеупомянутые инструменты, а также Smali и APKTool.
AgentKnopf
2
@JonathanDumaine, это зависит. Если JAR-файлы запутаны, и вы хотите внести небольшие изменения, Backsmali - единственный путь. Бонус! С APKTool вы также получаете все XML, изображения и другие ресурсы обратно. Смотри мой ответ .
Альба Мендес
3
@JonathanDumaine Я согласен с jmendeth, apktool - это также путь, если вы хотите декомпилировать свой apk, изменить его, а затем перекомпилировать. При использовании dex2jar и jd-gui исходный код действительно читабелен, но вы не можете перекомпилировать без ошибок!
Darkheir
138

Чтобы уточнить, есть два основных пути, которые вы можете выбрать здесь в зависимости от того, чего вы хотите достичь:

Декомпилируйте байт-код 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.

Зак Липтон
источник
61

Я действительно рекомендую пойти сюда: https://github.com/JesusFreke/smali

Он предоставляет BAKSMALI, который является превосходным инструментом обратного инжиниринга для файлов DEX. Это сделал JesusFreke, парень, который создал знаменитые ПЗУ для Android.

reflog
источник
3
smali - это язык, похожий на ассемблер, основанный на dalvik IL, его нельзя напрямую перевести на Java.
reflog
@endryha Нет инструментов, способных сделать это. Смотрите этот вопрос для получения дополнительной информации.
Альба Мендес
1
Код, код, код, ... Почему только код? Если вы используете APKTool, вы получите все обратно! И это так же просто, как ./apktool d myprogram.apk. Смотри мой ответ .
Альба Мендес
30

Более полная версия Фреда «S ответ :

Ручной способ

Сначала вам нужен инструмент для извлечения всех (скомпилированных) классов из DEX в JAR.
Один из них называется dex2jar и сделан китайским студентом.

Затем вы можете использовать jd-gui для декомпиляции классов в JAR до исходного кода.
Полученный источник должен быть достаточно читабельным, поскольку dex2jar применяет некоторые оптимизации.

Автоматический способ

Вы можете использовать APKTool . Он автоматически извлечет все классы ( .dex), resources ( .asrc), затем преобразует двоичный XML в читаемый человеком XML , а также разберет классы для вас.
Разборка всегда будет более надежной, чем декомпиляция, особенно с
JAR-файлами, скрытыми в Pro Guard!

Просто скажите APKTool, чтобы декодировать APK в каталог, затем измените то, что вы хотите,
и, наконец, закодируйте его обратно в APK. Это все.

Важно: APKTool разбирается . Это не декомпилируется .
Сгенерированный код не будет исходным кодом Java.
Но вы должны быть в состоянии прочитать его и даже отредактировать, если вы знакомы с жасмином .
Если вы хотите получить исходный код Java, пожалуйста, перейдите в ручном режиме .

Альба Мендес
источник
25

Иногда вы получаете неработающий код при использовании dex2jar/ apktool, особенно в циклах. Чтобы избежать этого, используйте jadx , который декомпилирует байт-код dalvik в исходный код java, не создавая сначала файл .jar/, .classкак это dex2jarделает (я думаю, apktool использует dex2jar). Это также с открытым исходным кодом и в активной разработке. У него даже есть GUI, для GUI-фанатиков. Попробуй это!

Polym
источник
Я полагаю, что у jadx нет опции компиляции, но код читабелен
Buddy
@EnesBattal ты имеешь ввиду javac "$(find . -name '*.java')"?
Полим
как насчет формирования apk? размещение классов в apk, zipalign, подписи и т. д.
Buddy
@EnesBattal Ну, вы можете помочь реализовать это - в противном случае вы могли бы использовать для этого apktool .. или zipalign / sign с помощью инструментов Android
polym
1
@lejonl Смертная казнь для тебя, монстр!
Polym
17

я использовал

  1. dex2jar + jd-gui
  2. javadecompilers.com
  3. enjarify
  4. Apktool

Но никто не сравнится с собственными инструментами Google

1) Android Studio 2.x: сборка> анализ apk введите описание изображения здесь

2) Android Studio 3.0: профиль или отладка APK введите описание изображения здесь введите описание изображения здесь

ishandutta2007
источник
1
Плюс один для Enjarify. По моему личному опыту, он показал лучшие результаты по сравнению с d2j
qre0ct
15

Поскольку никто не упомянул об этом, есть еще один инструмент: домашняя страница DED

Установка с практическими рекомендациями и некоторые пояснения: Установка .

Он был использован в довольно интересном исследовании безопасности популярных приложений на рынке (не очень связанном, просто если вам интересно): обзор безопасности приложений для Android

Фаэтон
источник
Это выглядит многообещающе. Декомпилирует ли он Java-код непосредственно из APK? Как насчет запутанного кода Java?
сандал
14

Поскольку Dheeraj Bhaskarответ относительно старый, как и много лет назад.

Вот мой последний (2019 год) ответ:

Основная логика

от dexдо java sourcecode, в настоящее время есть два вида решения:

  • One Step: напрямую конвертировать dexвjava sourcecode
  • Two Step: сначала преобразовать dexв jar, второй преобразовать jarвjava sourcecode

Одношаговое решение: dexнепосредственно кjava sourcecode

инструменты

Обработать

  1. скачайте jadx-0.9.0.zip , разархивируйте его, в binпапке можно увидеть jadxверсию командной строки или GUI jadx-gui, дважды щелкните для запуска версии GUI:jadx-gui

  1. открыть dexфайл

затем может показать исходный код Java:

  1. File -> save as gradle project

затем получил исходный код Java:


Двухшаговое решение

Шаг 1: 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

Шаг 2: jarчтобыjava sourcecode

инструменты

Обработать

Здесь демо 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


для более подробного объяснения, пожалуйста, обратитесь к моей онлайн- книге на китайском языке : 安卓 应用 的 安全 和 破解

crifan
источник
странно, но если я попытаюсь выполнить 1 шаг (декомпилировать dex to jar в Windows) с помощью этой команды 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"нормально или нет?
crifan
да, я пытался точно, >d2j-dex2jar.bat file.dexно это не хорошо. может это из-за того, что мой .dexфайл был скопирован dalvik-cache?
Сергей
1
@ Сергей да, самая вероятная причина, по твоему мнению dex is copied from dalvik-cache, должно бытьdex is decompiled from apk
crifan
@crifan, спасибо за этот ответ. JADX впечатляет. я вернусь к работе. Эммануэль @ JD-Gui
Эммануэль Дюпюи
13

После того, как вы загрузили файл APK, вам нужно выполнить следующие шаги, чтобы получить редактируемый код / ​​документ Java.

  1. Конвертируйте ваш apk-файл в zip-файл (при запуске загрузки не используйте параметр «сохранить», просто перейдите к «сохранить как» и укажите свое расширение как .zip), выполнив подобные действия, вы можете избежать APKTOOL ...
  2. Распакуйте zip-файл, там вы можете найти somefilename.dex. так что теперь нам нужно конвертировать dex -> .class
  3. Для этого вам понадобится «dex2jar» (вы можете скачать его с http://code.google.com/p/dex2jar/ , после распаковки, в командной строке вы должны упомянуть, например, [D: \ dex2jar-0.09> dex2jar somefilename.dex] (Имейте в виду, что ваш somefilename.dex должен находиться в той же папке, где вы храните ваш dex2jar.)
  4. Загрузите jad с http://www.viralpatel.net/blogs/download/jad/jad.zip и распакуйте его. После распаковки вы увидите два файла, таких как «jad.exe» и «Readme.txt» (иногда вместо «jad.exe» может присутствовать «jad.txt», поэтому просто переименуйте его расширение в «as.exe»).
  5. Наконец, в командной строке вы должны упомянуть, как [D: \ jad> jad -sjava yourfilename.class], он будет анализировать ваш файл класса в редактируемый документ Java.
Камаль
источник
8

С Dedexer вы можете разобрать .dexфайл в байт-код dalvik (.ddx ).

Насколько я знаю, декомпиляция в сторону Java невозможна.
О байт-коде dalvik вы можете прочитать здесь .

HCPL
источник
1
Принято, так как вы говорите, что это (в настоящее время) невозможно, что кажется правдой.
Будет
@ Все будет возможно. Все зависит от того, как вы это видите. Декомпиляция это возможно, но , возможно , не так , как вы думаете.
Альба Мендес
8

Возможен обратный инжиниринг Android . Выполните следующие действия, чтобы получить файл .java из файла apk.

Шаг 1 . Использование dex2jar

  • Создать файл .jar из файла .apk
  • команда: dex2jar sampleApp.apk

Шаг 2 . Декомпиляция .jar с использованием JD-GUI

  • он декомпилирует файлы .class, т.е. мы получим запутанный файл .java обратно из apk.
gtiwari333
источник
Но если я снова скомпилирую весь декомпилированный исходный код, он не запустится, компилятор покажет много ошибок.
Есть ли какое-либо решение для декомпиляции исходного кода Java для Android будет работать в Eclipse
2
Reverse Engineering вовсе не обязательно означает декомпиляции . Фактически, JAR-файлы, скрытые ProGuard, не будут правильно декомпилироваться.
Альба Мендес
Если вы имеете дело с обфусцированным кодом, лучше просто разобрать его. Вы не получите исходный код Java, но вы всегда сможете увидеть / изменить код. Смотри мой ответ .
Альба Мендес
Я бы порекомендовал делать как декомпиляцию, так и дизассемблирование. Результирующий декомпилированный код легче понять, но все модификации должны быть сделаны с разобранной версией. Особенно верно, если Proguard был использован. Я считаю, что dex2jar в сочетании с jd-gui лучше всего подходит для декомпиляции.
Микко Ранталайнен
6

Последние 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
gavenkoa
источник
5

Многое изменилось, так как большинство из этих ответов были опубликованы. В настоящее время существует множество простых инструментов с графическим интерфейсом, например:

APK Easy Tool for Windows (GUI tool, friendly)
Bytecode Viewer - APK/Java Reverse Engineering Suite
URET Android Reverser Toolkit

Лучшее место для их поиска - на форуме разработчиков XDA.

MPaulo
источник
4

Вы можете попробовать JADX ( https://bitbucket.org/mstrobel/procyon/wiki/Java%20Decompiler ), это идеальный инструмент для декомпиляции DEX.

И да, он также доступен онлайн на (моем: 0) новом сайте: http://www.javadecompilers.com/apk/

Андрей Рукин
источник
Скажем, можно использовать вместо этого в коде? Имеется ввиду даже в самом Android? И не здесь ли сайт: github.com/skylot/jadx ?
Android-разработчик
2

Это можно сделать в следующие пять шагов:

Этот драгоценный камень делает эти вещи для вас автоматически, даже установка необходимых инструментов

  1. конвертировать файл apk в zip
  2. распаковать файл
  3. извлечь из него classes.dex
  4. используйте dex to jar для конвертирования classes.dex в файл jar
  5. используйте JADX GUI, чтобы открыть файл JAR в качестве исходного кода Java
Аджит Сингх
источник
2

Самый простой способ декомпилировать андроид приложение , это загрузить приложение под названием ShowJava из playstore. Просто выберите приложение, которое нужно декомпилировать, из списка приложений. Существует три различных декомпилятора, которые вы можете использовать для декомпиляции приложения, а именно:

CFR 0.110, JaDX 0.6.1 или FernFlower (аналитический декомпилятор).

Ришабх Маурья
источник
1

Если вы не хотите загружать dex2jar, просто используйте apk_grabberскрипт python для декомпиляции любого apk в jar-файлы. Затем вы читаете их с помощью jd-gui.

Джефф Брейтман
источник