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


706

Як можна декомпілювати файли Android DEX (байт-код VM) у відповідний вихідний код Java?


Подивіться тут . Звідси ви зможете рухатися далі.
Кевін Бойд

Оновлена ​​інформація доступна в блозі центру кодерів: coders-hub.com/2013/04/how-to-convert-apk-file-into-source.html
Md

Якщо у вас є гроші, купуйте jeb , інакше використовуйте jadx , дивіться тут чому
polym

Існує новий хрест з копірайтом (Java) і інструмент з відкритим вихідним кодом, що дозволить вам зробити це, тільки фотографії bytecodeviewer: stackoverflow.com/a/36557898/795245
Gomino

Відповіді:


881

Це легко

Отримайте ці інструменти:

1) dex2jar для перекладу файлів dex у файли jar

2) jd-gui для перегляду файлів java в банку

Вихідний код досить читабельний, оскільки dex2jar робить деякі оптимізації.

Порядок:

А ось процедура декомпіляції:

Крок 1:

Перетворити class.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

Декомпільоване джерело


57
+1. Я спробував і Baksmali, і Dex2jar. Dex2Jar + JD-Gui виграє за те, що ви прекрасно читаєте вихідний код для більшості файлів .dex.
Джонатан Дюман

привіт, поділіться, будь ласка, шляхом, яким ви йдете? Я буду вам дуже вдячний.
Арслан Анвар

2
Вищезгадане речення пролунало дзвоном - це, здається, є напівцитатами звідси: geeknizer.com/decompile-reverse-engineer-android-apk (чи навпаки?). Зв'язані статті коротко пояснюють вищезгадані інструменти, а також Smali та APKTool.
AgentKnopf

2
@JonathanDumaine, що залежить. Якщо JARs затуманені і ви хочете зробити невеликі модифікації, Backsmali - це єдиний шлях. Бонус! За допомогою APKTool ви також отримуєте назад усі XML, зображення та інші ресурси. Дивіться мою відповідь .
Альба Мендес

3
@JonathanDumaine Я погоджуюся з jmendeth, apktool - це також шлях, якщо ви хочете декомпілювати свій apk, змінити його і потім перекомпілювати. При використанні dex2jar та jd-gui джерело справді читабельно, але ви не можете перекомпілювати без деяких помилок!
darkheir

138

Щоб уточнити, є два основні шляхи, які ви можете пройти тут залежно від того, що ви хочете досягти:

Декомпілюйте байт-код Dalvik (dex) у читабельне джерело Java. Це легко зробити за допомогою dex2jar та jd-gui , як це зазначає fred. Отримане джерело корисно для читання та розуміння функціональності програми, але, швидше за все, не створює 100% корисного коду. Іншими словами, ви можете прочитати джерело, але ви не можете дійсно його модифікувати та перепакувати. Зауважте, що якщо джерело було затуманено захистом, отриманий вихідний код буде значно складніше розплутати.

