mendekompilasi DEX ke kode sumber Java

706

Bagaimana seseorang dapat mendekompilasi file Android DEX (VM bytecode) ke dalam kode sumber Java yang sesuai?

Akan
sumber
Silahkan lihat di sini . Anda akan mendapatkan kemungkinan prospek dari sana untuk melanjutkan.
Kevin Boyd
Info terbaru tersedia di blog hub coders: coders-hub.com/2013/04/how-to-convert-apk-file-into-source.html
Md Mohsin
Jika Anda punya uang, beli jeb , gunakan jadx , lihat di sini mengapa
polym
Ada cross plateform (java) dan alat open source baru, yang memungkinkan Anda melakukan itu, cukup checkout bytecodeviewer: stackoverflow.com/a/36557898/795245
Gomino

Jawaban:

881

Mudah

Dapatkan alat ini:

1) dex2jar untuk menerjemahkan file dex ke file jar

2) jd-gui untuk melihat file java di toples

Kode sumber cukup mudah dibaca karena dex2jar membuat beberapa optimasi.

Prosedur:

Dan inilah prosedur bagaimana mendekompilasi:

Langkah 1:

Konversikan classes.dex di test_apk-debug.apk ke 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

Catatan 1: Di mesin Windows semua .shskrip diganti oleh .batskrip

Catatan 2: Di linux / mac jangan lupa tentang shatau bash. Perintah penuh harus:

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

Catatan 3: Juga, ingatlah untuk menambahkan izin eksekusi ke dex2jar-X.Xdirektori misalnyasudo chmod -R +x dex2jar-2.0

dokumentasi dex2jar

Langkah 2:

Buka toples di JD-GUI

Sumber yang didekompilasi

Dheeraj Bhaskar
sumber
57
+1. Saya mencoba Baksmali dan Dex2jar. Dex2Jar + JD-Gui menang karena memberi Anda kode sumber yang mudah dibaca untuk sebagian besar file .dex.
Jonathan Dumaine
hai, maukah kamu membagikan jalanmu? Saya akan sangat berterima kasih kepada Anda.
Arslan Anwar
2
Kalimat di atas membunyikan lonceng - sepertinya merupakan semi-kutipan dari sini: geeknizer.com/decompile-reverse-engineer-android-apk (atau sebaliknya?). Artikel yang ditautkan secara singkat menjelaskan alat yang disebutkan di atas serta Smali dan APKTool.
AgentKnopf
2
@ JonathanDumaine itu tergantung. Jika JAR dikaburkan dan Anda ingin melakukan sedikit modifikasi, Backsmali adalah satu-satunya cara untuk pergi. Bonus! Dengan APKTool Anda juga mendapatkan semua XML, gambar, dan sumber daya lainnya kembali. Lihat jawaban saya .
Alba Mendez
3
@ JonathanDumaine Saya setuju dengan jmendeth, apktool juga merupakan cara untuk pergi jika Anda ingin mendekompilasi apk Anda, memodifikasinya lalu mengkompilasi ulang. Saat menggunakan dex2jar dan jd-gui sumbernya benar-benar dapat dibaca tetapi Anda tidak dapat mengkompilasi ulang beberapa kesalahan!
darkheir
138

Untuk memperjelas, ada dua jalur utama yang mungkin Anda ambil di sini tergantung pada apa yang ingin Anda capai:

Dekompilasi bytecode Dalvik (dex) menjadi sumber Java yang dapat dibaca. Anda dapat melakukan ini dengan mudah dengan dex2jar dan jd-gui , seperti yang disebutkan fred. Sumber yang dihasilkan berguna untuk membaca dan memahami fungsionalitas aplikasi, tetapi kemungkinan tidak akan menghasilkan kode yang dapat digunakan 100%. Dengan kata lain, Anda dapat membaca sumbernya, tetapi Anda tidak dapat benar-benar memodifikasi dan mengemasnya kembali. Perhatikan bahwa jika sumber telah dikaburkan dengan proguard, kode sumber yang dihasilkan akan jauh lebih sulit untuk dilepaskan.

Alternatif utama lainnya adalah membongkar bytecode ke smali , bahasa rakitan yang dirancang untuk tujuan ini. Saya telah menemukan bahwa cara termudah untuk melakukan ini adalah dengan apktool . Setelah Anda menginstal apktool, Anda bisa mengarahkannya ke file apk, dan Anda akan mendapatkan kembali file smali untuk setiap kelas yang terkandung dalam aplikasi. Anda dapat membaca dan memodifikasi smali atau bahkan mengganti kelas sepenuhnya dengan menghasilkan smali dari sumber Java baru (untuk melakukan ini, Anda bisa mengkompilasi sumber .java Anda ke file .class dengan javac, lalu mengonversi file .class Anda ke file .dex dengan Android dx compiler, dan kemudian menggunakan baksmali (smali disassembler) untuk mengkonversi file .dex ke file .smali, seperti yang dijelaskan dalam pertanyaan ini. Mungkin ada jalan pintas di sini). Setelah selesai, Anda dapat dengan mudah mengemas apk cadangan dengan apktool lagi. Perhatikan bahwa apktool tidak menandatangani apk yang dihasilkan, jadi Anda harus menjaganya seperti aplikasi Android lainnya .

