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

606

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

  • 0
    Посмотрите здесь . Вы получите возможные оттуда ходы.
  • 0
    Обновленная информация доступна в блоге центра разработчиков: coders-hub.com/2013/04/how-to-convert-apk-file-into-source.html.
Показать ещё 2 комментария
Теги:
reverse-engineering
decompiler
dex

16 ответов

788
Лучший ответ

Легко

Получить следующие инструменты:

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

Примечание. В машинах Windows все сценарии .sh заменяются .bat скриптами

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

Шаг 2:

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

Изображение 1423

  • 56
    +1. Я пробовал и Баксмали, и Декс2джар. Dex2Jar + JD-Gui выигрывает за то, что предоставил вам отлично читаемый исходный код для большинства файлов .dex.
  • 0
    привет, не могли бы вы поделиться тем, как вы идете? Я буду очень благодарен вам.
Показать ещё 9 комментариев
118

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

Декомпилируйте байт-код 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, который труднее читать, но гораздо более гибким для внесения изменений и переупаковки модифицированного приложения. Какой подход вы выберете, будет зависеть от того, что вы хотите достичь.

Наконец, следует отметить предложение dare. Это инструмент перенацеливания для преобразования файлов .dex и .apk в java файлы .class, чтобы их можно было анализировать с помощью стандартных инструментов статического анализа Java.

  • 0
    vaibhavpandey.com/apkstudio хорош для смалийского пути.
  • 0
    Очень круто @Guntis. Я добавлю заметку об этом варианте.
61

Я бы рекомендовал здесь: https://github.com/JesusFreke/smali

Он предоставляет BAKSMALI, который является отличным инструментом для обратного проектирования файлов DEX. Это сделал JesusFreke, парень, создавший слабые ROM для Android.

  • 0
    Есть ли способ конвертировать файлы smali в код Java?
  • 3
    smali - это язык, похожий на ассемблер, основанный на dalvik IL, его нельзя напрямую перевести на Java.
Показать ещё 2 комментария
25

Более полная версия fred answer:

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

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

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

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

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

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

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

18

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

  • 0
    Работал как шарм.
  • 0
    Я предполагаю, что у jadx нет опции компиляции, но код читабелен, хотя
Показать ещё 6 комментариев
15

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

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

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

  • 0
    Это выглядит многообещающе. Декомпилирует ли он Java-код непосредственно из APK? Как насчет запутанного кода Java?
  • 6
    Это было заменено DARE siis.cse.psu.edu/dare/source.html
11

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

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

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

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

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

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

  • он декомпилирует файлы .class, то есть мы получим obfuscated.java обратно из apk.
  • 0
    Но если я снова скомпилирую весь декомпилированный исходный код, он не запустится, компилятор покажет много ошибок.
  • 0
    это связано с запутыванием
Показать ещё 7 комментариев
8

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

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

  • 1
    Принято, так как вы говорите, что это (в настоящее время) невозможно, что кажется правдой.
  • 0
    @ Все будет возможно. Все зависит от того, как вы это видите. Декомпиляция возможно, но , возможно , не так , как вы думаете.
4

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

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

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

4

В недавнем 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 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 + Decompile:

$ androdd -i app.apk -o ./dir-for-output

Файл Apk - это не что иное, как архив Java (JAR), вы можете извлекать файлы из архива через:

$ unzip app.apk -d ./dir-for-output
3

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

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

2

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

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

  • конвертировать файл apk в zip
  • разархивируйте файл
  • извлечь из него classes.dex
  • использовать dex для jar для преобразования classes.dex в файл jar.
  • использовать jadx gui для открытия файла jar в качестве исходного кода java
  • 0
    Как сделать 5-й пункт, чтобы получить файлы Java?
1

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

  • dex2jar + jd-gui
  • javadecompilers.com
  • enjarify
  • Apktool

Но ни один из них не использует собственные инструменты Google.

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

2) Android Studio 3.0: Профиль или отладка APK Изображение 1425 Изображение 1426

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

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

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

1

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню