apktool について
Android のセキュリティ分析向けに、APK のデコード、調査、再構築を案内するスキルです。マニフェストやリソースの抽出、smali の確認、選択的なデコード、再パッケージ化に対応します。
主な機能
- 01マニフェストとリソースのデコード
- 02smali コードの抽出
- 03リソースまたはコードの選択的な除外
- 04変更した APK の再構築
活用シーン
- 01アプリの権限と公開コンポーネントの確認
- 02リソース内のキーや URL の検索
- 03smali によるセキュリティロジックの調査
- 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 は、他の分析ワークフローと組み合わせて活用できます。
-
APK → ネットワーク分析:
- リソースから API エンドポイントを抽出します
- 抽出した URL を curl/wget でテストします
- エンドポイントをネットワークテストツールに渡します
-
APK → 認証情報の発見:
- リソースからハードコードされた認証情報を見つけます
- IoT デバイスに対して認証情報をテストします
- onvifscan や他のデバイステストツールと組み合わせて使用します
-
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