Jika Anda memilih rute smali, Anda mungkin ingin mencoba APK Studio , sebuah IDE yang mengotomatiskan beberapa langkah di atas untuk membantu Anda mendekompilasi dan mengkompilasi ulang apk dan menginstalnya pada perangkat.

Singkatnya, pilihan Anda cukup banyak untuk mendekompilasi ke Jawa, yang lebih mudah dibaca tetapi kemungkinan tidak dapat dibalikkan, atau untuk dibongkar menjadi smali, yang lebih sulit dibaca tetapi jauh lebih fleksibel untuk membuat perubahan dan mengemas kembali aplikasi yang dimodifikasi. Pendekatan mana yang Anda pilih akan tergantung pada apa yang ingin Anda capai.

Terakhir, saran dari berani juga perlu diperhatikan. Ini adalah alat penargetan ulang untuk mengonversi file .dex dan .apk ke file java .class, sehingga file tersebut dapat dianalisis menggunakan alat analisis statis java biasa.

Zach Lipton
sumber
61

Saya sebenarnya akan merekomendasikan pergi di sini: https://github.com/JesusFreke/smali

Ini menyediakan BAKSMALI, yang merupakan alat rekayasa balik paling baik untuk file DEX. Itu dibuat oleh JesusFreke, pria yang menciptakan ROM terkenal untuk Android.

reflog
sumber
3
smali adalah bahasa seperti perakitan berdasarkan dalvik IL, tidak dapat langsung diterjemahkan ke Jawa.
reflog
@endryha Tidak ada alat yang bisa melakukan itu. Lihat pertanyaan ini untuk info lebih lanjut.
Alba Mendez
1
Kode, kode, kode, ... Mengapa hanya kode? Jika Anda menggunakan APKTool, Anda mendapatkan semuanya kembali! Dan sesederhana itu ./apktool d myprogram.apk. Lihat jawaban saya .
Alba Mendez
30

Sebuah versi lebih lengkap dari fred 's jawabannya :

Cara manual

Pertama, Anda membutuhkan alat untuk mengekstrak semua kelas (dikompilasi) pada DEX ke JAR.
Ada satu yang disebut dex2jar , yang dibuat oleh siswa Cina.

Kemudian, Anda bisa menggunakan jd-gui untuk mendekompilasi kelas pada JAR ke kode sumber.
Sumber yang dihasilkan harus cukup mudah dibaca, karena dex2jar menerapkan beberapa optimasi.

Cara otomatis

Anda dapat menggunakan APKTool . Ini akan secara otomatis mengekstrak semua kelas ( .dex), sumber daya ( .asrc), lalu itu akan mengkonversi XML biner ke XML yang dapat dibaca manusia , dan itu juga akan membongkar kelas untuk Anda.
Pembongkaran akan selalu lebih kuat daripada dekompilasi, terutama dengan
JAR yang dikaburkan dengan Pro Guard!

Katakan saja APKTool untuk mendekode APK ke dalam direktori, lalu ubah apa yang Anda inginkan,
dan akhirnya kodekan kembali ke APK. Itu saja.

: Penting APKTool dissassembles . Itu tidak terurai .
Kode yang dihasilkan tidak akan menjadi sumber Java.
Tetapi Anda harus bisa membacanya, dan bahkan mengeditnya jika Anda terbiasa dengan jasmin .
Jika Anda ingin sumber Java, silakan kunjungi cara Manual .

Alba Mendez
sumber
25

Kadang-kadang Anda mendapatkan kode yang rusak, saat menggunakan dex2jar/ apktool, terutama di loop. Untuk menghindari ini, gunakan jadx , yang mendekompilasi bytecode dalvik ke dalam kode sumber java, tanpa membuat .jar/ .classfile terlebih dahulu seperti dex2jarhalnya (apktool menggunakan dex2jar menurut saya). Ini juga open-source dan dalam pengembangan aktif. Bahkan memiliki GUI, untuk GUI-fanatik. Cobalah!

