DEX'in Java kaynak koduna ayrıştırılması


706

Bir Android DEX (VM bayt kodu) dosyalarını karşılık gelen Java kaynak koduna nasıl koyabiliriz?


Buraya bir bak . Oradan devam etmek için olası olası satışları alacaksınız.
Kevin Boyd

Güncellenmiş bilgileri kodlayıcılar hub blogunda bulabilirsiniz: coders-hub.com/2013/04/how-to-convert-apk-file-into-source.html
Md Mohsin

Paranız varsa, jeb satın alın , aksi takdirde jadx kullanın , buraya neden bakın
Polym

Bunu yapmanızı sağlayan yeni bir çapraz plaka formu (java) ve açık kaynak aracı var, sadece bytecodeviewer'ı kontrol edin: stackoverflow.com/a/36557898/795245
Gomino

Yanıtlar:


882

Bu kolay

Şu araçları edinin:

1) dex2jar , jar dosyalarını jar dosyalarına çevirmek için

2) Kavanozdaki java dosyalarını görüntülemek için jd-gui

Dex2jar bazı optimizasyonlar yaptığı için kaynak kodu oldukça okunabilir.

Prosedür:

Ve işte nasıl koda dönüştürüleceğine dair prosedür:

Aşama 1:

Test_apk-debug.apk içindeki classes.dex öğesini test_apk-debug_dex2jar.jar dosyasına dönüştürün

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

Not 1: Windows makinelerinde tüm .shkomut dosyalarının yerine .batkomut dosyaları

Not 2: Linux / mac üzerinde shveya unutmayın bash. Tam komut şöyle olmalıdır:

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

Not 3: Ayrıca, dex2jar-X.Xdizine yürütme izni eklemeyi unutmayın.sudo chmod -R +x dex2jar-2.0

dex2jar belgeleri

Adım 2:

Kavanozu JD-GUI'de açın

Ayrıştırılmış kaynak


57
+1. Baksmali ve Dex2jar'ı denedim. Dex2Jar + JD-Gui, çoğu .dex dosyası için mükemmel bir şekilde okunabilir kaynak kodu verdiği için kazanır.
Jonathan Dumaine

merhaba, lütfen gittiğiniz yolu paylaşır mısınız? Sana çok minnettar olacağım.
Arslan Anwar

2
Yukarıdaki cümle bir zil çaldı - buradan yarı alıntı gibi görünüyor: geeknizer.com/decompile-reverse-engineer-android-apk (ya da başka türlü?). Bağlantılı makaleler, Smali ve APKTool'un yanı sıra yukarıda belirtilen araçları kısaca açıklamaktadır.
AgentKnopf

2
@JonathanDumaine bağlıdır. JAR'lar gizlenmişse ve küçük değişiklikler yapmak istiyorsanız, Backsmali tek yoludur. Bonus! APKTool ile tüm XML'leri, görüntüleri ve diğer kaynakları da geri alabilirsiniz. Cevabımı gör .
Alba Mendez

3
@JonathanDumaine Ben jmendeth katılıyorum, apktool da apk'nizi koda dönüştürmek, değiştirmek ve daha sonra yeniden derlemek istiyorsanız gitmek için bir yoldur. Dex2jar ve jd-gui kullanırken kaynak gerçekten okunabilir ancak bazı hatalar olmadan yeniden derleyemezsiniz!
darkheir

138

Bir şekilde açıklığa kavuşturmak için, neyi başarmak istediğinize bağlı olarak burada alabileceğiniz iki ana yol vardır:

Dalvik bayt kodunu (dex) okunabilir Java kaynağına dönüştürün. Bunu dex2jar ve jd-gui ile fred bahseder gibi kolayca yapabilirsiniz . Ortaya çıkan kaynak, bir uygulamanın işlevselliğini okumak ve anlamak için yararlıdır, ancak muhtemelen% 100 kullanılabilir kod üretmez. Başka bir deyişle, kaynağı okuyabilirsiniz, ancak gerçekten değiştirip yeniden paketleyemezsiniz. Kaynak koruma ile kapatılmışsa, ortaya çıkan kaynak kodunun çözülmesinin önemli ölçüde daha zor olacağını unutmayın.

