L’interface est localisée ; les présentations et documents des Skills sont traduits automatiquement par IA dans votre langue. Le code, les commandes, chemins et termes techniques restent en version originale, et le document de l’auteur fait foi.
Explorer les Skills
Productivité · SKILL.md

reverse-engineering-android-malware-with-jadx

reverse-engineering-android-malware-with-jadx

使用 JADX 反编译器对恶意 Android APK 文件进行逆向工程,分析 Java/Kotlin 源代码,识别包括数据窃取、C2 通信、权限提升和覆盖攻击在内的恶意功能。检查 Manifest 权限、Receiver、Service 及原生库。适用于 Android 恶意软件分析、APK 逆向工程、移动端恶意软件调查或 Android 威胁分析等请求。

Independent GitHub snapshot · Automated classification · Original documentation governs

Documentation de la Skill

GitHub

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:

# 获取 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

步骤 2:使用 JADX 反编译

在 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/

步骤 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/

# 搜索无障碍服务(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/

步骤 4:分析 C2 通信

追踪网络通信逻辑:

# 从反编译代码中自动提取 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

步骤 5:检查原生库

检查可能包含额外恶意逻辑的原生代码:

# 列出 APK 中的原生库
unzip -l malware.apk | grep "\.soquot;

# 提取原生库
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 架构

步骤 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)恶意软件注册为无障碍服务,以捕获屏幕内容、执行操作并阻止卸载
SmaliDEX 字节码的可读表示形式;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 基础设施和数据窃取机制。

分析方法:

  1. 提取 APK 元数据,识别请求的权限(短信、无障碍服务、覆盖攻击、设备管理员)
  2. 使用 JADX 反编译,搜索模拟银行应用 UI 的覆盖 Activity 类
  3. 通过搜索代码中的包名列表,识别目标银行应用
  4. 追踪短信拦截 Receiver,了解如何窃取双因素认证(2FA)验证码
  5. 跟踪 C2 通信代码,提取服务器 URL 和命令协议
  6. 检查 assets/ 目录中的 Web 注入配置文件
  7. 提取所有 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...
Skills enregistrées