Hello there, ('ω')ノ
📦 Dexファイルとは何か?
Dexとは Dalvik Executable(ダルビック実行ファイル) の略で、Androidで動作するアプリのバイトコードが格納されているファイル形式です。
アプリ開発のビルド工程を簡単に振り返ると:
Java/Kotlinソースコード ↓(コンパイル) .class ファイル(Javaバイトコード) ↓(dxツールなどで変換) classes.dex(Dexバイトコード)
つまり、Android端末が直接実行するのはこのDexファイルなのです。
APKファイルの中を解凍すると、通常 classes.dex というファイルが存在しています。
🧠 Dexファイルの基本構造
Dexファイルには、次のような構成要素が含まれています:
| セクション | 内容 |
|---|---|
| Header | バージョン情報やサイズなどのメタ情報 |
| String IDs | 文字列(関数名、変数名など)の一覧 |
| Type IDs | 使用されているデータ型情報 |
| Method IDs | 関数の定義情報(名前、型、引数など) |
| Class Definitions | 各クラスの詳細(アクセス修飾子、フィールド、メソッドなど) |
| Code Items | 実際のバイトコード |
この構造を知っておくと、逆コンパイルやバイナリ編集時にどこを見ればよいかがわかるようになります。
🔍 診断で注目すべきDex内のポイント
Dexファイルに含まれるコードや文字列には、以下のような診断対象が眠っている可能性があります:
✅ 1. ハードコードされた秘密情報
DexのString領域に「apikey」「secret」「password」などのキーワードがそのまま残っているケースがあります。
→ JadxやMobSFで strings.xml ではなく Dex内部の定数も確認しましょう。
✅ 2. 暗号アルゴリズムの使用
Dex内部に Cipher.getInstance("AES") や MessageDigest.getInstance("MD5") などの記述が含まれていると、暗号化の種類や使い方が可視化できます。
→ 安全でないアルゴリズム(MD5, DESなど)が使われていないか確認。
✅ 3. 不審なログ出力やデバッグ情報
Dex内に Log.d, System.out.println, android.util.Log などのログ出力コードが残っている場合、パスワードやトークンが平文で記録されている可能性があります。
→ 特に "password=" や "token=" といった出力がないか確認!
✅ 4. 不正な関数呼び出しやリフレクション
DexのMethod IDからは、以下のような不審な関数の使用も追跡可能です:
Class.forName()→ 動的なクラス読み込み(難読化や動的コード実行の兆候)invoke()→ リフレクションによる関数呼び出しRuntime.exec()→ 外部コマンド実行(OSコマンドインジェクションの可能性)
🧰 Dexの解析に使えるツール
| ツール名 | 主な用途 |
|---|---|
| Jadx | Dex → Java 逆コンパイル、GUIありで見やすい |
| MobSF | 自動でDex構造を解析し、脆弱性レポートを生成 |
| Baksmali / Smali | Dex → Smaliコード(中間表現)へ変換(より低レベル) |
| dexdump(Android SDK) | Dexファイルの構造情報を出力(CLIのみ) |
※ Smaliは「アセンブリ風のAndroid中間コード」で、より正確にDexを調べたいときに使います。
🛡️ 診断のポイントまとめ
| チェック項目 | 内容 |
|---|---|
| String領域に秘密情報が含まれていないか | APIキーやパスワードなど |
| 不適切な暗号APIが使われていないか | MD5やハードコードされた鍵など |
| 不要なログ出力やデバッグコードがないか | 実行ログやエラーメッセージ |
| 動的コード実行が行われていないか | Class.forName() や Runtime.exec() など |
✅ まとめ
- Dexファイルは、Androidアプリの最終的な実行コードの塊
- 静的診断では、Dexファイル内の文字列やメソッド情報を解析して隠れた脆弱性や秘密情報を特定する
- JadxやMobSFでコードベースを確認し、ハードコード・ログ・暗号処理・危険な呼び出しなどを網羅的にチェックしよう
Best regards, (^^ゞ