Jak można dekompilować pliki DEX systemu Android (kod bajtowy VM) do odpowiedniego kodu źródłowego Java?
706
Jak można dekompilować pliki DEX systemu Android (kod bajtowy VM) do odpowiedniego kodu źródłowego Java?
Odpowiedzi:
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
dokumentacja dex2jar
Krok 2:
Otwórz słoik w JD-GUI
źródło
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.
źródło
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.
źródło
./apktool d myprogram.apk
. Zobacz moją odpowiedź .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 .
źródło
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.class
jakdex2jar
apktool używa dex2jar). Jest także oprogramowaniem typu open source i aktywnie się rozwija. Ma nawet GUI dla fanatyków GUI. Spróbuj!źródło
javac "$(find . -name '*.java')"
?używałem
Ale żaden nie przebije własnych narzędzi Google
1) Android Studio 2.x: kompilacja> analiza apk
2) Android Studio 3.0: profil lub pakiet debugowania
źródło
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
źródło
Ponieważ
Dheeraj Bhaskar
odpowiedź jest stosunkowo stara jak wiele lat temu.Oto moja najnowsza odpowiedź (rok 2019):
Główna logika
od
dex
dojava sourcecode
, obecnie ma dwa rodzaje rozwiązań:One Step
: bezpośrednio przekonwertujdex
najava sourcecode
Two Step
: pierwsza konwersjadex
najar
, druga konwersjajar
najava sourcecode
Jednoetapowe rozwiązanie:
dex
bezpośrednio dojava sourcecode
Przybory
Proces
bin
folderze można zobaczyć wiersz poleceńjadx
lub wersję GUIjadx-gui
, kliknij dwukrotnie, aby uruchomić wersję GUI:jadx-gui
dex
pliknastępnie może pokazać kod źródłowy Java:
File
->save as gradle project
następnie dostałem kod źródłowy Java:
Rozwiązanie dwustopniowe
Krok 1:
dex
dojar
Przybory
Proces
pobierz dex2jar zip , rozpakuj
d2j-dex2jar.sh
, a następnie:apk
dojar
:sh d2j-dex2jar.sh -f ~/path/to/apk_to_decompile.apk
dex
dojar
:sh d2j-dex2jar.sh -f ~/path/to/dex_to_decompile.dex
przykład:
Krok 2:
jar
dojava sourcecode
Przybory
many
kod dekompiluje błądminor
kod dekompiluje błądno
błąd dekompilacji koduProcyon
Proces
tutaj demo
Procyon
przekonwertować 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 : 安卓 应用 的 安全 和 破解
źródło
dex2jar-2.0>d2j-dex2jar.bat -f D:\android\some_dex_file.dex
właśnie dostałem wyjątek:java.io.IOException: the src file not a .dex or zip file
d2j-dex2jar.bat "D:\android\some_dex_file.dex"
jest w porządku czy nie?>d2j-dex2jar.bat file.dex
ale nie jest ok. może to dlatego, że mój.dex
plik został skopiowanydalvik-cache
?dex is copied from dalvik-cache
, powinna byćdex is decompiled from apk
Po pobraniu pliku APK musisz wykonać następujące kroki, aby uzyskać edytowalny kod / dokument Java.
źródło
Za pomocą Dedexer można rozłożyć
.dex
plik na dalvik bytecode (.ddx
).O ile wiem, dekompilacja w kierunku Javy nie jest możliwa.
O kodzie bajtowym dalvik możesz przeczytać tutaj .
źródło
Android Inżynieria odwrotna jest możliwa . Wykonaj następujące kroki, aby pobrać plik .java z pliku apk.
Krok 1 . Korzystanie z dex2jar
dex2jar sampleApp.apk
Krok 2 . Dekompilacja .jar przy użyciu JD-GUI
źródło
Najnowszy Debian ma pakiet Python
androguard
:Zainstaluj odpowiednie pakiety:
Dekompiluj plik DEX:
Wyciąg
classes.dex
z Apk + dekompilacji:Plik apk to nic innego jak archiwum Java (JAR), możesz wyodrębnić pliki z archiwum poprzez:
źródło
Wiele się zmieniło, odkąd opublikowano większość tych odpowiedzi. Obecnie dostępnych jest wiele łatwych narzędzi z GUI, takich jak:
Najlepszym miejscem do ich znalezienia jest forum programistów XDA.
źródło
Możesz wypróbować JADX ( https://bitbucket.org/mstrobel/procyon/wiki/Java%20Decompiler ), jest to idealne narzędzie do dekompilacji DEX.
I tak, jest również dostępny online na (mojej: 0)) nowej stronie: http://www.javadecompilers.com/apk/
źródło
Można to zrobić w pięciu następujących krokach:
Ten klejnot robi te rzeczy dla Ciebie automatycznie, nawet instalując wymagane narzędzia
źródło
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:
źródło
Jeśli nie chcesz pobierać dex2jar, po prostu użyj
apk_grabber
skryptu python, aby zdekompilować dowolny plik APK do plików jar. Następnie czytasz je za pomocą jd-gui.źródło