DEXをJavaソースコードに逆コンパイルする


706

Android DEX(VMバイトコード)ファイルを対応するJavaソースコードに逆コンパイルするにはどうすればよいですか?


見ていこちらを。そこから先に進むために可能なリードを取得します。
ケビン・ボイド

更新された情報は、ハブのブログコーダーで提供されています:coders-hub.com/2013/04/how-to-convert-apk-file-into-source.html
メリーランドMohsin

お金がある場合はjebを購入し、それ以外の場合はjadxを使用してください理由はこちらをご覧ください
polym

あなただけのチェックアウトbytecodeviewer、それを行うことを可能にする新しいクロスplateform(ジャワ)とオープンソースのツールは、あります:stackoverflow.com/a/36557898/795245
Gomino

回答:


881

それは簡単です

これらのツールを入手してください:

1)dexファイルをjarファイルに変換するdex2jar

2)jar内のJavaファイルを表示するためのjd-gui

dex2jarがいくつかの最適化を行うため、ソースコードは非常に読みやすくなっています。

手順:

そして、これは逆コンパイルする方法の手順です:

ステップ1:

test_apk-debug.apkのclasses.dexを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

注1: Windowsマシンでは、すべての.shスクリプトが置き換えられている.batスクリプト

注2: linux / macでは、shまたはを忘れないでくださいbash。完全なコマンドは次のようになります。

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

注3:また、dex2jar-X.Xディレクトリに実行権限を追加することを忘れないでください。sudo chmod -R +x dex2jar-2.0

dex2jarドキュメント

ステップ2:

JD-GUIでjarを開きます

The decompiled source


57
+1。私はBaksmaliとDex2jarの両方を試しました。Dex2Jar + JD-Guiは、ほとんどの.dexファイルの完全に読み取り可能なソースコードを提供することで勝利しました。
Jonathan Dumaine、2011年

こんにちは、あなたはあなたの道を共有してくれませんか?私はあなたにとても感謝します。
Arslan Anwar

2
上記の文はベルを鳴らしました-それはここからのセミクォートのようです:geeknizer.com/decompile-reverse-engineer-android-apk(またはその逆?)。リンク先の記事では、上記のツールとSmaliおよびAPKToolについて簡単に説明しています。
AgentKnopf 2012年

2
依存する@JonathanDumaine。JARが難読化されており、ほとんど変更を加えたくない場合は、Backsmaliが唯一の方法です。ボーナス!APKToolを使用すると、すべてのXML、画像、その他のリソースも取得できます。私の答えをください。
アルバメンデス

3
@JonathanDumaine私はjmendethに同意します。apktoolは、apkを逆コンパイルし、修正してから再コンパイルする場合にも使用できます。dex2jarとjd-guiを使用している間、ソースは本当に読みやすいですが、いくつかのエラーを再コンパイルすることはできません!
darkheir 2012

138

多少明確にするために、達成したいことに応じて、次の2つの主要な方法があります。

Dalvikバイトコード(dex)を読み取り可能なJavaソースに逆コンパイルします。fredが言及しているように、これはdex2jarjd-guiで簡単に実行できます。結果のソースは、アプリの機能を読んで理解するのに役立ちますが、100%使用可能なコードは生成されない可能性があります。つまり、ソースを読み取ることはできますが、実際にソースを変更して再パッケージ化することはできません。ソースがproguardで難読化されている場合、結果のソースコードのもつれを解くのがかなり困難になることに注意してください。

他の主要な代替手段は、バイトコードをsmaliに逆アセンブルすることです。これは、まさにこの目的のために設計されたアセンブリ言語です。これを行う最も簡単な方法はapktoolを使用することです。apktoolをインストールしたら、apkファイルをポイントするだけで、アプリケーションに含まれる各クラスのsmaliファイルが返されます。新しいJavaソースからsmaliを生成することにより、smaliを読み取って変更したり、クラスを完全に置き換えることもできます(これを行うには、javacを使用して.javaソースを.classファイルにコンパイルし、Androidで.classファイルを.dexファイルに変換します。この質問で説明されているように、dxコンパイラー、次にbaksmali(smali逆アセンブラー)を使用して.dexを.smaliファイルに変換します。ここにショートカットがあるかもしれません)。完了したら、apktoolを使用してapkを簡単にパッケージ化できます。apktoolは結果のapkに署名しないため、他のAndroidアプリケーション同じように処理する必要があることに注意してください。

smaliルートを使用する場合、APKの逆コンパイルと再コンパイル、およびデバイスへのインストールを支援するために上記の手順の一部を自動化するIDEであるAPK Studioを試してみるとよいでしょう。

要するに、あなたの選択は、より読みやすくはあるが不可逆的である可能性が高いJavaに逆コンパイルするか、変更が容易で、変更されたアプリを再パッケージ化するのがはるかに柔軟であるsmaliに逆アセンブルするかのどちらかです。どのアプローチを選択するかは、達成しようとしていることに依存します。

最後に、あえての提案も注目に値します。これは、.dexファイルと.apkファイルをjava .classファイルに変換するためのリターゲッティングツールであり、一般的なjava静的分析ツールを使用して分析できます。


61

私は実際にここに行くことをお勧めします:https : //github.com/JesusFreke/smali

DEXファイル用の最も優れたリバースエンジニアリングツールであるBAKSMALIを提供します。Android用の有名なROMを作成した人、JesusFrekeによって作成されました。


3
smaliは、dalvik ILに基づくアセンブリのような言語です。Javaに直接翻訳することはできません。
reflog 2010年

@endryhaそれを行うことができるツールはありません。詳細については、この質問を参照してください。
アルバメンデス2012年

1
コード、コード、コード、...なぜコードだけなのか?APKToolを使用すると、すべてを取り戻すことができます!そして、それはと同じくらい簡単./apktool d myprogram.apkです。私の答えをください。
アルバメンデス

30

フレッド答えのより完全なバージョン:

手動の方法

まず、DEX上のすべての(コンパイルされた)クラスをJAR に抽出するツールが必要です。dex2jar
と呼ばれるものがあります中国の学生が作ったます。

次に、jd-guiを使用して、JARのクラスをソースコードに逆コンパイルできます。
dex2jarはいくつかの最適化を適用するため、結果のソースは非常に読みやすいはずです。

自動方法

APKToolを使用できます。すべてのクラス()、リソース()を自動的に抽出し、バイナリXML人間が読めるXML変換し、クラスを逆アセンブルします。分解常に、逆コンパイルよりも堅牢になり、特に プロガードと難読化のJAR!.dex.asrc

APKToolにAPKをディレクトリにデコードし必要なものを変更し
、最後にエンコードしてAPKに戻すように指示するだけです。それで全部です。

重要: APKToolは逆アセンブルします。逆コンパイルはしません。
生成されたコードはJavaソースにはなりません。
しかし、それを読んだり、jasminに慣れていれば編集したりできるはずです。
Javaソースが必要な場合は、手動の方法を参照してください。


25

dex2jar/ を使用するとapktool、特にループ内でコードが壊れることがあります。この、使用しないようにするにjadx作成することなく、Javaのソースコードに逆コンパイルのDalvikバイトコードを、.jar/の.classように最初のファイルをdex2jar(apktoolの用途は、私が考えてdex2jar)ん。また、オープンソースであり、活発に開発されています。GUI狂信者のために、GUIさえ備えています。それを試してみてください!


jadxにはコンパイルオプションがないと思いますが、コードは読み取り可能です
Buddy

@EnesBattalってどういう意味javac "$(find . -name '*.java')"
polym

APKを作成するのはどうですか?apk、zipalign、signingなどにクラスを配置する
バディ

@EnesBattalそれはあなたがそれを実装するのを助けることができます-そうでなければあなたはそれのためにapktoolを使うことができます..またはandroidツールでzipalign / sign
polym

1
@lejonlあなたのための死刑、あなたモンスター!
polym 2016

17

利用した

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

しかし、Google独自のツールに勝るものはありません

1)Android Studio 2.x: ビルド> APKの分析 ここに画像の説明を入力してください

