dekompilowanie DEX-a do kodu źródłowego Java

706

Jak można dekompilować pliki DEX systemu Android (kod bajtowy VM) do odpowiedniego kodu źródłowego Java?

Będzie
źródło
Spójrz tutaj . Stamtąd dostaniesz potencjalnych klientów, aby przejść dalej.
Kevin Boyd,
Zaktualizowane informacje są dostępne na blogu centrum koderów: coders-hub.com/2013/04/how-to-convert-apk-file-into-source.html
Md Mohsin
Jeśli masz pieniądze, kup jeb , w przeciwnym razie użyj jadx , zobacz tutaj dlaczego
polym
Pojawiło się nowe narzędzie do tworzenia
płyt

Odpowiedzi:

881

To jest łatwe

Zdobądź te narzędzia:

1) dex2jar, aby przetłumaczyć pliki dex na pliki jar

2) jd-gui, aby wyświetlić pliki Java w słoiku

Kod źródłowy jest dość czytelny, ponieważ dex2jar dokonuje pewnych optymalizacji.

Procedura:

A oto procedura dekompilacji:

Krok 1:

Konwertuj klas.dex z test_apk-debug.apk na 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

Uwaga 1: Na komputerach z systemem Windows wszystkie .shskrypty są zastępowane przez .batskrypty

Uwaga 2: W systemie Linux / Mac nie zapomnij o shlub bash. Pełne polecenie powinno brzmieć:

sh d2j-dex2jar.sh -f -o output_jar.jar apk_to_decompile.apk 

Uwaga 3: Pamiętaj również, aby dodać uprawnienie do wykonywania do dex2jar-X.Xkatalogu npsudo chmod -R +x dex2jar-2.0

dokumentacja dex2jar

Krok 2:

Otwórz słoik w JD-GUI

Zdekompilowane źródło

Dheeraj Bhaskar
źródło
57
+1. Próbowałem zarówno Baksmali, jak i Dex2jar. Dex2Jar + JD-Gui wygrywa, zapewniając Ci doskonale czytelny kod źródłowy dla większości plików .dex.
Jonathan Dumaine
cześć, czy mógłbyś podzielić się swoją drogą? Będę ci bardzo wdzięczny.
Arslan Anwar
2
Powyższe zdanie zadzwoniło - wydaje się, że jest to pół-cytat stąd: geeknizer.com/decompile-reverse-engineer-android-apk (lub odwrotnie?). Powiązane artykuły krótko wyjaśniają wyżej wymienione narzędzia, a także Smali i APKTool.
AgentKnopf
2
@JathanathanDumaine to zależy. Jeśli pliki JAR są zaciemnione i chcesz wprowadzić małe modyfikacje, Backsmali to jedyna droga. Premia! Dzięki APKTool odzyskujesz również wszystkie pliki XML, obrazy i inne zasoby. Zobacz moją odpowiedź .
Alba Mendez,
3
@JathanathanDumaine Zgadzam się z jmendeth, apktool to także droga, jeśli chcesz zdekompilować swoją aplikację, zmodyfikować ją, a następnie ponownie skompilować. Podczas korzystania z dex2jar i jd-gui źródło jest naprawdę czytelne, ale nie można ponownie skompilować niektórych błędów!
darkheir,
138

Aby to nieco wyjaśnić, istnieją dwie główne ścieżki, w zależności od tego, co chcesz osiągnąć:

Dekompiluj kod bajtowy Dalvik (dex) do czytelnego źródła Java. Możesz to zrobić z dex2jar i jd-gui , jak wspomina Fred. Wynikowe źródło jest przydatne do czytania i rozumienia funkcjonalności aplikacji, ale prawdopodobnie nie wygeneruje kodu w 100% użytecznego. Innymi słowy, możesz odczytać źródło, ale tak naprawdę nie możesz go zmodyfikować ani przepakować. Zauważ, że jeśli źródło zostało zaciemnione za pomocą proguard, wynikowy kod źródłowy będzie znacznie trudniejszy do rozplątania.

Inną ważną alternatywą jest rozmontowanie kodu bajtowego na smali , asembler zaprojektowany specjalnie do tego celu. Przekonałem . Po zainstalowaniu apktoola możesz po prostu skierować go na plik apk, a otrzymasz plik smali dla każdej klasy zawartej w aplikacji. Możesz czytać i modyfikować smali, a nawet całkowicie zamieniać klasy, generując smali z nowego źródła Java (w tym celu możesz skompilować swoje źródło .java do plików .class za pomocą javac, a następnie przekonwertować pliki .class na pliki .dex za pomocą Androida kompilator dx, a następnie użyj baksmali (dezasembler smali) do konwersji .dex na pliki .smali, jak opisano w tym pytaniu się, że najłatwiej to zrobić za pomocą apktool . Może tu być skrót). Gdy skończysz, możesz łatwo spakować aplikację ponownie za pomocą apktool. Pamiętaj, że apktool nie podpisuje wynikowego pliku APK, więc musisz się tym zająć, tak jak każdą inną aplikacją na Androida .

