| name | reverse-engineering-android-malware-with-jadx |
| description | 使用 JADX 反编译器对恶意 Android APK 文件进行逆向工程,分析 Java/Kotlin 源代码,识别包括数据窃取、C2 通信、权限提升和覆盖攻击在内的恶意功能。检查 Manifest 权限、Receiver、Service 及原生库。适用于 Android 恶意软件分析、APK 逆向工程、移动端恶意软件调查或 Android 威胁分析等请求。
|
| domain | cybersecurity |
| subdomain | malware-analysis |
| tags | ["malware","Android","reverse-engineering","JADX","mobile-malware"] |
| version | 1.0.0 |
| author | mahipal |
| license | Apache-2.0 |
使用 JADX 对 Android 恶意软件进行逆向工程
适用场景
- 可疑 Android APK 被报告为恶意软件或被移动威胁检测标记时
- 分析 Android 银行木马(Banking Trojan)、间谍软件(Spyware)、短信窃取器(SMS Stealer)或广告软件(Adware)样本时
- 确定应用收集哪些数据、将数据发送到何处以及滥用了哪些权限时
- 从 Android 恶意软件中提取 C2(Command & Control)服务器地址、加密密钥和配置数据时
- 了解银行木马使用的覆盖攻击(Overlay Attack)机制时
请勿使用:分析 APK 中混淆的原生 .so 库;请改用 Ghidra 或 IDA 进行原生 ARM 二进制分析。
前置条件
- JADX 1.5+(从 https://github.com/skylot/jadx/releases 下载)
- 安装了
aapt2 和 adb 工具的 Android SDK,用于 APK 检查
- apktool,用于完整的 APK 反汇编(包括 smali 代码和资源)
- Python 3.8+,安装
androguard 库用于自动化 APK 分析
- Frida,用于动态插桩(可选,用于运行时分析)
- 不含 Google 服务的隔离 Android 模拟器(Genymotion 或 Android Studio AVD)
工作流程
步骤 1:提取 APK 元数据和权限
检查 APK 结构和 AndroidManifest.xml:
aapt2 dump badging malware.apk
apktool d malware.apk -o apk_extracted/ -f
python3 << 'PYEOF'
from androguard.core.apk import APK
apk = APK("malware.apk")
print(f"包名: {apk.get_package()}")
print(f"应用名称: {apk.get_app_name()}")
print(f"版本: {apk.get_androidversion_name()}")
print(f"最低 SDK: {apk.get_min_sdk_version()}")
print(f"目标 SDK: {apk.get_target_sdk_version()}")
dangerous_perms = {
"android.permission.READ_SMS": "短信窃取",
"android.permission.RECEIVE_SMS": "短信拦截",
"android.permission.SEND_SMS": "高额短信欺诈",
"android.permission.READ_CONTACTS": "通讯录采集",
"android.permission.READ_CALL_LOG": "通话记录窃取",
"android.permission.RECORD_AUDIO": "音频监控",
"android.permission.CAMERA": "摄像头监控",
"android.permission.ACCESS_FINE_LOCATION": "位置追踪",
"android.permission.READ_PHONE_STATE": "设备指纹采集",
"android.permission.SYSTEM_ALERT_WINDOW": "覆盖攻击",
"android.permission.BIND_ACCESSIBILITY_SERVICE": "完全设备控制",
"android.permission.REQUEST_INSTALL_PACKAGES": "旁加载应用",
"android.permission.BIND_DEVICE_ADMIN": "设备管理员滥用",
}
print()
perm apk.get_permissions():
perm dangerous_perms:
(f)
(f)
perm:
(f)
()
act apk.get_activities():
(f)
()
svc apk.get_services():
(f)
()
rcv apk.get_receivers():
(f)
PYEOF
步骤 2:使用 JADX 反编译
在 JADX 中打开 APK 进行 Java/Kotlin 源代码分析:
jadx-gui malware.apk
jadx -d jadx_output/ malware.apk --show-bad-code
jadx -d jadx_output/ malware.apk \
--deobf \
--deobf-min 3 \
--deobf-max 64 \
--show-bad-code \
--threads-count 4
步骤 3:识别恶意功能
在反编译的源代码中搜索可疑代码模式:
grep -rn "HttpURLConnection\|OkHttpClient\|Retrofit\|Volley\|URL(" jadx_output/sources/
grep -rn "SmsManager\|getDefault().sendTextMessage\|SMS_RECEIVED" jadx_output/sources/
grep -rn "SYSTEM_ALERT_WINDOW\|TYPE_APPLICATION_OVERLAY\|WindowManager.LayoutParams" jadx_output/sources/
grep -rn "AccessibilityService\|onAccessibilityEvent\|performAction" jadx_output/sources/
grep -rn "getDeviceId\|getSubscriberId\|getSimSerialNumber\|getLine1Number" jadx_output/sources/
grep -rn "SecretKeySpec\|Cipher.getInstance\|AES\|DES\|RSA" jadx_output/sources/
grep -rn "DexClassLoader\|PathClassLoader\|loadDex\|loadClass" jadx_output/sources/
grep -rn "Base64.decode\|decrypt\|decipher\|xor" jadx_output/sources/
步骤 4:分析 C2 通信
追踪网络通信逻辑:
import os
import re
jadx_dir = "jadx_output/sources"
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("发现的 URL:")
for u in urls:
print(f" {u}")
print()
ip ips:
()
base64
()
b64 b64_strings:
:
decoded = base64.b64decode(b64).decode(, errors=)
(c.isprintable() c decoded) (decoded) > :
()
:
步骤 5:检查原生库
检查可能包含额外恶意逻辑的原生代码:
unzip -l malware.apk | grep "\.so$"
unzip malware.apk "lib/*" -d apk_native/
file apk_native/lib/armeabi-v7a/*.so
readelf -d apk_native/lib/armeabi-v7a/*.so | grep NEEDED
strings apk_native/lib/armeabi-v7a/libpayload.so | grep -iE "(http|url|key|encrypt|password)"
步骤 6:记录分析结果并提取 IOC
整理完整的 Android 恶意软件分析报告:
分析文档应包含:
- APK 元数据(包名、版本、签名证书)
- 权限分析及风险评估
- 组件分析(Activity、Service、Receiver、Provider)
- 恶意函数的反编译代码逐步说明
- C2 通信协议和端点
- 数据外泄方式和目标数据类型
- 持久化机制(设备管理员、无障碍服务)
- 规避技术(模拟器检测、Root 检测)
- 提取的 IOC(C2 URL、域名、IP、签名证书哈希)
核心概念
| 术语 | 定义 |
|---|
| APK(Android Package) | Android 应用包格式,包含编译后的 DEX 字节码、资源、Manifest 和原生库 |
| DEX 字节码 | Dalvik 可执行格式,包含编译后的 Java/Kotlin 代码;JADX 可将其还原为可读的 Java 源代码 |
| 覆盖攻击(Overlay Attack) | 银行木马技术,利用 SYSTEM_ALERT_WINDOW 权限在合法银行应用上显示假 UI 层以窃取凭证 |
| 无障碍服务滥用(Accessibility Service Abuse) | 恶意软件注册为无障碍服务,以捕获屏幕内容、执行操作并阻止卸载 |
| Smali | DEX 字节码的可读表示形式;apktool 使用的字节码与 Java 之间的中间表示 |
| 动态代码加载(Dynamic Code Loading) | 运行时使用 DexClassLoader 加载额外 DEX 代码,以对静态分析隐藏恶意功能 |
| 设备管理员滥用(Device Admin Abuse) | 恶意软件请求设备管理员权限,以阻止卸载并进行设备擦除威胁 |
工具与系统
- JADX:开源 DEX 到 Java 反编译器,支持 GUI 和 CLI,用于 Android APK 分析,具备反混淆功能
- apktool:用于将 Android APK 文件逆向工程为 smali 代码和解码资源
- androguard:用于自动化 Android APK 分析的 Python 框架,涵盖权限、组件和代码分析
- Frida:动态插桩工具包,用于在 Android 上运行时 hook Java 方法和原生函数
- MobSF(Mobile Security Framework):针对静态和动态分析的自动化移动应用安全测试框架
常见场景
场景:分析 Android 银行木马
背景:某银行木马 APK 通过短信钓鱼(SMS Phishing)传播,目标为特定银行的客户。需要分析以识别目标银行、C2 基础设施和数据窃取机制。
分析方法:
- 提取 APK 元数据,识别请求的权限(短信、无障碍服务、覆盖攻击、设备管理员)
- 使用 JADX 反编译,搜索模拟银行应用 UI 的覆盖 Activity 类
- 通过搜索代码中的包名列表,识别目标银行应用
- 追踪短信拦截 Receiver,了解如何窃取双因素认证(2FA)验证码
- 跟踪 C2 通信代码,提取服务器 URL 和命令协议
- 检查 assets/ 目录中的 Web 注入配置文件
- 提取所有 IOC,记录完整攻击链
常见陷阱:
- 分析前未对类名和方法名进行反混淆(应使用 JADX --deobf 标志)
- 遗漏安装后下载的动态加载 DEX 文件
- 忽略可能包含实际 C2 逻辑或加密例程的原生 .so 库
- 遗漏 assets/ 目录(可能包含加密配置或 Web 注入内容)
输出格式
Android 恶意软件分析报告
==================================
APK 文件: update_bank.apk
包名: com.android.systemupdate
SHA-256: e3b0c44298fc1c149afbf4c8996fb924...
版本: 1.2.3
最低 SDK: 21 (Android 5.0)
签名证书: SHA-256: abc123...(自签名)
分类结果
家族: Anubis 银行木马
类型: 银行木马 / 短信窃取器 / 键盘记录器
危险权限
[!] RECEIVE_SMS - 拦截传入短信(2FA 窃取)
[!] READ_SMS - 读取短信消息
[!] SEND_SMS - 发送高额短信
[!] SYSTEM_ALERT_WINDOW - 针对银行应用的覆盖攻击
[!] BIND_ACCESSIBILITY - 完全设备控制
[!] BIND_DEVICE_ADMIN - 阻止卸载
恶意组件
Service: com.android.systemupdate.C2Service(C2 通信)
Receiver: com.android.systemupdate.SmsReceiver(短信拦截)
Activity: com.android.systemupdate.OverlayActivity(凭证覆盖)
目标应用(共 23 款银行应用)
com.bank.example1, com.bank.example2, ...
C2 基础设施
主要服务器: hxxps://c2-server[.]com/api/bot
备用服务器: hxxps://backup-c2[.]net/api/bot
协议: HTTPS POST,请求体为 JSON
Bot ID: MD5(IMEI + Build.SERIAL)
提取的 IOC
域名: c2-server[.]com, backup-c2[.]net
IP: 185.220.101[.]42
URL: hxxps://c2-server[.]com/api/bot
hxxps://c2-server[.]com/api/injects
证书哈希: abc123def456...