2)Android Studio 3.0: APKのプロファイルまたはデバッグ ここに画像の説明を入力してください ここに画像の説明を入力してください


1
Enjarifyの1つ。私の個人的な経験では、d2jと比較してより良い結果が得られることが証明されています
qre0ct

15

誰もこれについて言及しなかったので、もう1つのツールがあります:DEDホームページ

インストール方法といくつかの説明:インストール

これは、トップマーケットアプリのセキュリティに関する非常に興味深い研究で使用されました(好奇心が強い場合でも、実際には関連していません):Androidアプリケーションセキュリティの調査


それは有望に見えます。Javaコードを逆コンパイルしてAPKを直接作成しますか?難読化されたJavaコードはどうですか?
Sandalone

14

以来Dheeraj Bhaskarの答えは、過去何年もの間などの比較的古いです。

これが私の最新(2019年)の回答です。

メインロジック

からdexまでjava sourcecode、現在2種類のソリューションがあります。

  • One Step:直接変換dexするjava sourcecode
  • Two Step:最初の変換dexjar、第二変換jarしますjava sourcecode

ワンステップソリューション:dex直接java sourcecode

ツール

処理する

  1. jadx-0.9.0.zipをダウンロードし、解凍しbinます。フォルダにコマンドラインjadxまたはGUIバージョンが表示されます。GUIバージョンjadx-guiを実行するにはダブルクリックします。jadx-gui

  1. dexファイルを開く

次に、Javaソースコードを表示できます。

  1. File -> save as gradle project

その後、Javaソースコードを取得しました:


2ステップソリューション

ステップ1:dexjar

ツール

処理する

dex2jar zipをダウンロードし、展開してからd2j-dex2jar.sh

  • apkjarsh d2j-dex2jar.sh -f ~/path/to/apk_to_decompile.apk
  • dexjarsh d2j-dex2jar.sh -f ~/path/to/dex_to_decompile.dex

例:

  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

ステップ2:jarjava sourcecode

ツール

処理する

こちらのデモ Procyon jarをjavaソースコードに変換します。

procyon-decompiler-0.5.34.jarをダウンロード

次に構文を使用します:

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

例:

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

エディタVSCodeを使用して、エクスポートされたソースコードを開くと、次のようになります。

結論

変換正し:Jadx> Procyon> CRF>JD-GUI

使用をお勧めします:(ワンステップソリューション) Jadx


詳細な説明については、私のオンライン中国語電子ブックを参照してください:安卓应用的安全和破解


奇妙ですが、このコマンドを使用して1ステップ(Windowsでdexからjarで逆コンパイル)を実行しようとすると、dex2jar-2.0>d2j-dex2jar.bat -f D:\android\some_dex_file.dex例外が発生します。java.io.IOException: the src file not a .dex or zip file
Сергей'28

@Сергей試してみd2j-dex2jar.bat "D:\android\some_dex_file.dex"ませんか?大丈夫ですか?
crifan

はい、正確に試しました>d2j-dex2jar.bat file.dexが、大丈夫ではありません。多分それ.dexは私のファイルがからコピーされたためdalvik-cacheですか?
Сергей

1
@Сергейはい、最も可能性のある理由はあなたが言ったものdex is copied from dalvik-cacheであるはずですdex is decompiled from apk
crifan '30

@crifan、この回答をありがとう。JADXは印象的です。私は仕事に戻ります。Emmanuel @ JD-Gui
Emmanuel Dupuy

13