Jeśli wybierzesz się na smali, możesz wypróbować APK Studio , IDE, które automatyzuje niektóre z powyższych kroków, aby pomóc Ci w dekompilacji i ponownej kompilacji aplikacji i instalacji jej na urządzeniu.

Krótko mówiąc, masz do wyboru albo dekompilację na Javę, która jest bardziej czytelna, ale prawdopodobnie nieodwracalna, lub dezasemblację do smali, która jest trudniejsza do odczytania, ale o wiele bardziej elastyczna, aby wprowadzać zmiany i ponownie pakować zmodyfikowaną aplikację. Które podejście wybierzesz zależy od tego, co chcesz osiągnąć.

Na koniec warto również wspomnieć o odwadze . Jest to narzędzie do retargetingu służące do konwersji plików .dex i .apk do plików .class java, dzięki czemu można je analizować przy użyciu typowych narzędzi analizy statycznej Java.

Zach Lipton
źródło
61

Naprawdę polecam pójście tutaj: https://github.com/JesusFreke/smali

Zapewnia BAKSMALI, które jest najbardziej doskonałym narzędziem do inżynierii wstecznej dla plików DEX. Wykonał ją JesusFreke, facet, który stworzył słynne ROM-y dla Androida.

zaloguj się
źródło
3
smali to język podobny do asemblera oparty na dalvik IL, nie można go bezpośrednio przetłumaczyć na Javę.
reflog
@endryha Nie ma na to narzędzi. Zobacz to pytanie, aby uzyskać więcej informacji.
Alba Mendez,
1
Kod, kod, kod ... Dlaczego tylko kod? Jeśli użyjesz APKToola, odzyskasz wszystko ! I to jest tak proste jak ./apktool d myprogram.apk. Zobacz moją odpowiedź .
Alba Mendez,
30

Pełniejszy wersja fred „s odpowiedź :

Sposób ręczny

Najpierw potrzebujesz narzędzia do wyodrębnienia wszystkich (skompilowanych) klas w DEX do pliku JAR.
Jest taki o nazwie dex2jar , wykonany przez chińskiego studenta.

Następnie możesz użyć jd-gui do dekompilacji klas w pliku JAR do kodu źródłowego.
Wynikowe źródło powinno być dość czytelne, ponieważ dex2jar stosuje pewne optymalizacje.

Sposób automatyczny

Możesz użyć APKTool . Będzie on automatycznie wyodrębnić wszystkie zajęcia ( .dex), zasobów ( .asrc), a następnie będzie konwertować XML binarnych do XML czytelnej dla człowieka , a także rozmontowywać klas dla Ciebie.
Demontaż zawsze będzie bardziej niezawodny niż dekompilacja, szczególnie w przypadku
plików JAR zaciemnionych za pomocą Pro Guard!

Po prostu powiedz APKToolowi, aby zdekodował plik APK do katalogu, a następnie zmodyfikował, co chcesz,
i ostatecznie zakodował z powrotem do pliku APK. To wszystko.

Ważne: APKTool dezasembluje . Nie ulega dekompilacji .
Wygenerowany kod nie będzie źródłem Java.
Ale powinieneś być w stanie go przeczytać, a nawet edytować, jeśli znasz jasmin .
Jeśli potrzebujesz źródła Java, przejdź do instrukcji ręcznej .

Alba Mendez
źródło
25

Czasami dostajesz uszkodzony kod, gdy używasz dex2jar/ apktool, szczególnie w pętlach. Aby tego uniknąć, użyj jadx , który dekompiluje kod bajtowy dalvik do kodu źródłowego Java, bez wcześniejszego tworzenia pliku .jar/ (tak .classjak dex2jarapktool używa dex2jar). Jest także oprogramowaniem typu open source i aktywnie się rozwija. Ma nawet GUI dla fanatyków GUI. Spróbuj!

polim
źródło
Przypuszczam, że jadx nie ma opcji kompilacji, ale kod jest czytelny
Buddy,
@EnesBattal masz na myśli javac "$(find . -name '*.java')"?
polim
co powiesz na utworzenie apk? umieszczanie zajęć w apk, zipalign, podpisywanie itp.
Buddy,
@EnesBattal Cóż, możesz pomóc to wdrożyć - w przeciwnym razie możesz do tego użyć apktool .. lub zipalign / sign with android tools
polym
1
@lejonl Kara śmierci dla ciebie, ty potworze!
polim
17

używałem

  1. dex2jar + jd-gui
  2. javadecompilers.com
  3. wytrysnąć
  4. Apktool

Ale żaden nie przebije własnych narzędzi Google

