hacktricks/mobile-pentesting/android-app-pentesting/apk-decompilers.md
2023-07-07 23:42:27 +00:00

12 KiB
Raw Blame History

APKデコンパイラ

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

JD-Gui

最初の有名なGUI Javaデコンパイラで、APKから取得したJavaコードを調査するために使用できます。

Jadx

ビルドインJavaマルチプラットフォームで、現時点ではおそらく推奨されているものです。
単に最新バージョンをダウンロードして、_bin_フォルダから実行します。

jadx-gui

GUIを使用すると、テキスト検索を実行したり、関数の定義関数をクリックしてCTRL +左クリック)やクロスリファレンス(右クリック→使用箇所を検索)に移動したりできます。

GUIを使用せずにJavaコードのみを取得したい場合、jadxのCLIツールを使用するのが非常に簡単です。

jadx app.apk

次に、jadxの興味深いオプションGUIおよびCLIバージョンがあります。

-d <path to output dir>
--no-res #No resources
--no-src #No source code
--no-imports #Always write entire package name (very useful to know where is the function that you might want to hook)

GDA-android-reversing-Tool

GDAは強力で高速な逆解析プラットフォームです。基本的な逆コンパイル操作だけでなく、悪意のある動作の検出、プライバシーの漏洩検出、脆弱性の検出、パスの解決、パッカーの識別、変数のトラッキング分析、難読化、PythonJavaスクリプト、デバイスメモリの抽出、データの復号化と暗号化など、多くの優れた機能をサポートしています。

Windowsのみ対応。

Bytecode-Viewer

もう1つの興味深い静的解析ツールは、bytecode-viewerです。これにより、複数の逆コンパイラを同時に使用してAPKを逆コンパイルすることができます。例えば、2つの異なるJava逆コンパイラと1つのSmali逆コンパイラを使用できます。また、コードを変更することもできます。

コードを変更した場合、それをエクスポートすることができます。
bytecode-viewerの欠点は、参照や相互参照がないことです。

Enjarify

Enjarifyは、Dalvikバイトコードを等価のJavaバイトコードに変換するツールです。これにより、Javaの解析ツールでAndroidアプリケーションを分析することができます。
Dex2jarは、DalvikからJavaバイトコードに変換しようとする古いツールです。ほとんどの場合、うまく動作しますが、一部のマイナーな機能や特殊なケースでは失敗したり、間違った結果を生成したりすることがあります。それに対して、Enjarifyはできるだけ多くのケースで動作するように設計されており、Dex2jarでは失敗するコードでも正しく処理します。Enjarifyは、ユニコードのクラス名、複数の型として使用される定数、暗黙のキャスト、例外ハンドラが通常の制御フローにジャンプすること、定数を参照しすぎるクラス、非常に長いメソッド、キャッチオールハンドラの後の例外ハンドラ、間違った型の静的初期値など、さまざまなケースを正しく処理します。

CFR

CFRは、モダンなJavaの機能を逆コンパイルします - Java 91214を含む - ただし、Java 6で完全に書かれているため、どこでも動作します (FAQ) - 他のJVM言語のクラスファイルをJavaに戻すのにもうまく対応します

そのJARファイルは次のように使用できます

java -jar ./cfr.jar "$JARFILE" --outputdir "$OUTDIR"

大きなJARファイルでは、メモリが不足することがあります。もし同じ問題が発生した場合は、JVMのメモリ割り当てプールのサイズを調整することができます。

java -Xmx4G -jar ./cfr.jar "$JARFILE" --outputdir "$OUTDIR"

この例では、最大4GBが割り当てられます。

出力ディレクトリには、デコンパイルされた.javaファイルと、デコンパイルの概要が含まれています。

Fernflower

次はFernflowerです。これはIntelliJ IDEAの一部です。みんなが言うように、これは「解析的な」デコンパイラです(彼らのプロジェクトの説明に記載されています)、しかし、実際にはこれがどういう意味なのかは誰も指摘していません。私はただこのStackoverflowの質問を見つけましたが、残念ながら今日まで回答はありません。

とにかく、自己完結型のリリースがないため、自分でビルドする必要があります。Gradleベースのプロジェクトとして、クローンして、Gradleがマシンにインストールされている場合は次のコマンドを実行します。

cd ./plugins/java-decompiler/engine && gradle jar

以下では、まず作業ディレクトリをFernflowerのルートディレクトリに切り替えます。次に、Gradleに./build/libs/fernflower.jarファイルをビルドするよう指示します。

Fernflowerの呼び出しはCFRと似ています。

java -jar ./fernflower.jar "$JARFILE" "$OUTDIR"

以下のデコンパイラの中で、これは生成された.javaファイルをJARファイルで出力する唯一のものです。unzipを使用して簡単にソースファイルを抽出できます。

Krakatau

前述のEnjarifyを覚えていますか同じ作者が開発したデコンパイラのKrakatauです。

他のプロジェクトとは異なり、これはPythonで書かれています。そして、これが他と少し異なる理由だと思います。

プロジェクトのREADMEから引用します。

次に、デコンパイルしようとしているJARが参照する外部クラスつまりライブラリの定義を含むJARがあることを確認してください。これには標準ライブラリクラスつまりJRTも含まれます。

そして、説明によると、これらの標準ライブラリクラスはJavaのバージョン8までrt.jarというファイルの形式で提供されています。後のバージョンでは、作者はjrt-extractorを提供しており、これを使用してこのファイルを生成できます。

そのため、このツールをダウンロードし、以下のコマンドを実行します。

cd ./jrt-extractor
javac JRTExtractor.java
java -ea JRTExtractor

このディレクトリ内には、rt.jarというファイルが書き込まれているはずです。

このファイルがあれば、Krakatauを以下のように実行できます。

./Krakatau/decompile.py -out "$OUTDIR" -skip -nauto -path ./jrt-extractor/rt.jar "$JARFILE"

プロジェクトのGitHubを参照して、パラメータの説明を確認してください。ただし、JARファイルで使用されるライブラリについては、Krakatauは-pathフラグにJARファイルとして追加する必要があります。

procyon

インストール後、使用方法は簡単です。

procyon -jar "$JARFILE" -o "$OUTDIR"

参考文献

{% embed url="https://eiken.dev/blog/2021/02/how-to-break-your-jar-in-2021-decompilation-guide-for-jars-and-apks/#cfr" %}

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