APKファイルをダウンロードしたら、編集可能なJavaコード/ドキュメントを取得するために次の手順を実行する必要があります。

  1. apkファイルをzipに変換します(ダウンロードを開始するときは、「保存」オプションを使用せず、「名前を付けて保存」を使用して、拡張子を.zipとして記述してください)。これにより、APKTOOLを回避できます。
  2. zipファイルを解凍すると、somefilename.dexが見つかります。だから今私たちはdex->​​ .classを変換する必要があります
  3. それを行うには、「dex2jar」が必要です(http://code.google.com/p/dex2jar/からダウンロードできます。抽出後、コマンドプロンプトで[D:\ dex2jar-0.09> dex2jar somefilename.dex](somefilename.dexは、dex2jarを保持しているのと同じフォルダ内にある必要があることに注意してください。)
  4. http://www.viralpatel.net/blogs/download/jad/jad.zipからjadをダウンロードして抽出します。抽出すると、「jad.exe」や「Readme.txt」などの2つのファイルが表示されます(「jad.exe」の代わりに「jad.txt」が存在する場合があるので、拡張子をas.exeに変更して実行してください)。
  5. 最後に、コマンドプロンプトで[D:\ jad> jad -sjava yourfilename.class]のように指定する必要があります。これにより、クラスファイルが解析されて編集可能なJavaドキュメントになります。

8

ではDedexer、あなたは逆アセンブルできる.dexのDalvikバイトコードにファイルを(.ddx)。

私の知る限り、Java向けの逆コンパイルは不可能です。ここで
dalvikバイトコードについて読むことができます


1
あなたはそれが(現在)不可能であると言っている人なので受け入れられました、それは本当のようです。
ウィル

@すべてが可能になります。見方次第です。逆コンパイル可能ですが、あなたが考えている方法ではないかもしれません。
アルバメンデス

8

Androidリバースエンジニアリングが可能 です。次の手順に従って、apkファイルから.javaファイルを取得します。

ステップ1 。dex2jarの使用

  • .apkファイルから.jarファイルを生成する
  • コマンド: dex2jar sampleApp.apk

ステップ2 。JD-GUIを使用した.jarの逆コンパイル

  • つまり、.classファイルを逆コンパイルします。つまり、難読化された .javaをapkから戻します。

しかし、すべての逆コンパイルされたソースコードを再度コンパイルすると、実行されず、コンパイラは多くのエラーを表示します。

AndroidのJavaのソースコードは、Eclipseで実行されますデコンパイルのために利用可能な解決策がある

2
リバースエンジニアリング必ずしも逆コンパイルを意味するわけでありませ。実際、ProGuardで難読化されたJARは正しく逆コンパイルされません。
アルバメンデス

難読化されたコードを扱っている場合は、単に逆アセンブルすることをお勧めします。Javaソースは取得できませが、コードを常に表示/変更できます。私の答えをください。
アルバメンデス

逆コンパイルと逆アセンブルの両方を行うことをお勧めします。結果の逆コンパイルされたコードは理解しやすくなりますが、すべての変更は逆アセンブルされたバージョンで行う必要があります。プロガードが使用されている場合は特にそうです。dex2jarとjd-guiの組み合わせは、逆コンパイルに最適です。
ミッコランタライネン2015

6

最近のDebianには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

対応するパッケージをインストールします。

sudo apt-get install androguard python-networkx

DEXファイルを逆コンパイルします。

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

classes.dexAPK +逆コンパイルから抽出:

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

ApkファイルはJavaアーカイブ(JAR)にすぎません。次の方法でアーカイブからファイルを抽出できます。

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

5

これらの回答のほとんどが投稿されてから、多くのことが変更されました。今日では、GUIを備えた次のような簡単なツールが数多くあります。

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

それらを見つけるのに最適な場所は、XDA開発者フォーラムです。


4

JADX(https://bitbucket.org/mstrobel/procyon/wiki/Java%20Decompiler)を試してみてください。これはDEX逆コンパイルに最適なツールです。

そして、はい、(my:0))の新しいサイト(http://www.javadecompilers.com/apk/)からオンラインで入手することもできます


代わりに、コードで使用できますか?Android自体にも意味がありますか?そして、ウェブサイトはここではありません:github.com/skylot/jadx
Android開発者


2

Androidアプリを逆コンパイルする最も簡単な方法は、playJavaからShowJava という名前のアプリをダウンロードすることです。アプリケーションのリストから逆コンパイルする必要があるアプリケーションを選択するだけです。つまり、アプリを逆コンパイルするために使用できる3つの異なる逆コンパイラがあります-

CFR 0.110、JaDX 0.6.1またはFernFlower(分析デコンパイラー)。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.