polym
sumber
Saya kira jadx tidak memiliki opsi kompilasi tetapi kodenya dapat dibaca
Buddy
@EnesBattal maksudmu seperti javac "$(find . -name '*.java')"?
polym
bagaimana dengan membentuk apk? menempatkan kelas di apk, zipalign, menandatangani dll.
Buddy
@EnesBattal Nah Anda dapat membantu mengimplementasikannya - jika tidak, Anda bisa menggunakan apktool untuk itu .. atau zipalign / masuk dengan alat android
polym
1
@lejonl Hukuman mati untukmu, dasar monster!
polym
17

Saya sudah menggunakan

  1. dex2jar + jd-gui
  2. javadecompilers.com
  3. memperjelas
  4. Apktool

Tapi tidak ada yang mengalahkan alat Google sendiri

1) Android Studio 2.x: build> analysis apk masukkan deskripsi gambar di sini

2) Android Studio 3.0: Profil atau Debug APK masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini

ishandutta2007
sumber
1
Ditambah satu untuk Enjarify. Dalam pengalaman pribadi saya, telah terbukti memberikan hasil yang lebih baik dibandingkan dengan d2j
qre0ct
15

Karena tidak ada yang menyebutkan ini, ada satu alat lagi: beranda DED

Instal cara-dan beberapa penjelasan: Instalasi .

Itu digunakan dalam studi yang cukup menarik tentang keamanan aplikasi pasar atas (tidak benar-benar terkait, hanya jika Anda penasaran): Sebuah Survei Keamanan Aplikasi Android

phaethon
sumber
Itu terlihat menjanjikan. Apakah itu mendekompilasi kode Java langsung dari APK? Bagaimana dengan kode Java yang dikaburkan?
sandalone
14

Karena Dheeraj Bhaskarjawaban itu relatif lama seperti bertahun-tahun yang lalu.

Inilah jawaban terakhir saya (2019 tahun):

Logika Utama

dari dexke java sourcecode, saat ini memiliki dua jenis solusi:

  • One Step: langsung dikonversi dexkejava sourcecode
  • Two Step: konversi pertama dexke jar, konversi kedua jarkejava sourcecode

Satu langkah solusi: dexlangsung kejava sourcecode

Alat

Proses

  1. unduh jadx-0.9.0.zip , buka zip, di binfolder dapat melihat baris perintah jadxatau versi GUI jadx-gui, klik dua kali untuk menjalankan versi GUI:jadx-gui

  1. buka dexfile

kemudian dapat menampilkan kode sumber java:

  1. File -> save as gradle project

lalu dapatkan kode sumber java:


Solusi dua langkah

Langkah1: dexkejar

Alat

Proses

unduh dex2jar zip , unzip dapatkan d2j-dex2jar.sh, lalu:

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

contoh:

  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

Step2: jartojava sourcecode

Alat

Proses

di sini demo Procyonkonversi jar ke kode sumber java:

unduh procyon-decompiler-0.5.34.jar

lalu gunakan sintaks:

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

contoh:

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

menggunakan editor VSCode untuk membuka kode sumber yang diekspor, lihat seperti ini:

Kesimpulan

Konversi ketepatan: Jadx> Procyon> CRF>JD-GUI

Rekomendasikan penggunaan: (Solusi satu langkah) Jadx


untuk penjelasan lebih rinci, silakan lihat ebook bahasa Mandarin online saya : 安卓 应用 的 安全 和 破解

crifan
sumber
aneh, tetapi jika saya mencoba menjalankan 1 langkah (dex to jar decompile pada Windows) melalui perintah ini dex2jar-2.0>d2j-dex2jar.bat -f D:\android\some_dex_file.dexbaru saja mendapatkan pengecualian:java.io.IOException: the src file not a .dex or zip file
Сергей
@ Сергей dapatkah Anda mencoba: d2j-dex2jar.bat "D:\android\some_dex_file.dex"ok atau tidak?
crifan
ya, saya mencoba persis >d2j-dex2jar.bat file.dextetapi tidak ok. mungkin karena .dexfile saya disalin dalvik-cache?
Сергей
1
@ Сергей ya, alasan yang paling mungkin adalah kata Anda dex is copied from dalvik-cache, seharusnyadex is decompiled from apk
crifan
@ Crifan, terima kasih atas jawaban ini. JADX sangat mengesankan. saya akan kembali bekerja. Emmanuel @ JD-Gui
Emmanuel Dupuy
13

