декомпиляция DEX в исходный код Java - PullRequest
683 голосов
/ 09 августа 2009

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

Ответы [ 17 ]

855 голосов
/ 14 ноября 2010

Это просто

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

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

2) jd-gui для просмотра java-файлов в банке

Исходный код вполне читабелен, так как dex2jar делает некоторые оптимизации.

Процедура:

А вот процедура декомпиляции:

Шаг 1:

Преобразовать классы.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

Примечание: На машинах Windows все сценарии .sh заменены .bat сценариями

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

Шаг 2:

Открыть банку в JD-GUI

The decompiled source

129 голосов
/ 05 ноября 2011

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

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

60 голосов
/ 09 августа 2009

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

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

28 голосов
/ 09 января 2012

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

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

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

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

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

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

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

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

22 голосов
/ 05 марта 2015

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

15 голосов
/ 17 августа 2011

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

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

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

15 голосов
/ 20 сентября 2017

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

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

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

1) Android Studio 2.x: построить> проанализировать apk enter image description here

2) Android Studio 3.0: Профиль или Отладка APK enter image description here enter image description here

13 голосов
/ 26 апреля 2012

После того, как вы загрузили файл 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 голосов
/ 23 апреля 2010

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

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

8 голосов
/ 09 февраля 2012

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

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

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

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

  • он декомпилирует файлы .class, т.е. мы получим обфусцированный .java обратно из apk.
...