1) Android Studio 2.x: kompilacja> analiza apk wprowadź opis zdjęcia tutaj

2) Android Studio 3.0: profil lub pakiet debugowania wprowadź opis zdjęcia tutaj wprowadź opis zdjęcia tutaj

ishandutta2007
źródło
1
Plus jeden dla Enjarify. Z mojego osobistego doświadczenia wynika, że ​​daje lepsze wyniki w porównaniu do d2j
qre0ct
15

Ponieważ nikt o tym nie wspominał, istnieje jeszcze jedno narzędzie: strona główna DED

Zainstaluj instrukcje i niektóre objaśnienia: Instalacja .

Został wykorzystany w dość interesującym badaniu bezpieczeństwa najlepszych aplikacji rynkowych (nie tak naprawdę powiązanych, tylko jeśli jesteś ciekawy): Ankieta na temat bezpieczeństwa aplikacji na Androida

phaethon
źródło
Wygląda obiecująco. Czy dekompiluje kod Java bezpośrednio z pliku APK? Co z zaciemnionym kodem Java?
sandalone
14

Ponieważ Dheeraj Bhaskarodpowiedź jest stosunkowo stara jak wiele lat temu.

Oto moja najnowsza odpowiedź (rok 2019):

Główna logika

od dexdo java sourcecode, obecnie ma dwa rodzaje rozwiązań:

  • One Step: bezpośrednio przekonwertuj dexnajava sourcecode
  • Two Step: pierwsza konwersja dexna jar, druga konwersja jarnajava sourcecode

Jednoetapowe rozwiązanie: dexbezpośrednio dojava sourcecode

Przybory

Proces

  1. pobierz jadx-0.9.0.zip , rozpakuj go, w binfolderze można zobaczyć wiersz poleceń jadxlub wersję GUI jadx-gui, kliknij dwukrotnie, aby uruchomić wersję GUI:jadx-gui

  1. otwórz dexplik

następnie może pokazać kod źródłowy Java:

  1. File -> save as gradle project

następnie dostałem kod źródłowy Java:


Rozwiązanie dwustopniowe

Krok 1: dexdojar

Przybory

Proces

pobierz dex2jar zip , rozpakuj d2j-dex2jar.sh, a następnie:

  • apkdo jar:sh d2j-dex2jar.sh -f ~/path/to/apk_to_decompile.apk
  • dexdo jar:sh d2j-dex2jar.sh -f ~/path/to/dex_to_decompile.dex

przykład:

  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

Krok 2: jardojava sourcecode

Przybory

Proces

tutaj demo Procyonprzekonwertować jar na kod źródłowy Java:

pobierz procyon-decompiler-0.5.34.jar

następnie używając składni:

java -jar /path/to/procyon-decompiler-0.5.34.jar -jar your_to_decompile.jar -o outputFolderName

przykład:

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

za pomocą edytora VSCode do otwarcia eksportowanego kodu źródłowego wyglądają następująco:

Wniosek

Poprawność konwersji: Jadx> Procyon> CRF>JD-GUI

Zalecane użycie: (rozwiązania jednoetapowe) Jadx


Bardziej szczegółowe wyjaśnienia znajdują się w moim chińskim ebooku online : 安卓 应用 的 安全 和 破解

Crifan
źródło
dziwne, ale jeśli spróbuję wykonać 1 krok (dekompilacja dekompilacji jar w systemie Windows) za pomocą tego polecenia dex2jar-2.0>d2j-dex2jar.bat -f D:\android\some_dex_file.dexwłaśnie dostałem wyjątek:java.io.IOException: the src file not a .dex or zip file
Сергей
@ Сергей możesz spróbować: d2j-dex2jar.bat "D:\android\some_dex_file.dex"jest w porządku czy nie?
crifan
tak, próbowałem dokładnie, >d2j-dex2jar.bat file.dexale nie jest ok. może to dlatego, że mój .dexplik został skopiowany dalvik-cache?
Сергей
1
@ Сергей tak, najbardziej prawdopodobnym powodem jest twoja wypowiedź dex is copied from dalvik-cache, powinna byćdex is decompiled from apk
crifan
@crifan, dziękuję za tę odpowiedź. JADX robi wrażenie. wrócę do pracy. Emmanuel @ JD-Gui
Emmanuel Dupuy
13

