jadx を使うと、Android アプリのファイル(APK など)を Java のソースコードに戻して、画面で読めます。この記事では、自分で作ったアプリが、配布する形でどう見えているかを確かめる使い方を説明します。
この記事は、Android アプリを作っていて、公開前に「APK の中身から何が読み取れるか」を自分の目で確かめたい人に向けています。読み終えると、次のことができるようになります。
- jadx をインストールして、GUI 版とコマンドライン版を起動する
- 自作アプリの APK を開き、マニフェストやコードを読む
- 文字列を検索して、埋め込んだ API キーや通信先が残っていないかを調べる
jadx でできること
jadx は、Dex 形式(Android アプリの実行コード)から Java のコードを作るデコンパイラです。公式 README によると、次のことができます。
- APK、dex、aab、apks、apkm、xapk、zip から Java のコードを作る
- jar、class、aar、smali も扱う
AndroidManifest.xmlなどのリソースをresources.arscから読める形に戻す- 読みにくい名前を付け直す難読化解除の機能を持つ
GUI 版には、構文の色分け、宣言へのジャンプ、使用箇所の検索、全文検索があります。smali のデバッガーもあります。
仕組み
文章で読む(くわしい説明)
jadx で読むときの妨げになるのは、攻撃側がコードや文字列を隠す技法(Mobile の T1406 Obfuscated Files or Information)で、MITRE は、ペイロードやファイルの中身を暗号化や符号化などで隠すことや、防御側が見つける手がかりになる平文の文字列を符号化して隠すことを挙げています。正規のアプリでも、Android の公式文書によると、R8 が DEX ファイルを小さくするためにクラス・フィールド・メソッドの名前を短くします(例:com.example.MyActivity が a.b.a)。jadx の --deobf は、既定で 3 文字より短い名前と 64 文字より長い名前を、jadx が決めた名前に付け直します。実行ファイルを圧縮や暗号化で包むパッカー(T1406.002 Software Packing)が使われていると、読み込みでつまずくことがあり、jadx の公式 Troubleshooting は、一部のパッカーが dex のチェックサムを改ざんするためだと書いています。MITRE の例の AndroidOS/MalLocker.B は、暗号化したコードを Assets ディレクトリに置き、独自の復号の処理で .dex を組み立てるので、そのような .dex は、APK を戻しただけでは読めないおそれがあります。文字列が符号化されていれば、全文検索で http や key を探しても当たらないことがあり、見つからなかったことは、入っていない証拠になりません。
外と行う通信
調べた範囲では、次のとおりです。
- GUI 版は、起動時に新しい版を確かめる設定が既定で有効です。確認のコードは、GitHub の API(
api.github.com)で最新リリースを問い合わせます。 - プラグインを管理する
pluginsコマンドには、公開されているプラグインの一覧を調べたり、入れたり更新したりするオプションがあります。使ったときだけ、外からプラグインを取得します。 - 開いた APK の内容を、jadx が外へ送る処理は見つかりませんでした。ただし、コマンドライン版が外へ通信するかどうかは、確かめられていません。
更新確認を止めたいときは、GUI の設定画面で「Check for updates on startup」のチェックを外します。
必要なもの
README に書かれている条件は次のとおりです(v1.5.6 時点)。
| 項目 | 内容 |
|---|---|
| Java | 64 ビットの Java 11 以降。with-jre と名前に付いた配布ファイルは、Java の入手が不要です |
| 配布ファイル | jadx-<バージョン>.zip、jadx-gui-<バージョン>-win.zip、jadx-gui-<バージョン>-with-jre-win.zip |
| パッケージ | Arch Linux(pacman)、macOS(Homebrew)、Flathub |
| ソースからのビルド | JDK 17 以上 |
安全な試し方:自作アプリの APK を読む
- 公式のリリースページから、自分の環境に合う zip を入手します。Windows で Java を入れたくないときは、
with-jreの付いた zip を選びます。 - zip を展開します。
binフォルダに、コマンドライン版のjadxと GUI 版のjadx-guiが入っています。Windows 向けの配布ファイルは、展開した中のjadx-gui-<バージョン>.exeを実行します。 - 自分でビルドした APK を用意します。アプリの本物のリリースビルドを使うと、配布するファイルと同じ状態を確かめられます。
jadx-guiを起動し、APK を開きます。AndroidManifest.xmlを開き、宣言した権限や設定が意図どおりかを確かめます。- 全文検索で、
http、api、key、token、passwordなどの語を探します。コードに埋め込んだ秘密や、テスト用の通信先が残っていれば見つかります。 - 見つけたら、元のソースコードに戻って直します。キーなどの秘密は、アプリに埋め込まず、サーバー側で持つ形に変えます。
コマンドラインで一括して書き出すこともできます。
-
出力先を指定して実行します。
jadx -d out app.apk -
outフォルダにできたファイルを、好きなエディターや検索ツールで調べます。
名前が短く読みにくいときは、--deobf を付けると、名前を付け直します。
主な使い方
| オプション | 内容 |
|---|---|
-d、--output-dir |
出力先のフォルダ |
-r、--no-res |
リソースを戻さない |
-s、--no-src |
ソースコードを戻さない |
-e、--export-gradle |
Gradle プロジェクトとして保存する |
--deobf |
難読化された名前を付け直す |
--show-bad-code |
うまく戻せなかったコードも表示する |
-m、--decompilation-mode |
出力の形。auto、restructure、simple、fallback から選ぶ |
--single-class |
1 つのクラスだけを戻す |
-j、--threads-count |
処理のスレッド数。既定は CPU のスレッド数の半分 |
全部のオプションは、jadx --help で確かめられます。うまく戻らないときの対処は、公式 Wiki の Troubleshooting Q&A にまとまっています。
MobSF・Ghidra との違い
| jadx | MobSF | Ghidra | |
|---|---|---|---|
| 主な対象 | Android アプリの Dex、Java のバイトコード | Android・iOS・Windows のアプリ | コンパイル済みの実行ファイル全般 |
| 結果 | 戻した Java のコード | 問題になりそうな箇所の一覧 | 逆アセンブルと逆コンパイルの結果 |
| 判断する人 | 自分 | ツールが指摘し、自分が確かめる | 自分 |
まず MobSF で一覧を作り、気になった箇所を jadx でコードに当たると、確かめやすくなります。
注意点
- 読むのは、自分が作ったアプリ、または公開されている練習用のアプリだけにしてください。他人のアプリを解析する前に、利用規約や使用許諾契約を確認してください。リバースエンジニアリングを禁じている場合があります。判断に迷うときは、自分のアプリと、解析してよいと明記された教材だけを使ってください。
- 出どころの分からない APK を開くときは、普段使いのパソコンとは分けた環境を使いましょう。jadx はアプリを実行しませんが、ファイルの読み込みで問題が起きる可能性はあります。v1.5.6 のリリースノートには、zip の項目の扱いなどのセキュリティ修正が書かれています。新しい版を使ってください。
- jadx には、zip や XML の安全確認を切る環境変数(
JADX_DISABLE_ZIP_SECURITYなど)があります。必要がなければ設定しないでください。 - 戻したコードにはエラーや不完全な部分が出ます。変数名やコメントは元のソースと違います。
- プラグインは外から取得して追加するプログラムです。入れる前に、提供元を確認してください。
- 本体は、公式の GitHub リリースページか、README に載っているパッケージから入手してください。
次に読む
名前が短くなっているとき(正規のアプリでも)
- R8 が、クラス・フィールド・メソッドの名前を短くするAndroid の公式文書によると、DEX ファイルを小さくするため。例: com.example.MyActivity が a.b.a
- jadx の --deobf は、名前を付け直す既定で、3 文字より短い名前と 64 文字より長い名前を、jadx が決めた名前にする
ATT&CK T1406Obfuscated Files or Information(Mobile)
- 攻撃側の技法
- ペイロードやファイルの中身を、暗号化や符号化などで隠す。防御側が見つける手がかりになる平文の文字列を、符号化して隠すことも挙げられている(MITRE)
ATT&CK T1406.002Obfuscated Files or Information: Software Packing
- 攻撃側の技法
- 実行ファイルを、圧縮や暗号化で包む(パッカー)
- jadx で起きること
- 読み込みでつまずくことがある。jadx の公式 Troubleshooting は、一部のパッカーが dex のチェックサムを改ざんするためだと書いている
MITRE の例:AndroidOS/MalLocker.B
- 暗号化したコードを Assets ディレクトリに置き、独自の復号の処理で .dex を組み立てます。そのような .dex は、APK を戻しただけでは読めないおそれがあります。
見つからなかったとき
- 文字列が符号化されていれば、全文検索で http や key を探しても当たらないことがあります。見つからなかったことは、入っていない証拠になりません。
出典
- 公式リポジトリ README(機能・ダウンロード・使い方・オプション)github.com/skylot/jadx/blob/master/README.md
- ライセンス(Apache License 2.0)github.com/skylot/jadx/blob/master/LICENSE
- リリース:v1.5.6(配布ファイルとセキュリティ修正)github.com/skylot/jadx/releases/tag/v1.5.6
- ソース:更新確認のコード(JadxUpdate.kt)github.com/skylot/jadx/blob/master/jadx-gui/src/main/java/jadx/gui/update/JadxUpdate.kt
- ソース:GUI の設定の既定値(JadxSettingsData.java)github.com/skylot/jadx/blob/master/jadx-gui/src/main/java/jadx/gui/settings/JadxSettingsData.java
- ソース:GUI の設定画面(JadxSettingsWindow.java)github.com/skylot/jadx/blob/master/jadx-gui/src/main/java/jadx/gui/settings/ui/JadxSettingsWindow.java
- 公式 Wiki:Troubleshooting Q&A(パッカーによる dex チェックサムの改ざん)github.com/skylot/jadx/wiki/Troubleshooting-Q&A
- Android 公式:コードの縮小・難読化・最適化(R8)developer.android.com/build/shrink-code
- MITRE ATT&CK T1406 Obfuscated Files or Information(Mobile)attack.mitre.org/techniques/T1406/
- MITRE ATT&CK T1406.002 Obfuscated Files or Information Software Packing(Mobile)attack.mitre.org/techniques/T1406/002/
確認日 2026-11-03
似たツール
Ghidra
影響範囲 手元だけ米国 NSA が開発し、オープンソースで無料公開しているリバースエンジニアリングの道具一式。コンパイル済みのプログラムを逆アセンブル・逆コンパイルして、中身を読めるようにします。
- 用途
- 学習
- 形式
- デスクトップアプリ
- 難易度
- 上級
- ライセンス
- 自由に使えるApache-2.0
- 分類
- リバースエンジニアリング/学習・演習環境
mitmproxy
影響範囲 外に届くブラウザやアプリと Web サーバーの間に入り、HTTPS も含めた HTTP の通信を記録・確認・書き換えできるプロキシ。
- 用途
- 診断・監査
- 形式
- コマンドライン
- 難易度
- 中級
- ライセンス
- 自由に使えるMIT
- 分類
- Web セキュリティ/ネットワーク
MobSF
影響範囲 手元だけAndroid や iOS のアプリを読み込んで、危ない設定や権限、コードの問題を一覧にするモバイルアプリ診断ツール。ブラウザから操作します。
- 用途
- 診断・監査
- 形式
- Web サービス
- 難易度
- 中級
- ライセンス
- 条件つきGPL-3.0
- 分類
- リバースエンジニアリング/脆弱性スキャン