Інша основна альтернатива - це розібрати байт-код на smali , мову складання, розроблену саме для цієї мети. Я виявив, що найпростіший спосіб зробити це за допомогою apktool . Після встановлення apktool ви можете просто вказати його на файл apk, і ви отримаєте файл smali для кожного класу, що міститься в програмі. Ви можете читати та змінювати smali або навіть повністю замінювати класи, генеруючи smali з нового джерела Java (для цього ви можете зібрати свій .java джерело у .class файли з javac, а потім конвертувати ваші .class файли в .dex файли з Android dx-компілятор, а потім використовуйте baksmali (smali demonsembler) для перетворення .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, хлопець, який створив відомі ROM для Android.


3
smali - мова, що нагадує збірку, заснована на далвікові IL, її неможливо безпосередньо перекласти на Java.
reflog

@endryha Немає інструментів, здатних це робити. Дивіться це питання для отримання додаткової інформації.
Альба Мендес

1
Код, код, код, ... Чому тільки код? Якщо ви використовуєте APKTool, ви отримуєте все назад! І це так само просто ./apktool d myprogram.apk. Дивіться мою відповідь .
Альба Мендес

30

Більш повна версія Фреда «S відповідь :

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

Спочатку вам потрібен інструмент для вилучення всіх (складених) класів на DEX до JAR.
Є такий під назвою dex2jar , який виготовляє китайський студент.

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

Автоматичний спосіб

Можна використовувати APKTool . Він автоматично витягує всі класи ( .dex), ресурси ( .asrc), потім перетворює бінарний XML в читаний людиною XML , а також розбирає класи для вас.
Демонтаж завжди буде більш надійним, ніж декомпіляція, особливо з
JARs, затуманеними Pro Pro Guard!

Просто скажіть APKTool, щоб розшифрувати APK в каталог, потім змінити те, що ви хочете,
і, нарешті, закодувати його назад в APK. Це все.

Важливо: APKTool dissassembles . Він не декомпілюється .
Створений код не буде джерелом Java.
Але ви повинні мати можливість прочитати його та навіть редагувати, якщо ви знайомі з жасмином .
Якщо ви хочете джерело Java, перейдіть вручну .


25

Іноді ви отримуєте зламаний код під час використання dex2jar/ apktool, особливо в циклі. Щоб уникнути цього, використовуйте jadx , який декомпілює байткод dalvik у вихідний код Java, не створюючи спочатку файл .jar/ .classфайл (як dex2jarя вважаю, apktool використовує dex2jar). Він також є відкритим кодом та в активному розвитку. Він навіть має графічний інтерфейс, призначений для GUI-фанатиків. Спробуй це!


Я думаю, що в jadx немає опції компіляції, але код читається, хоча
Бадді

@EnesBattal ти маєш на увазі, як javac "$(find . -name '*.java')"?
полим

як щодо формування apk? розміщення занять з apk, zipalign, підписання тощо
Buddy

@EnesBattal Ну, ви можете допомогти здійснити це - інакше ви можете використовувати apktool для цього .. або zipalign / підписати за допомогою інструментів Android
polym

1
@lejonl Смертельна кара для вас, чудовисько!
полим

17

Я звик

  1. dex2jar + jd-gui
  2. javadecompilers.com
  3. еняріфікувати
  4. Apktool

Але ніхто не перемагає власні інструменти Google

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

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


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

Інструменти

Процес

завантажте zip dex2jar , розпакуйте отримане 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конвертувати банку в вихідний код 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


Для більш детального пояснення, будь ласка, зверніться до моєї електронної книги з китайської мови : 安卓 应用 的 安全 和 破解


дивно, але якщо я спробую виконати 1 крок (dex to jar decompile в 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 вражає. я повернусь до роботи. Emmanuel @ JD-Gui
Emmanuel Dupuy

13

Завантаживши файл APK, вам потрібно виконати наступні дії, щоб отримати редагуваний код / ​​документ java.

  1. Перетворіть свій файл apk в zip (при запуску завантаження не йдіть з опцією "save", просто перейдіть з "save as" і згадайте про розширення як .zip), роблячи так, ви можете уникнути APKTOOL ...
  2. Витягніть zip-файл, там ви можете знайти somefilename.dex. тому зараз нам потрібно перетворити dex -> .class
  3. Для цього вам потрібен "dex2jar" (ви можете завантажити його з http://code.google.com/p/dex2jar/ , після вилучення, у командному рядку ви повинні згадати як, [D: \ dex2jar-0,09> dex2jar somefilename.dex] (Пам’ятайте, що ваш файл filename.dex повинен знаходитися всередині тієї самої папки, де ви зберігаєте свій dex2jar.)
  4. Завантажте jad з http://www.viralpatel.net/blogs/download/jad/jad.zip та витягніть його. Після вилучення ви можете побачити два файли, такі як "jad.exe" та "Readme.txt" (іноді "jad.txt" може замість "jad.exe", тому просто перейменуйте його розширення як.exe для запуску)
  5. Нарешті, у командному рядку ви повинні згадати на зразок [D: \ jad> jad -sjava yourfilename.class], він буде аналізувати файл вашого класу на редагованому документі Java.

8

За допомогою Dedexer ви можете розібрати .dexфайл на байткод dalvik ( .ddx).

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


1
прийнято, оскільки ви сказали, що це (наразі) неможливо, що здається правдою.
Чи буде

@ Буде все можливо. Просто залежить від того, як ви це бачите. Декомпіляція це можливо, але , можливо , не так , як ви думаєте.
Альба Мендес

8

Android Reverse Engineering можлива . Виконайте ці дії, щоб отримати .java файл з apk-файла.

Крок 1 . Використання dex2jar

  • Створення .jar-файлу з .apk-файлу
  • команда: dex2jar sampleApp.apk

Крок2. Декомпіляція .jar за допомогою JD-GUI

  • це декомпілюються .class файли , тобто, то ми отримаємо затемнений .java назад від APK.

Але якщо я знову компілюю весь декомпільований вихідний код, він не запуститься, компілятор показує багато помилок.

чи є якесь рішення для декомпіляції андроїд-Java-вихідного коду буде працювати у затемненні

2
Reverse Engineering зовсім НЕ обов'язково означає декомпіляцію . Насправді, затуманені JARs, захищені ProGuard, не декомпілюються правильно.
Альба Мендес

Якщо ви маєте справу з прихованим кодом, краще просто розібрати його. Ви не отримаєте джерело Java, але ви завжди зможете побачити / змінити код. Дивіться мою відповідь .
Альба Мендес

Я б рекомендував робити як розкладання, так і розбирання. Отриманий декомпільований код простіший для розуміння, але всі зміни повинні бути виконані з розібраною версією. Особливо вірно, якщо прогуар був використаний. Я вважаю, що dex2jar у поєднанні з jd-gui є найкращим для декомпіляції.
Mikko Rantalainen

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 + Decompile:

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

Apk-файл - це не що інше, як архів Java (JAR), ви можете витягувати файли з архіву за допомогою:

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

5

Багато що змінилося з моменту опублікування більшості цих відповідей. Зараз є кілька простих інструментів з графічним інтерфейсом, таких як:

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

Найкраще знайти їх на форумі розробників XDA.


4

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

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


Скажіть, чи можна використовувати це замість коду? Значить навіть в самому Android? А чи не веб-сайт тут: github.com/skylot/jadx ?
андроїд розробник

2

Це можна зробити за допомогою наступних п'яти кроків:

Цей самоцвіт робить це для вас автоматично, навіть встановлюючи необхідні інструменти

  1. конвертувати apk-файл в zip
  2. распакуйте файл
  3. витягнути з нього class.dex
  4. використовувати dex для jar, щоб перетворити Class.dex у файл jar
  5. використовувати jadx gui, щоб відкрити файл jar як вихідний код java

2

Найпростіший спосіб декомпілювати додаток для Android - це завантажити додаток з назвою ShowJava з playstore. Просто виберіть програму, яку потрібно декомпілювати зі списку програм. Є три різні декомпілятори, які ви можете використовувати для декомпіляції програми, а саме -

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


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.