Jak można dekompilować pliki DEX systemu Android (kod bajtowy VM) do odpowiedniego kodu źródłowego Java?
Jak można dekompilować pliki DEX systemu Android (kod bajtowy VM) do odpowiedniego kodu źródłowego Java?
Odpowiedzi:
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.
A oto procedura dekompilacji:
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
.sh
skrypty są zastępowane przez.bat
skryptyUwaga 2: W systemie Linux / Mac nie zapomnij o
sh
lubbash
. 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.X
katalogu npsudo chmod -R +x dex2jar-2.0
Otwórz słoik w JD-GUI
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.
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.
./apktool d myprogram.apk
. Zobacz moją odpowiedź .
Pełniejszy wersja fred „s odpowiedź :
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.
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 .
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
jak dex2jar
apktool używa dex2jar). Jest także oprogramowaniem typu open source i aktywnie się rozwija. Ma nawet GUI dla fanatyków GUI. Spróbuj!
javac "$(find . -name '*.java')"
?
używałem
Ale żaden nie przebije własnych narzędzi Google
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
Ponieważ Dheeraj Bhaskar
odpowiedź jest stosunkowo stara jak wiele lat temu.
Oto moja najnowsza odpowiedź (rok 2019):
od dex
do java sourcecode
, obecnie ma dwa rodzaje rozwiązań:
One Step
: bezpośrednio przekonwertuj dex
najava sourcecode
Two Step
: pierwsza konwersja dex
na jar
, druga konwersja jar
najava sourcecode
dex
bezpośrednio dojava sourcecode
bin
folderze można zobaczyć wiersz poleceń jadx
lub wersję GUI jadx-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:
dex
dojar
pobierz dex2jar zip , rozpakuj d2j-dex2jar.sh
, a następnie:
apk
do jar
:sh d2j-dex2jar.sh -f ~/path/to/apk_to_decompile.apk
dex
do 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
jar
dojava sourcecode
many
kod dekompiluje błądminor
kod dekompiluje błądno
błąd dekompilacji kodu
Procyon
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:
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 : 安卓 应用 的 安全 和 破解
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ł skopiowany dalvik-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.
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 .
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
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.dex
z 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
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.
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/
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
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).
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.