Po pobraniu pliku APK musisz wykonać następujące kroki, aby uzyskać edytowalny kod / dokument Java.

  1. Konwertuj plik apk do formatu zip (podczas rozpoczynania pobierania nie idź z opcją „zapisz”, po prostu przejdź do „zapisz jako” i wspomnij o swoim rozszerzeniu jako .zip), robiąc w ten sposób możesz uniknąć APKTOOL ...
  2. Wypakuj plik zip, tam znajdziesz somefilename.dex. więc teraz musimy przekonwertować dex -> .class
  3. Aby to zrobić, potrzebujesz „dex2jar” (możesz go pobrać ze strony http://code.google.com/p/dex2jar/ , po rozpakowaniu w wierszu polecenia musisz wpisać: [D: \ dex2jar-0.09> dex2jar somefilename.dex] (Pamiętaj, że twoja somefilename.dex musi znajdować się w tym samym folderze, w którym przechowujesz dex2jar.)
  4. Pobierz jad z http://www.viralpatel.net/blogs/download/jad/jad.zip i rozpakuj go. Po rozpakowaniu możesz zobaczyć dwa pliki, takie jak „jad.exe” i „Readme.txt” (czasami „jad.txt” może tam zamiast „jad.exe”, więc po prostu zmień nazwę rozszerzenia na as.exe, aby uruchomić)
  5. Na koniec, w wierszu poleceń musisz wspomnieć, jak [D: \ jad> jad -sjava twoja nazwa_pliku.class], parsuje plik klasy do edytowalnego dokumentu java.
Kamal
źródło
8

Za pomocą Dedexer można rozłożyć .dexplik na dalvik bytecode ( .ddx).

O ile wiem, dekompilacja w kierunku Javy nie jest możliwa.
O kodzie bajtowym dalvik możesz przeczytać tutaj .

hcpl
źródło
1
zaakceptowane, ponieważ to ty mówisz, że to (obecnie) niemożliwe, co wydaje się prawdą.
Czy
@ Czy wszystko będzie możliwe. Tylko zależy od tego, jak to widzisz. Dekompilacja jest możliwa, ale może nie tak, jak myślisz.
Alba Mendez,
8

Android Inżynieria odwrotna jest możliwa . Wykonaj następujące kroki, aby pobrać plik .java z pliku apk.

Krok 1 . Korzystanie z dex2jar

  • Wygeneruj plik .jar z pliku .apk
  • Komenda : dex2jar sampleApp.apk

Krok 2 . Dekompilacja .jar przy użyciu JD-GUI

  • dekompiluje pliki .class, tzn. otrzymamy zaciemniony plik .java z powrotem z apk.
gtiwari333
źródło
Ale jeśli ponownie skompiluję cały zdekompilowany kod źródłowy, nie uruchomi się, kompilator pokazuje wiele błędów.
czy istnieje jakieś dostępne rozwiązanie dekompilacji kodu źródłowego Java Java będzie działać w środowisku eclipse
2
Reverse Engineering ma nie musi oznaczać Dekodowanie . W rzeczywistości pliki JAR zaciemnione ProGuard nie dekompilują się poprawnie.
Alba Mendez,
Jeśli masz do czynienia z kodem zaciemnionym , lepiej go po prostu zdemontować . Nie otrzymasz źródła Java, ale zawsze będziesz mógł zobaczyć / zmodyfikować kod. Zobacz moją odpowiedź .
Alba Mendez,
Poleciłbym zarówno dekompilację, jak i deasemblację. Wynikowy dekompilowany kod jest łatwiejszy do zrozumienia, ale wszystkie modyfikacje należy wykonać w wersji zdemontowanej. Szczególnie prawdziwe, jeśli zastosowano proguard. Uważam, że dex2jar w połączeniu z jd-gui jest najlepszy do dekompilacji.
Mikko Rantalainen
6

Najnowszy Debian ma pakiet 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

Zainstaluj odpowiednie pakiety:

sudo apt-get install androguard python-networkx

Dekompiluj plik DEX:

$ androdd -i classes.dex -o ./dir-for-output

Wyciąg classes.dexz Apk + dekompilacji:

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

Plik apk to nic innego jak archiwum Java (JAR), możesz wyodrębnić pliki z archiwum poprzez:

$ unzip app.apk -d ./dir-for-output
gavenkoa
źródło
5

Wiele się zmieniło, odkąd opublikowano większość tych odpowiedzi. Obecnie dostępnych jest wiele łatwych narzędzi z GUI, takich jak:

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

Najlepszym miejscem do ich znalezienia jest forum programistów XDA.

MPaulo
źródło
2

Najłatwiejszą metodą dekompilacji aplikacji na Androida jest pobranie aplikacji o nazwie ShowJava z playstore. Po prostu wybierz aplikację, którą należy zdekompilować z listy aplikacji. Istnieją trzy różne dekompilatory, których można użyć do dekompilacji aplikacji, a mianowicie:

CFR 0.110, JaDX 0.6.1 lub FernFlower (dekompilator analityczny).

Rishabh Maurya
źródło
1

Jeśli nie chcesz pobierać dex2jar, po prostu użyj apk_grabberskryptu python, aby zdekompilować dowolny plik APK do plików jar. Następnie czytasz je za pomocą jd-gui.

Jeff Brateman
źródło