Diğer önemli alternatif, tam olarak bu amaç için tasarlanmış bir montaj dili olan smali'ye bayt kodunu sökmektir . Bunu yapmanın en kolay yolunun apktool ile olduğunu gördüm . Bir kez apktool yükledikten sonra, bir apk dosyasına işaret edebilir ve uygulamada bulunan her sınıf için bir smali dosyası geri alırsınız. Yeni Java kaynağından smali oluşturarak smali'yi okuyabilir ve değiştirebilir veya sınıfları tamamen değiştirebilirsiniz (bunu yapmak için .java kaynağınızı javac ile .class dosyalarına derleyebilir, sonra .class dosyalarınızı Android ile .dex dosyalarına dönüştürebilirsiniz. dx derleyicisini seçin ve sonra bu soruda açıklandığı gibi .sx dosyasını .smali dosyalarına dönüştürmek için baksmali (smali disassembler) kullanın. Burada bir kısayol olabilir). İşiniz bittiğinde, apk yedeklemesini tekrar apktool ile kolayca paketleyebilirsiniz. Apktool'un ortaya çıkan apk'yi imzalamadığını unutmayın, bu yüzden diğer Android uygulamalarında olduğu gibi bununla ilgilenmeniz gerekir .

Smali yoluna giderseniz, bir apk'yi çözme ve yeniden derleme ve bir cihaza yükleme konusunda size yardımcı olmak için yukarıdaki adımlardan bazılarını otomatikleştiren bir IDE olan APK Studio'yu denemek isteyebilirsiniz .

Kısacası, seçimleriniz ya daha okunaklı ancak muhtemelen geri döndürülemez olan Java'ya dönüştürmek ya da okunması daha zor, ancak değişiklik yapmak ve değiştirilmiş bir uygulamayı yeniden paketlemek için daha esnek olan smali'ye sökmek için oldukça fazladır. Hangi yaklaşımı seçtiğiniz, neyi başarmak istediğinize bağlı olacaktır.

Son olarak, cesaretin önerisi de dikkate değerdir. Bu, .dex ve .apk dosyalarını java .class dosyalarına dönüştürmek için yeniden hedefleme aracıdır, böylece tipik java statik analiz araçları kullanılarak analiz edilebilirler.


61

Aslında buraya gitmenizi tavsiye ederim: https://github.com/JesusFreke/smali

DEX dosyaları için en mükemmel tersine mühendislik aracı olan BAKSMALI sağlar. Android için ünlü ROM'ları oluşturan JesusFreke tarafından yapıldı.


3
smali, dalvik IL tabanlı derleme benzeri bir dildir, doğrudan Java'ya çevrilemez.
reflog

@endryha Bunu yapabilecek hiçbir araç yok. Daha fazla bilgi için bu soruya bakın .
Alba Mendez

1
Kod, kod, kod, ... Neden sadece kod? APKTool kullanıyorsanız her şeyi geri alırsınız ! Ve bu kadar basit ./apktool d myprogram.apk. Cevabımı gör .
Alba Mendez

30

Daha tam bir versiyonu fred bireyin cevabı :

Manuel yol

İlk olarak, DEX üzerindeki tüm (derlenmiş) sınıfları bir JAR'a çıkarmak için bir araca ihtiyacınız vardır . Çinli bir öğrenci tarafından yapılan dex2jar
adlı bir tane var .

Ardından, kullanabilirsiniz jd-GUI için koda kaynak koduna JAR sınıfları.
Dex2jar bazı optimizasyonlar uyguladığından, sonuçta elde edilen kaynak oldukça okunabilir olmalıdır.

Otomatik yol

APKTool'u kullanabilirsiniz . Bu olacak otomatik tüm sınıfları (özü .dex) kaynak ( .asrc), ardından dönüştürür ikili XML için insan tarafından okunabilir XML ve aynı zamanda edecektir dissassemble sizin için sınıflar.
Sökme her zaman, özellikle
Pro Guard ile gizlenmiş JAR'larda , ayrışmadan daha sağlam olacaktır !

APKTool'a APK'yı bir dizine çözmesini söyleyin , sonra istediğinizi değiştirin
ve son olarak tekrar bir APK'ya kodlayın . Bu kadar.

Önemli: APKTool dissassembles . O değil decompile .
Oluşturulan kod Java kaynağı olmayacak.
Eğer aşina iseniz Ama bunu okumak mümkün ve hatta düzenleme o olmalıdır jasmin .
Java kaynağı istiyorsanız, lütfen Manuel yolun üzerinden geçin .


25

Bazen dex2jar/ apktool, özellikle de döngülerde bozuk kod alırsınız . Bundan kaçınmak için, dalvik bayt kodunu java kaynak koduna dönüştüren jadx kullanın , ilk önce olduğu gibi bir .jar/ .classdosya oluşturmadan dex2jar(apktool sanırım dex2jar kullanır). Aynı zamanda açık kaynaklıdır ve aktif olarak geliştirilmektedir. GUI fanatikleri için bir GUI bile var. Dene!


