mcpField
A
apktool

apktool

github.com/brownfinesecurityセキュリティ875530 回インストール21 週間前に更新
リポジトリ

apktool について

Android のセキュリティ分析向けに、APK のデコード、調査、再構築を案内するスキルです。マニフェストやリソースの抽出、smali の確認、選択的なデコード、再パッケージ化に対応します。

主な機能

  1. 01マニフェストとリソースのデコード
  2. 02smali コードの抽出
  3. 03リソースまたはコードの選択的な除外
  4. 04変更した APK の再構築

活用シーン

  1. 01アプリの権限と公開コンポーネントの確認
  2. 02リソース内のキーや URL の検索
  3. 03smali によるセキュリティロジックの調査
  4. 04アイコンやローカライズ文字列の抽出

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/brownfinesecurity/iothackbot --skill apktool

インストール後、Claude Code で/apktoolを入力して読み込まれたか確認します。

詳細

Apktool - Android APK の展開とリソース抽出

セキュリティ分析、脆弱性の発見、アプリ内部の理解を目的として、apktool を使った Android APK ファイルのリバースエンジニアリングを支援します。

ツールの概要

Apktool は、Android APK ファイルをリバースエンジニアリングするツールです。リソースをほぼ元の形式にデコードし、変更後に再ビルドできます。次の作業に欠かせません。

  • 読みやすい AndroidManifest.xml の抽出
  • リソース(XML レイアウト、文字列、画像)のデコード
  • DEX の smali コードへの逆アセンブル
  • アプリの構造と権限の分析
  • 変更した APK の再パッケージ化

前提条件

  • システムに apktool がインストールされていること
  • Java Runtime Environment(JRE)が必要です
  • 十分なディスク容量があること(展開後の APK は通常、元のサイズの 2~5 倍になります)
  • 出力ディレクトリへの書き込み権限があること

手順

1. APK の基本的な展開(最も一般的)

ユーザーから APK の展開、デコード、分析を依頼された場合:

標準的なデコードコマンド:

apktool d <apk-file> -o <output-directory>

例:

apktool d app.apk -o app-unpacked

強制上書きする場合(ディレクトリが存在するとき):

apktool d app.apk -o app-unpacked -f
2. 出力構造の確認

展開後、出力ディレクトリには次の内容が含まれます。

app-unpacked/
├── AndroidManifest.xml          # Readable manifest (permissions, components)
├── apktool.yml                  # Apktool metadata (version info, SDK levels)
├── original/                    # Original META-INF certificates
│   └── META-INF/
├── res/                         # Decoded resources
│   ├── layout/                  # XML layouts
│   ├── values/                  # Strings, colors, dimensions
│   ├── drawable/                # Images and drawables
│   └── ...
├── smali/                       # Disassembled DEX code (smali format)
│   └── com/company/app/        # Package structure
├── assets/                      # App assets (if present)
├── lib/                         # Native libraries (if present)
│   ├── arm64-v8a/
│   ├── armeabi-v7a/
│   └── ...
└── unknown/                     # Files apktool couldn't classify
3. 選択的なデコード(パフォーマンスの最適化)

リソースをスキップする(コード分析のみ):

apktool d app.apk -o app-code-only -r
# or
apktool d app.apk -o app-code-only --no-res
  • 処理が速くなります
  • smali コードとマニフェストのみを抽出します
  • コードロジックの分析だけが必要な場合に使用します

ソースコードをスキップする(リソース分析のみ):

apktool d app.apk -o app-resources-only -s
# or
apktool d app.apk -o app-resources-only --no-src
  • 処理が速くなります
  • リソースとマニフェストのみを抽出します
  • リソース、文字列、レイアウトだけが必要な場合に使用します
4. 一般的な分析タスク
A. AndroidManifest.xml の調査

マニフェストから、重要なセキュリティ情報を確認できます。

# After unpacking
cat app-unpacked/AndroidManifest.xml

確認する項目:

  • 権限:アプリがアクセスするデバイス機能やデータ
  • エクスポートされたコンポーネント:他のアプリからアクセスできるアクティビティ、サービス、レシーバー
  • インテントフィルター:アプリがシステムやアプリのインテントに応答する方法
  • バックアップ設定:android:allowBackup="true"(セキュリティリスク)
  • デバッグ可能フラグ:android:debuggable="true"(重大なセキュリティ問題)
  • ネットワークセキュリティ設定:カスタムの証明書ピンニング、クリアテキスト通信
  • 最小/ターゲット SDK バージョン:古いバージョンには脆弱性が存在する可能性があります

分析コマンドの例:

# Find all permissions
grep "uses-permission" app-unpacked/AndroidManifest.xml

# Find exported components
grep "exported=\"true\"" app-unpacked/AndroidManifest.xml

# Check if debuggable
grep "debuggable" app-unpacked/AndroidManifest.xml

# Find all activities
grep "android:name.*Activity" app-unpacked/AndroidManifest.xml
B. 文字列とリソースの抽出
# View all string resources
cat app-unpacked/res/values/strings.xml