Setelah Anda mengunduh file APK Anda, Anda perlu melakukan langkah-langkah berikut untuk mendapatkan kode / dokumen java yang dapat diedit.

  1. Konversikan file apk Anda menjadi zip (saat memulai unduhan Anda jangan menggunakan opsi "save", cukup dengan "save as" dan sebutkan ekstensi Anda sebagai .zip) dengan melakukan hal ini Anda dapat menghindari APKTOOL ...
  2. Ekstrak file zip, di sana Anda dapat menemukan somefilename.dex. jadi sekarang kita perlu mengonversi dex -> .class
  3. Untuk melakukan itu, Anda memerlukan "dex2jar" (Anda dapat mengunduhnya dari http://code.google.com/p/dex2jar/ , setelah diekstraksi, pada command prompt Anda harus menyebutkan seperti, [D: \ dex2jar-0,09> dex2jar somefilename.dex] (Perlu diingat bahwa somefilename.dex Anda harus berada di dalam folder yang sama di mana Anda menyimpan dex2jar Anda.)
  4. Unduh jad dari http://www.viralpatel.net/blogs/download/jad/jad.zip dan ekstrak. Setelah diekstraksi, Anda dapat melihat dua file seperti "jad.exe" dan "Readme.txt" (kadang-kadang "jad.txt" mungkin ada di sana daripada "jad.exe", jadi cukup ganti ekstensinya as.exe untuk dijalankan)
  5. Akhirnya, pada command prompt Anda harus menyebutkan seperti [D: \ jad> jad -sjava yourfilename.class] itu akan mem-parsing file kelas Anda ke dalam dokumen java yang dapat diedit.
Kamal
sumber
8

Dengan Dedexer , Anda dapat membongkar .dexfile tersebut menjadi bytecode dalvik (.ddx ).

Dekompilasi ke Jawa tidak mungkin sejauh yang saya tahu.
Anda dapat membaca tentang byalecode dalvik di sini .

hcpl
sumber
1
diterima karena kaulah yang mengatakan bahwa itu (saat ini) tidak mungkin, yang tampaknya benar.
Akan
@Apakah semuanya mungkin. Tergantung bagaimana Anda melihatnya. Penguraian adalah mungkin, tetapi mungkin bukan cara yang Anda pikirkan.
Alba Mendez
8

Android Reverse Engineering dimungkinkan . Ikuti langkah-langkah ini untuk mendapatkan file .java dari file apk.

Langkah 1 . Menggunakan dex2jar

  • Hasilkan file .jar dari file .apk
  • perintah: dex2jar sampleApp.apk

Langkah 2 . Mengurai .jar menggunakan JD-GUI

  • itu mendekompilasi file .class yaitu, kita akan dikaburkan .java kembali dari apk.
gtiwari333
sumber
Tetapi jika saya mengkompilasi lagi semua kode sumber yang di-decompile, itu tidak akan berjalan, kompiler menunjukkan banyak kesalahan.
apakah ada solusi yang tersedia untuk mendekompilasi kode sumber java android akan berjalan di eclipse
2
Reverse Engineering tidak tidak selalu berarti decompiling . Bahkan, JAR yang dikaburkan oleh ProGuard tidak akan terurai dengan benar.
Alba Mendez
Jika Anda berurusan dengan kode yang dikaburkan, lebih baik membongkar saja. Anda tidak akan mendapatkan sumber Java, tetapi Anda selalu dapat melihat / memodifikasi kode. Lihat jawaban saya .
Alba Mendez
Saya akan merekomendasikan melakukan dekompilasi dan pembongkaran. Kode dekompilasi yang dihasilkan lebih mudah dipahami tetapi semua modifikasi harus dilakukan dengan versi pembongkaran. Terutama benar jika proguard telah digunakan. Saya menemukan bahwa dex2jar dikombinasikan dengan jd-gui adalah yang terbaik untuk mendekompilasi.
Mikko Rantalainen
6

Paket Debian have Python terbaru 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

Instal paket yang sesuai:

sudo apt-get install androguard python-networkx

Dekompilasi file DEX:

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

Ekstrak classes.dexdari Apk + Dekompilasi:

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

File Apk tidak lebih dari arsip Java (JAR), Anda dapat mengekstrak file dari arsip melalui:

$ unzip app.apk -d ./dir-for-output
gavenkoa
sumber
5

Banyak yang telah berubah sejak sebagian besar jawaban ini diposting. Sekarang-a-hari ada banyak alat mudah dengan GUI, seperti ini:

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

Tempat terbaik untuk menemukannya adalah di forum Pengembang XDA.

MPaulo
sumber
2

Metode termudah untuk mendekompilasi aplikasi android adalah dengan mengunduh aplikasi bernama ShowJava dari playstore. Cukup pilih aplikasi yang perlu didekompilasi dari daftar aplikasi. Ada tiga dekompiler berbeda yang dapat Anda gunakan untuk mendekompilasi aplikasi yaitu -

CFR 0,110, JaDX 0.6.1 atau FernFlower (dekompiler analitik).

Rishabh Maurya
sumber
1

Jika Anda tidak ingin mengunduh dex2jar, gunakan saja apk_grabberskrip python untuk mendekompilasi apk apa pun ke dalam file jar. Kemudian Anda membacanya dengan jd-gui.

Jeff Brateman
sumber