Ben jadx derleme seçeneği yok ama kod okunabilir olsa da
Buddy

@EnesBattal gibi javac "$(find . -name '*.java')"mi demek istiyorsun ?
Polym

apk oluşturmaya ne dersin? apk, zipalign, imzalama vb. dersleri yerleştirme
Buddy

@EnesBattal Bunu uygulamak yardımcı olabilir - aksi takdirde bunun için apktool kullanabilirsiniz .. veya android araçları ile zipalign / sign
Polym

1
@lejonl Senin için ölüm cezası, seni canavar!
Polym

17

Kullandım

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

Ancak hiçbiri Google'ın kendi araçlarını yenemez

1) Android Studio 2.x: Derleme> APKları Analiz Et resim açıklamasını buraya girin

2) android studio 3.0: profil veya hata ayıklama APK resim açıklamasını buraya girin resim açıklamasını buraya girin


1
Artı Enjarify için. Kişisel deneyimime göre, d2j
qre0ct ile

15

Kimse bundan bahsetmediği için bir araç daha var: DED ana sayfası

Nasıl yapılır ve bazı açıklamalar: Kurulum .

En iyi piyasa uygulamalarının güvenliği ile ilgili oldukça ilginç bir çalışmada kullanıldı (gerçekten merak ettiyseniz, ilgili değil): Android Uygulama Güvenliği Anketi


Umut verici görünüyor. Java kodunu doğrudan APK'dan çözüyor mu? Gizlenmiş Java kodu ne olacak?
sandalone

14

Çünkü Dheeraj Bhaskarcevabı yıllarca göreceli olarak eskidir.

İşte en son (2019 yılı) cevabım:

Ana Mantık

dan dexüzere java sourcecode, şu anda çözümün iki tür vardır:

  • One Step: Doğrudan dönüştürmek dexiçinjava sourcecode
  • Two StepBirinci dönüştürmek dexiçin jar, ikinci dönüştürmek jariçinjava sourcecode

Tek adımda çözüm: dexdoğrudanjava sourcecode

Araçlar

süreç

  1. indir jadx-0.9.0.zip , unzip it, binklasörde komut satırı jadxveya GUI sürümünü görebilirsiniz jadx-gui, GUI sürümünü çalıştırmak için çift tıklayın:jadx-gui

  1. açık dexdosya

java kaynak kodunu gösterebilir:

  1. File -> save as gradle project

sonra java kaynak kodu var:


İki Adım çözümü

Adım1: dex-jar

Araçlar

süreç

indir dex2jar zip , unzip var d2j-dex2jar.sh, sonra:

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

misal:

  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

Adım2: jar-java sourcecode

Araçlar

süreç

Burada demo Procyonjar java kaynak kodu dönüştürün:

indir procyon-decompiler-0.5.34.jar

daha sonra sözdizimi kullanarak:

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

misal:

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

dışa aktarılan kaynak kodunu açmak için editör VSCode kullanarak aşağıdaki gibi görünün:

Sonuç

Dönüşüm doğruluğu: Jadx> Procyon> CRF>JD-GUI

Kullanımı tavsiye :( bir adım çözüm) Jadx


daha ayrıntılı açıklama için, lütfen çevrimiçi Çince e- kitabımı inceleyin : 安卓 应用 的 安全 和 破解