# Search for API keys, URLs, credentials
grep -r "api" app-unpacked/res/values/
grep -r "http" app-unpacked/res/values/
grep -r "password\|secret\|key\|token" app-unpacked/res/values/

# Find hardcoded URLs in resources
grep -rE "https?://" app-unpacked/res/
C. Smali コードの分析

Smali は、逆アセンブルされた Dalvik バイトコードの形式です。

# Find specific class
find app-unpacked/smali -name "*Login*.smali"
find app-unpacked/smali -name "*Auth*.smali"

# Search for security-relevant code
grep -r "crypto\|encrypt\|decrypt" app-unpacked/smali/
grep -r "http\|https\|url" app-unpacked/smali/
grep -r "password\|credential\|token" app-unpacked/smali/

# Find native library usage
grep -r "System.loadLibrary" app-unpacked/smali/

# Find file operations
grep -r "openFileOutput\|openFileInput" app-unpacked/smali/

注:Smali は Java ソースよりも読みづらい形式です。分析を容易にするため、Java への逆コンパイルには jadx の使用を検討してください。

D. ネイティブライブラリの調査
# List native libraries
ls -lah app-unpacked/lib/

# Check architectures supported
ls app-unpacked/lib/

# Identify library types
file app-unpacked/lib/arm64-v8a/*.so

# Search for interesting strings in libraries
strings app-unpacked/lib/arm64-v8a/libnative.so | grep -i "http\|key\|password"
5. APK の再パッケージ化(ビルド)

リソースまたは smali コードを変更した後:

apktool b app-unpacked -o app-modified.apk

重要:再ビルドした APK は、インストール前に署名する必要があります。

# Generate keystore (one-time setup)
keytool -genkey -v -keystore my-release-key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias my-key-alias

# Sign APK
jarsigner -verbose -keystore my-release-key.jks app-modified.apk my-key-alias

# Verify signature
jarsigner -verify app-modified.apk

# Zipalign (optimization)
zipalign -v 4 app-modified.apk app-modified-aligned.apk
6. フレームワークの管理

システムアプリや、デバイスメーカーのフレームワークに依存するアプリの場合:

# Install framework
apktool if framework-res.apk

# List installed frameworks
apktool list-frameworks

# Decode with specific framework
apktool d -t <tag> app.apk

一般的なワークフロー

ワークフロー 1:セキュリティ分析
# 1. Unpack APK
apktool d target.apk -o target-unpacked

# 2. Examine manifest for security issues
cat target-unpacked/AndroidManifest.xml

# 3. Search for hardcoded credentials
grep -r "password\|api_key\|secret\|token" target-unpacked/res/

# 4. Check for debuggable flag
grep "debuggable" target-unpacked/AndroidManifest.xml

# 5. Find exported components
grep "exported=\"true\"" target-unpacked/AndroidManifest.xml

# 6. Examine network security config
cat target-unpacked/res/xml/network_security_config.xml 2>/dev/null
ワークフロー 2:IoT アプリの分析

IoT コンパニオンアプリの場合は、デバイスの通信に関する詳細を調べます。

# 1. Unpack APK
apktool d iot-app.apk -o iot-app-unpacked

# 2. Search for device endpoints
grep -rE "https?://[^\"']+" iot-app-unpacked/res/ | grep -v "google\|android"

# 3. Find API keys
grep -r "api\|key" iot-app-unpacked/res/values/strings.xml

# 4. Locate device communication code
find iot-app-unpacked/smali -name "*Device*.smali"
find iot-app-unpacked/smali -name "*Network*.smali"
find iot-app-unpacked/smali -name "*Api*.smali"

# 5. Check for certificate pinning
grep -r "certificatePinner\|TrustManager" iot-app-unpacked/smali/
ワークフロー 3:リソースのみを抽出
# Fast resource-only extraction
apktool d app.apk -o app-resources -s

# Extract app icon
cp app-resources/res/mipmap-xxxhdpi/ic_launcher.png ./

# Extract strings for localization
cat app-resources/res/values*/strings.xml

# Extract layouts for UI analysis
ls app-resources/res/layout/
ワークフロー 4:コードの簡易確認(リソースなし)
# Fast code-only extraction
apktool d app.apk -o app-code -r

# Analyze smali quickly
grep -r "http" app-code/smali/ | head -20
grep -r "password" app-code/smali/

出力形式

Apktool には出力形式のオプションが組み込まれていませんが、分析結果を次のようにまとめられます。

人が読みやすいレポートの場合:

# Generate analysis report
{
  echo "=== APK Analysis Report ==="
  echo "APK: app.apk"
  echo "Date: $(date)"
  echo ""
  echo "=== Permissions ==="
  grep "uses-permission" app-unpacked/AndroidManifest.xml
  echo ""
  echo "=== Exported Components ==="
  grep "exported=\"true\"" app-unpacked/AndroidManifest.xml
  echo ""
  echo "=== Package Info ==="
  grep "package=" app-unpacked/AndroidManifest.xml
} > apk-analysis-report.txt

