Reverse engineers Android malware APKs using JADX: analyzes decompiled Java/Kotlin code, Manifest permissions, Receivers/Services for data theft, C2 comms, overlays. For mobile threat analysis.
npx claudepluginhub killvxk/cybersecurity-skills-zhThis skill uses the workspace's default tool permissions.
- 可疑 Android APK 被报告为恶意软件或被移动威胁检测标记时
Reverse engineers malicious Android APKs using JADX to analyze decompiled Java/Kotlin code, permissions, services, and libraries for data theft, C2, and overlay attacks.
Reverse engineers Android APK malware using JADX to decompile Java/Kotlin code, identify data theft, C2 communication, privilege escalation, overlay attacks, and examine permissions/services.
Performs static analysis on Android APK malware using apktool for decompilation, jadx for Java source recovery, and androguard for permissions, manifest checks, suspicious APIs, and risk reports.
Share bugs, ideas, or general feedback.
请勿使用:分析 APK 中混淆的原生 .so 库;请改用 Ghidra 或 IDA 进行原生 ARM 二进制分析。
aapt2 和 adb 工具的 Android SDK,用于 APK 检查androguard 库用于自动化 APK 分析检查 APK 结构和 AndroidManifest.xml:
# 获取 APK 基本信息
aapt2 dump badging malware.apk
# 提取 AndroidManifest.xml
apktool d malware.apk -o apk_extracted/ -f
# 使用 androguard 分析权限
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("\n危险权限:")
for perm in apk.get_permissions():
if perm in dangerous_perms:
print(f" [!] {perm}")
print(f" 风险: {dangerous_perms[perm]}")
elif "android.permission" in perm:
print(f" [*] {perm}")
# 组件
print("\nActivity:")
for act in apk.get_activities():
print(f" {act}")
print("\nService:")
for svc in apk.get_services():
print(f" {svc}")
print("\nReceiver:")
for rcv in apk.get_receivers():
print(f" {rcv}")
PYEOF
在 JADX 中打开 APK 进行 Java/Kotlin 源代码分析:
# 在 JADX GUI 中打开
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
# 输出目录结构:
# jadx_output/
# sources/ <- 反编译的 Java 源代码
# com/malware/app/
# MainActivity.java
# C2Service.java
# SMSReceiver.java
# resources/ <- 解码后的资源(布局、字符串、assets)
# AndroidManifest.xml
# res/
# assets/
在反编译的源代码中搜索可疑代码模式:
# 搜索网络通信
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/
# 搜索无障碍服务(Accessibility Service)滥用
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/
追踪网络通信逻辑:
# 从反编译代码中自动提取 C2
import os
import re
jadx_dir = "jadx_output/sources"
# C2 URL 和 IP 的匹配模式
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("\nIP 地址:")
for ip in ips:
print(f" {ip}")
# 解码 Base64 字符串
import base64
print("\n解码的 Base64 字符串:")
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
检查可能包含额外恶意逻辑的原生代码:
# 列出 APK 中的原生库
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)"
# 如需深入分析原生代码,导入 Ghidra:
# File -> Import -> 选择 .so 文件 -> 选择 ARM 架构
整理完整的 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) | 恶意软件请求设备管理员权限,以阻止卸载并进行设备擦除威胁 |
背景:某银行木马 APK 通过短信钓鱼(SMS Phishing)传播,目标为特定银行的客户。需要分析以识别目标银行、C2 基础设施和数据窃取机制。
分析方法:
常见陷阱:
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...