garip, ama bu komutla 1 adım (Windows'ta decompile kavanoz için dex) yürütmek çalışırsanız dex2jar-2.0>d2j-dex2jar.bat -f D:\android\some_dex_file.dexsadece istisna var:java.io.IOException: the src file not a .dex or zip file
Сергей

@ Сергей deneyebilir misiniz: d2j-dex2jar.bat "D:\android\some_dex_file.dex"iyi mi değil mi?
crifan

Evet, tam olarak denedim >d2j-dex2jar.bat file.dexama sorun değil. belki .dexdosyam kopyalandığı için dalvik-cachemi?
Сергей

1
@ Сергей evet, en olası nedeni söyledi dex is copied from dalvik-cache, olmalıdırdex is decompiled from apk
crifan

@crifan, bu cevap için teşekkürler. JADX etkileyici. işe geri döneceğim. Emmanuel @ JD-Gui
Emmanuel Dupuy

13

APK dosyanızı indirdikten sonra, düzenlenebilir bir java kodu / belgesi almak için aşağıdaki adımları uygulamanız gerekir.

  1. APK dosyanızı zip'e dönüştürün (indirmeye başla "kaydet" seçeneği ile gitmeyin, sadece "farklı kaydet" ile devam edin ve uzantınızı .zip olarak belirtin) bunu yaparak APKTOOL'dan kaçınabilirsiniz ...
  2. Zip dosyasını ayıklayın, orada somefilename.dex dosyasını bulabilirsiniz. şimdi dex'i dönüştürmeliyiz -> .class
  3. Bunu yapmak için "dex2jar" gereklidir ( http://code.google.com/p/dex2jar/ adresinden indirebilirsiniz, ayıklandıktan sonra komut isteminde [D: \ dex2jar-0.09> dex2jar somefilename.dex] (somefilename.dex dosyanızın, dex2jar dosyalarınızı sakladığınız klasörün içinde olması gerektiğini unutmayın.)
  4. Http://www.viralpatel.net/blogs/download/jad/jad.zip adresinden jad'i indirin ve çıkarın. Ayıklandıktan sonra "jad.exe" ve "Readme.txt" gibi iki dosya görebilirsiniz (bazen "jad.exe" yerine "jad.txt" olabilir, bu nedenle uzantısını çalıştırmak için as.exe olarak yeniden adlandırın)
  5. Son olarak, komut isteminde [D: \ jad> jad -sjava dosya adınız.class] gibi sınıf dosyasından düzenlenebilir java belgesine ayrıştırılacaktır.

8

Dedexer ile dosyayı dalvik.dex bayt koduna ( .ddx) ayırabilirsiniz .

Java'ya ayrışmak bildiğim kadarıyla mümkün değil.
Dalvik bayt kodunu buradan okuyabilirsiniz .


1
(şu anda) mümkün olmadığını söyleyen siz olduğunuz için kabul edildi, ki bu doğru görünüyor.
Will

@ Her şey mümkün olacak. Sadece onu nasıl gördüğüne bağlı. Dekompilasyon olan olası ama belki düşünüyorsun şekilde değil.
Alba Mendez

8

Android Tersine Mühendislik mümkündür . .Java dosyasını apk dosyasından almak için aşağıdaki adımları izleyin.

Aşama 1 . Dex2jar kullanma

  • .Apk dosyasından .jar dosyası oluşturun
  • komut: dex2jar sampleApp.apk

Adım 2 . JD-GUI kullanarak .jar dosyasını ayrıştırma

  • biz alırsınız, .class dosyaları yani decompiles Karartılmış apk'de gelen .java geri.

Ama yine de tüm decompiled kaynak kodu derlemek, çalışmaz wil, derleyici çok hata gösterir.

decompile android java kaynak kodu tutulması için kullanılabilir herhangi bir çözüm var mı

2
Ters Mühendislik gelmez değil mutlaka anlamına Dekompilasyon . Aslında, ProGuard ile gizlenmiş JAR'lar doğru şekilde ayrışmaz.
Alba Mendez

Gizlenmiş kodla uğraşıyorsanız, sadece demonte etmek daha iyidir . Java kaynağını alamazsınız, ancak kodu her zaman görebilir / değiştirebilirsiniz. Cevabımı gör .
Alba Mendez

Hem çürümeyi hem de sökmeyi tavsiye ederim. Ortaya çıkan decompiled kodun anlaşılması daha kolaydır, ancak tüm değişikliklerin demonte sürümle yapılması gerekir. Özellikle koruma kullanılmışsa doğrudur. Ben jd-gui ile kombine dex2jar decompiling için en iyi olduğunu düşünüyorum.
Mikko Rantalainen

6

Son Debian'ın Python paketi var 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

İlgili paketleri kurun:

sudo apt-get install androguard python-networkx

Decompile DEX dosyası:

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

Özü classes.dexApk + koda dan:

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

Apk dosyası Java arşivinden (JAR) başka bir şey değildir, dosyaları arşivden şu yolla çıkarabilirsiniz:

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

5

Bu yanıtların çoğu yayınlandığından beri çok şey değişti. Günümüzde GUI'lerle birçok kolay araç var, bunlar gibi:

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

Onları bulmak için en iyi yer XDA Developers forumunda.




2

Bir android uygulamasını kaynak koda dönüştürmenin en kolay yolu , Play Store'dan ShowJava adlı bir uygulamayı indirmektir. Sadece uygulamalar listesinden çözülmesi gereken uygulamayı seçin. Bir uygulamanın kodunu çözmek için kullanabileceğiniz üç farklı kod çözücü vardır.

CFR 0.110, JaDX 0.6.1 veya FernFlower (analitik dekomiler).


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.