IoTHackBot ツールとの連携

Apktool は、他の分析ワークフローと組み合わせて活用できます。

  1. APK → ネットワーク分析:

    • リソースから API エンドポイントを抽出します
    • 抽出した URL を curl/wget でテストします
    • エンドポイントをネットワークテストツールに渡します
  2. APK → 認証情報の発見:

    • リソースからハードコードされた認証情報を見つけます
    • IoT デバイスに対して認証情報をテストします
    • onvifscan や他のデバイステストツールと組み合わせて使用します
  3. APK → コード分析:

    • apktool で smali コードを抽出します
    • jadx で Java に逆コンパイルして読みやすくします
    • 両方のツールの調査結果を照合します

ベストプラクティス

1. まずマニフェストを確認する
apktool d app.apk -o app-unpacked
cat app-unpacked/AndroidManifest.xml | less

マニフェストは、その後の分析の道しるべになります。

2. 選択的デコードで高速化する
  • コードのみ:-r フラグ
  • リソースのみ:-s フラグ
  • すべてをデコード:フラグなし(デフォルト)
3. 体系的に検索する
# Create analysis script
cat > analyze.sh << 'EOF'
#!/bin/bash
APK_DIR="$1"
echo "[+] Searching for URLs..."
grep -rE "https?://" "$APK_DIR/res/" | grep -v "schema\|google\|android"
echo "[+] Searching for API keys..."
grep -ri "api.*key\|apikey" "$APK_DIR/res/"
echo "[+] Searching for secrets..."
grep -ri "secret\|password\|credential" "$APK_DIR/res/"
EOF
chmod +x analyze.sh
./analyze.sh app-unpacked
4. 調査結果を記録する

以下の項目を記録してください。

  • APK のパッケージ名とバージョン
  • 注意すべき権限
  • ハードコードされた認証情報/URL
  • エクスポートされたコンポーネント
  • セキュリティの設定ミス
5. Jadx と併用する

以下の 2 つのツールを併用してください。

  • Apktool:リソース、マニフェスト、詳細な smali の確認に使用します
  • Jadx:読みやすい Java ソースコードの確認に使用します

トラブルシューティング

問題:「brut.directory.DirectoryException: Framework」

解決策:フレームワークリソースをインストールしてください。

apktool if <framework-res.apk>
問題:リソースエラーでデコードに失敗する

解決策:--keep-broken-res フラグを使用してください。

apktool d app.apk -o output --keep-broken-res
問題:「入力ファイルが見つからないか、読み取りできません」

解決策:ファイルパスと権限を確認してください。

ls -l app.apk
file app.apk  # Should show "Zip archive data"
問題:メモリ不足エラー

解決策:Java ヒープサイズを増やしてください。

export _JAVA_OPTIONS="-Xmx2048m"
apktool d large-app.apk
問題:変更後にビルドに失敗する

解決策:smali/XML の構文を検証してください。

# Check for syntax errors
apktool b app-unpacked -o test.apk --use-aapt2
問題:再パッケージ後に APK をインストールできない

解決策:APK に署名してください。

jarsigner -verbose -keystore debug.keystore rebuilt.apk androiddebugkey

重要な注意事項

  • Apktool の実行には Java Runtime Environment(JRE)が必要です
  • デコードした APK は通常、元の APK の 2~5 倍のサイズになります
  • smali コードは Java ソースコードよりも冗長です(Java には jadx を使用してください)
  • APK ファイルは必ずコピーを使って作業し、オリジナルは使用しないでください
  • 再パッケージした APK は、インストール前に署名する必要があります
  • 難読化されたアプリによっては、クラス名やメソッド名を読み取れない場合があります
  • システムアプリでは、フレームワークのインストールが必要な場合があります

セキュリティと倫理

重要:自分が所有しているか、分析の許可を得ている APK のみを分析してください。

  • 知的財産権とライセンスを尊重してください
  • 脆弱性については、責任ある開示を行ってください
  • 許可なく変更した APK を配布しないでください
  • 利用規約と EULA を確認してください
  • 許可されたセキュリティテストと調査にのみ使用してください

成功の基準

apktool による分析が成功したといえるのは、以下の条件を満たす場合です。

  • APK がエラーなくデコードされている
  • AndroidManifest.xml が読み取り可能で、分析されている
  • リソースが抽出され、検索可能になっている
  • smali コードを確認できる
  • セキュリティに関わる調査結果が記録されている
  • 出力が明確なディレクトリ構造に整理されている
  • 必要に応じて変更内容を再パッケージできる

クイックリファレンス

# Decode (unpack)
apktool d <apk> -o <output-dir>

# Decode with force overwrite
apktool d <apk> -o <output-dir> -f

# Decode without resources (faster)
apktool d <apk> -o <output-dir> -r

# Decode without source (faster)
apktool d <apk> -o <output-dir> -s

# Build (repack)
apktool b <unpacked-dir> -o <output-apk>

# Install framework
apktool if <framework.apk>

# Empty framework cache
apktool empty-framework-dir

コメント