reverse-engineering-android-malware-with-jadx について
JADXで不審なAndroid APKを調べるセキュリティ分析者向けのスキルです。権限や不正機能、C2通信を調査し、メタデータ抽出からIOC報告までを扱います。ネイティブの.so解析は対象外です。
主な機能
- 01APKのメタデータと権限の確認
- 02JADXによるコードのデコンパイル
- 03不正機能や攻撃パターンの検索
- 04C2通信とデータ窃取の追跡
- 05IOC分析レポートの作成
活用シーン
- 01バンキング型トロイのオーバーレイとSMS窃取の調査
- 02不正APKからのC2アドレスと設定の抽出
- 03権限の悪用とアプリによるデータ収集の評価
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ mukul975/ anthropic-cybersecurity-skills --skill reverse-engineering-android-malware-with-jadxインストール後、Claude Code で/reverse-engineering-android-malware-with-jadxを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
LICENSEreferences/api-reference.mdscripts/agent.py詳細
JADX を使用した Android マルウェアのリバースエンジニアリング
使用する場面
- 不審な Android APK が悪意のあるものとして報告された、またはモバイル脅威検知で検出された場合
- Android バンキング型トロイの木馬、スパイウェア、SMS 窃取ツール、アドウェアのサンプルを分析する場合
- アプリが収集するデータ、その送信先、悪用する権限を特定する場合
- Android マルウェアから C2 サーバーのアドレス、暗号化キー、設定データを抽出する場合
- バンキング型トロイの木馬が使用するオーバーレイ攻撃の仕組みを理解する場合
使用しないでください。APK 内の難読化されたネイティブ(.so)ライブラリを分析する場合は、ネイティブ ARM バイナリの分析に Ghidra または IDA を使用してください。
前提条件
- JADX 1.5 以降がインストールされていること(https://github.com/skylot/jadx/releases からダウンロード)
- APK の検査用に
aapt2とadbツールを含む Android SDK - smali コードやリソースを含む APK 全体の逆アセンブルに使用する apktool
- 自動 APK 分析用の
androguardライブラリを含む Python 3.8 以降 - 動的インストルメンテーション用の Frida(任意、実行時分析用)
- Google サービスを含まない隔離された Android エミュレーター(Genymotion または Android Studio AVD)
ワークフロー
ステップ 1:APK のメタデータと権限を抽出する
APK の構造と AndroidManifest.xml を調べます。
# Get APK basic info
aapt2 dump badging malware.apk
# Extract AndroidManifest.xml
apktool d malware.apk -o apk_extracted/ -f
# Analyze permissions with androguard
python3 << 'PYEOF'
from androguard.core.apk import APK
apk = APK("malware.apk")
print(f"Package: {apk.get_package()}")
print(f"App Name: {apk.get_app_name()}")
print(f"Version: {apk.get_androidversion_name()}")
print(f"Min SDK: {apk.get_min_sdk_version()}")
print(f"Target SDK: {apk.get_target_sdk_version()}")
# Dangerous permissions
dangerous_perms = {
"android.permission.READ_SMS": "SMS theft",
"android.permission.RECEIVE_SMS": "SMS interception",
"android.permission.SEND_SMS": "Premium SMS fraud",
"android.permission.READ_CONTACTS": "Contact harvesting",
"android.permission.READ_CALL_LOG": "Call log theft",
"android.permission.RECORD_AUDIO": "Audio surveillance",
"android.permission.CAMERA": "Camera surveillance",
"android.permission.ACCESS_FINE_LOCATION": "Location tracking",
"android.permission.READ_PHONE_STATE": "Device fingerprinting",
"android.permission.SYSTEM_ALERT_WINDOW": "Overlay attacks",
"android.permission.BIND_ACCESSIBILITY_SERVICE": "Full device control",
"android.permission.REQUEST_INSTALL_PACKAGES": "Sideloading apps",
"android.permission.BIND_DEVICE_ADMIN": "Device admin abuse",
}
print("\nDangerous Permissions:")
for perm in apk.get_permissions():
if perm in dangerous_perms:
print(f" [!] {perm}")
print(f" Risk: {dangerous_perms[perm]}")
elif "android.permission" in perm:
print(f" [*] {perm}")
# Components
print("\nActivities:")
for act in apk.get_activities():
print(f" {act}")
print("\nServices:")
for svc in apk.get_services():
print(f" {svc}")
print("\nReceivers:")
for rcv in apk.get_receivers():
print(f" {rcv}")
PYEOF
ステップ 2:JADX でデコンパイルする
Java/Kotlin ソースを分析するため、APK を JADX で開きます。
# Open in JADX GUI
jadx-gui malware.apk
# Command-line decompilation for scripted analysis
jadx -d jadx_output/ malware.apk --show-bad-code
# Decompile with all options
jadx -d jadx_output/ malware.apk \
--deobf \
--deobf-min 3 \
--deobf-max 64 \
--show-bad-code \
--threads-count 4
# The output directory structure:
# jadx_output/
# sources/ <- Decompiled Java source code
# com/malware/app/
# MainActivity.java
# C2Service.java
# SMSReceiver.java
# resources/ <- Decoded resources (layouts, strings, assets)
# AndroidManifest.xml
# res/
# assets/
ステップ 3:悪意のある機能を特定する
デコンパイルしたソース内で不審なコードパターンを検索します。
# Search for network communication
grep -rn "HttpURLConnection\|OkHttpClient\|Retrofit\|Volley\|URL(" jadx_output/sources/
# Search for SMS operations
grep -rn "SmsManager\|getDefault().sendTextMessage\|SMS_RECEIVED" jadx_output/sources/
# Search for overlay attack code
grep -rn "SYSTEM_ALERT_WINDOW\|TYPE_APPLICATION_OVERLAY\|WindowManager.LayoutParams" jadx_output/sources/
# Search for accessibility service abuse
grep -rn "AccessibilityService\|onAccessibilityEvent\|performAction" jadx_output/sources/
# Search for data exfiltration
grep -rn "getDeviceId\|getSubscriberId\|getSimSerialNumber\|getLine1Number" jadx_output/sources/
# Search for crypto operations (key storage, encryption)
grep -rn "SecretKeySpec\|Cipher.getInstance\|AES\|DES\|RSA" jadx_output/sources/
# Search for dynamic code loading
grep -rn "DexClassLoader\|PathClassLoader\|loadDex\|loadClass" jadx_output/sources/
# Search for obfuscated strings and decryption
grep -rn "Base64.decode\|decrypt\|decipher\|xor" jadx_output/sources/
ステップ 4:C2 通信を分析する
ネットワーク通信のロジックを追跡します。
# Automated C2 extraction from decompiled code
import os
import re
jadx_dir = "jadx_output/sources"
# Patterns for C2 URLs and IPs
url_pattern = re.compile(r'https?://[^\s"\'<>]+')
ip_pattern = re.compile(r'"(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})"')
base64_pattern = re.compile(r'"([A-Za-z0-9+/]{20,}={0,2})"')
urls = set()
ips = set()
b64_strings = set()
for root, dirs, files in os.walk(jadx_dir):
for fname in files:
if fname.endswith('.java'):
filepath = os.path.join(root, fname)
with open(filepath, 'r', errors='ignore') as f:
content = f.read()
for match in url_pattern.finditer(content):
urls.add(match.group())
for match in ip_pattern.finditer(content):
ips.add(match.group(1))
for match in base64_pattern.finditer(content):
b64_strings.add(match.group(1))
print("URLs found:")
for u in urls:
print(f" {u}")
print("\nIP addresses:")
for ip in ips:
print(f" {ip}")
# Decode Base64 strings
import base64
print("\nDecoded Base64 strings:")
for b64 in b64_strings:
try:
decoded = base64.b64decode(b64).decode('utf-8', errors='ignore')
if any(c.isprintable() for c in decoded) and len(decoded) > 3:
print(f" {b64[:30]}... -> {decoded[:100]}")
except:
pass
ステップ 5:ネイティブライブラリを調べる
追加の悪意のあるロジックが含まれている可能性のあるネイティブコードを確認します。
# List native libraries in the APK
unzip -l malware.apk | grep "\.so$"
# Extract native libraries
unzip malware.apk "lib/*" -d apk_native/
# Check native library properties
file apk_native/lib/armeabi-v7a/*.so
readelf -d apk_native/lib/armeabi-v7a/*.so | grep NEEDED
# Strings from native libraries
strings apk_native/lib/armeabi-v7a/libpayload.so | grep -iE "(http|url|key|encrypt|password)"
# For deep native analysis, import into Ghidra:
# File -> Import -> Select .so file -> Select ARM architecture
ステップ 6:分析内容を記録し、IOC を抽出する
Android マルウェア分析の包括的なレポートを作成します。
Analysis documentation should include:
- APK metadata (package name, version, signing certificate)
- Permission analysis with risk assessment
- Component analysis (activities, services, receivers, providers)
- Decompiled code walkthrough of malicious functions
- C2 communication protocol and endpoints
- Data exfiltration methods and targeted data types
- Persistence mechanisms (device admin, accessibility service)
- Evasion techniques (emulator detection, root detection)
- Extracted IOCs (C2 URLs, domains, IPs, signing certificate hash)
主な概念
| 用語 | 定義 |
|---|---|
| APK(Android パッケージ) | コンパイル済みの DEX バイトコード、リソース、マニフェスト、ネイティブライブラリを含む Android アプリケーションのパッケージ形式 |
| DEX バイトコード | コンパイル済みの Java/Kotlin コードを含む Dalvik Executable 形式。JADX はこれを読みやすい Java ソースに変換します |
| オーバーレイ攻撃 | SYSTEM_ALERT_WINDOW 権限を使用して正規のバンキングアプリの上に偽の UI レイヤーを表示し、認証情報を盗むバンキング型トロイの木馬の手口 |
| ユーザー補助サービスの悪用 | ユーザー補助サービスとして登録し、画面の内容を取得して操作を実行し、アンインストールを妨げるマルウェア |
| Smali | DEX バイトコードを人が読める形式で表現したもの。apktool が使用する、バイトコードと Java の中間表現 |
| 動的コード読み込み | DexClassLoader を使って実行時に追加の DEX コードを読み込み、静的分析から悪意のある機能を隠す手法 |
| デバイス管理者権限の悪用 | アンインストールを妨げ、デバイスのワイプを脅迫するため、デバイス管理者権限を要求するマルウェア |
ツールとシステム
- JADX:難読化解除をサポートし、Android APK 分析用の GUI と CLI を提供する、オープンソースの DEX から Java へのデコンパイラー
- apktool:Android APK ファイルを smali コードとデコード済みリソースにリバースエンジニアリングするツール
- androguard:権限、コンポーネント、コードの分析を含む、自動 Android APK 分析用の Python フレームワーク
- Frida:Android 上で実行時に Java メソッドやネイティブ関数をフックする動的インストルメンテーションツールキット
- MobSF(Mobile Security Framework):静的分析と動的分析を行う、自動モバイルアプリケーションセキュリティテスト用フレームワーク
よくあるシナリオ
シナリオ:Android バンキングトロイの分析
背景:特定の銀行の顧客を標的にしたSMSフィッシングを通じて、バンキングトロイのAPKが配布されています。標的の銀行、C2インフラ、データ窃取の仕組みを特定するため、サンプルを分析する必要があります。
アプローチ:
- APKのメタデータを抽出し、要求されている権限(SMS、アクセシビリティ、オーバーレイ、デバイス管理者)を特定します
- JADXで逆コンパイルし、銀行アプリのUIを模倣するオーバーレイアクティビティのクラスを検索します
- コード内でパッケージ名のリストを検索し、標的となる銀行アプリの一覧を特定します
- SMS傍受レシーバーを追跡し、2FAコードがどのように盗まれるかを調べます
- C2通信コードをたどり、サーバーURLとコマンドプロトコルを抽出します
- assets/ ディレクトリにウェブインジェクション設定ファイルがないか確認します
- すべてのIOCを抽出し、攻撃チェーン全体を記録します
注意点:
- 分析前にクラス名とメソッド名の難読化を解除しない(JADX --deobf フラグを使用します)
- インストール後にダウンロードされる動的ロードのDEXファイルを見落とす
- 実際のC2ロジックや暗号化処理が含まれている可能性がある、ネイティブの .so ライブラリを無視する
- 暗号化された設定やウェブインジェクションが含まれている可能性のある assets/ ディレクトリを見落とす
出力形式
ANDROID MALWARE ANALYSIS REPORT
==================================
APK File: update_bank.apk
Package: com.android.systemupdate
SHA-256: e3b0c44298fc1c149afbf4c8996fb924...
Version: 1.2.3
Min SDK: 21 (Android 5.0)
Signing Cert: SHA-256: abc123... (self-signed)
CLASSIFICATION
Family: Anubis Banking Trojan
Type: Banking Trojan / SMS Stealer / Keylogger
DANGEROUS PERMISSIONS
[!] RECEIVE_SMS - Intercepts incoming SMS (2FA theft)
[!] READ_SMS - Reads SMS messages
[!] SEND_SMS - Sends premium SMS
[!] SYSTEM_ALERT_WINDOW - Overlay attacks on banking apps
[!] BIND_ACCESSIBILITY - Full device control
[!] BIND_DEVICE_ADMIN - Prevents uninstallation
MALICIOUS COMPONENTS
Service: com.android.systemupdate.C2Service (C2 communication)
Receiver: com.android.systemupdate.SmsReceiver (SMS interception)
Activity: com.android.systemupdate.OverlayActivity (credential overlay)
TARGETED APPS (23 banking apps)
com.bank.example1, com.bank.example2, ...
C2 INFRASTRUCTURE
Primary: hxxps://c2-server[.]com/api/bot
Fallback: hxxps://backup-c2[.]net/api/bot
Protocol: HTTPS POST with JSON body
Bot ID: MD5(IMEI + Build.SERIAL)
EXTRACTED IOCs
Domains: c2-server[.]com, backup-c2[.]net
IPs: 185.220.101[.]42
URLs: hxxps://c2-server[.]com/api/bot
hxxps://c2-server[.]com/api/injects
Cert Hash: abc123def456...
コメント
Markdown 対応