Shikata Ga Nai

Private? There is no such things.

第28回:Dexファイルの構造と診断ポイント

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, (^^ゞ