Skip to main content
skill CX Codex

reverse-engineering-android-malware-with-jadx — Claude Code skill

A skill that walks the agent through a malicious Android APK: JADX decompilation, manifest review, and hunting for data theft and C2.

Install into Claude Code · Skills CLI (Vercel) All methods and platforms ↓
npx skills add mukul975/Anthropic-Cybersecurity-Skills --skill reverse-engineering-android-malware-with-jadx -a claude-code
Open on GitHub

What reverse-engineering-android-malware-with-jadx does

The skill lays out a fixed order of work on a suspect APK. First the agent pulls metadata and permissions: aapt2 dump badging, unpacking with apktool, and an androguard script that flags dangerous entries such as READ_SMS, SYSTEM_ALERT_WINDOW or BIND_ACCESSIBILITY_SERVICE. Then comes JADX decompilation, either in the GUI or as jadx -d jadx_output/ malware.apk --show-bad-code with deobfuscation enabled.

On the decompiled sources it supplies search patterns: network calls (HttpURLConnection, OkHttpClient, Retrofit), SMS sending, overlay code, accessibility service abuse, getDeviceId and getSubscriberId collection, dynamic class loading. A separate step extracts C2 URLs, IPs and Base64 strings from the sources with regexes.

You need JADX 1.5+, Android SDK with aapt2 and adb, apktool, Python 3.8+ with androguard, optionally Frida and an isolated emulator without Google services. One hard limit: obfuscated native .so libraries are out of scope — Ghidra or IDA handle those. That is worth checking before you drop an ARM binary into JADX.

What it helps with

  • list an APK's permissions and components before digging in
  • decompile Java and Kotlin from a flagged APK
  • find SMS sending and contact harvesting in code
  • pull C2 addresses and keys out of string constants
  • tell a banking trojan overlay from plain adware

Example prompts for the agent

  • analyze this APK: dump permissions and components, then decompile it in JADX
  • find network calls and SMS sending in the decompiled sources
  • collect every URL, IP and Base64 string from the sources — looks like C2

How to install reverse-engineering-android-malware-with-jadx

1Skills CLI (Vercel)

npx skills add mukul975/Anthropic-Cybersecurity-Skills --skill reverse-engineering-android-malware-with-jadx -a claude-code

2Manually: put the files in place

~/.claude/skills/reverse-engineering-android-malware-with-jadx/SKILL.md

Copy the whole skill folder; for one project use .claude/skills/reverse-engineering-android-malware-with-jadx/

Step by step, with commands for each platform: How to install skills in Claude Code: five ways

Questions about reverse-engineering-android-malware-with-jadx

How do I install reverse-engineering-android-malware-with-jadx in Claude?

Run npx skills add mukul975/Anthropic-Cybersecurity-Skills --skill reverse-engineering-android-malware-with-jadx -a claude-code. The skill lands at ~/.claude/skills/reverse-engineering-android-malware-with-jadx/SKILL.md.

What does reverse-engineering-android-malware-with-jadx do?

It guides the agent through APK analysis: metadata and permissions, JADX decompilation, then searches for data theft, overlays, accessibility abuse and C2 endpoints.

Can it analyze native .so libraries?

No. Obfuscated native libraries inside an APK need Ghidra or IDA; this skill targets Java and Kotlin code.

Source text

SKILL.md · Apache-2.0
---
name: reverse-engineering-android-malware-with-jadx
description: 'Reverse engineers malicious Android APK files using the JADX decompiler
  to read Java/Kotlin source, inspect manifest permissions, receivers, services, and
  native libraries, and identify data theft, C2 communication, privilege escalation,
  or overlay-attack behavior. Use when analyzing a suspected Android banking trojan,
  spyware, SMS stealer, or other flagged APK, or when investigating mobile malware
  or Android threats generally.

  '
domain: cybersecurity
subdomain: malware-analysis
tags:
- malware
- Android
- reverse-engineering
- JADX
- mobile-malware
version: 1.0.0
author: mahipal
license: Apache-2.0
nist_csf:
- DE.AE-02
- RS.AN-03
- ID.RA-01
- DE.CM-01
mitre_attack:
- T1027
- T1055
- T1140
- T1497
- T1068
---

# Reverse Engineering Android Malware with JADX

## When to Use

- A suspicious Android APK has been reported as malicious or flagged by mobile threat detection
- Analyzing Android banking trojans, spyware, SMS stealers, or adware samples
- Determining what data an app collects, where it sends it, and what permissions it abuses
- Extracting C2 server addresses, encryption keys, and configuration data from Android malware
- Understanding overlay attack mechanisms used by banking trojans

**Do not use** for analyzing obfuscated native (.so) libraries within APKs; use Ghidra or IDA for native ARM binary analysis.

## Prerequisites

- JADX 1.5+ installed (download from https://github.com/skylot/jadx/releases)
- Android SDK with `aapt2` and `adb` tools for APK inspection
- apktool for full APK disassembly including smali code and resources
- Python 3.8+ with `androguard` library for automated APK analysis
- Frida for dynamic instrumentation (optional, for runtime analysis)
- Isolated Android emulator (Genymotion or Android Studio AVD) without Google services

## Workflow

### Step 1: Extract APK Metadata and Permissions

Examine the APK structure and AndroidManifest.xml:

```bash
# 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
```

### Step 2: Decompile with JADX

Open the APK in JADX for Java/Kotlin source analysis:

```bash
# 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/
```

### Step 3: Identify Malicious Functionality

Search for suspicious code patterns in decompiled sources:

```bash
# 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/
```

### Step 4: Analyze C2 Communication

Trace the network communication logic:

```python
# 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
```

### Step 5: Examine Native Libraries

Check for native code that may contain additional malicious logic:

```bash
# 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
```

### Step 6: Document Analysis and Extract IOCs

Compile a comprehensive Android malware analysis report:

```
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)
```

## Key Concepts

| Term | Definition |
|------|------------|
| **APK (Android Package)** | Android application package format containing compiled DEX bytecode, resources, manifest, and native libraries |
| **DEX Bytecode** | Dalvik Executable format containing compiled Java/Kotlin code; JADX converts this back to readable Java source |
| **Overlay Attack** | Banking trojan technique displaying a fake UI layer over a legitimate banking app to steal credentials using SYSTEM_ALERT_WINDOW permission |
| **Accessibility Service Abuse** | Malware registering as an accessibility service to capture screen content, perform actions, and prevent uninstallation |
| **Smali** | Human-readable representation of DEX bytecode; intermediate representation between bytecode and Java used by apktool |
| **Dynamic Code Loading** | Loading additional DEX code at runtime using DexClassLoader to hide malicious functionality from static analysis |
| **Device Admin Abuse** | Malware requesting device administrator privileges to prevent uninstallation and perform device wipe threats |

## Tools & Systems

- **JADX**: Open-source DEX to Java decompiler providing GUI and CLI for Android APK analysis with deobfuscation support
- **apktool**: Tool for reverse engineering Android APK files to smali code and decoded resources
- **androguard**: Python framework for automated Android APK analysis including permission, component, and code analysis
- **Frida**: Dynamic instrumentation toolkit for hooking Java methods and native functions at runtime on Android
- **MobSF (Mobile Security Framework)**: Automated mobile application security testing framework for static and dynamic analysis

## Common Scenarios

### Scenario: Analyzing an Android Banking Trojan

**Context**: A banking trojan APK is distributed via SMS phishing targeting customers of a specific bank. The sample needs analysis to identify targeted banks, C2 infrastructure, and data theft mechanisms.

**Approach**:
1. Extract APK metadata and identify requested permissions (SMS, accessibility, overlay, device admin)
2. Decompile with JADX and search for overlay activity classes that mimic banking app UIs
3. Identify the list of targeted banking apps by searching for package name lists in the code
4. Trace the SMS interception receiver to understand how 2FA codes are stolen
5. Follow the C2 communication code to extract server URLs and command protocol
6. Check for web injection configuration files in assets/ directory
7. Extract all IOCs and document the complete attack chain

**Pitfalls**:
- Not deobfuscating class and method names before analysis (use JADX --deobf flag)
- Missing dynamically loaded DEX files downloaded after installation
- Ignoring native .so libraries that may contain the actual C2 logic or encryption routines
- Overlooking assets/ directory which may contain encrypted configuration or web injects

## Output Format

```
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...
```

© mahipal · Apache-2.0 · mukul975/Anthropic-Cybersecurity-Skills

Similar skills

Everything for Security →

From the same set89

testing-for-broken-access-control Guides testing of web apps and APIs for broken access control flaws under OWASP A01:2021. Useful during RBAC audits and multi-tenant data boundary checks. CX Codex +1 522installs analyzing-linux-audit-logs-for-intrusion Guides Linux intrusion investigations with auditd, ausearch, and aureport, configuring kernel audit rules and rebuilding attacker timelines. CX Codex +1 522installs exploiting-sql-injection-vulnerabilities Guides SQL injection testing across web applications during authorized security assessments. It helps audit database input handling and verify protection mechanisms. CX Codex +1 504installs analyzing-bootkit-and-rootkit-samples Analyzes bootkits and rootkits in MBR, VBR, and UEFI firmware. Use it when compromise signs remain after an OS reinstall. CX Codex +1 486installs testing-api-authentication-weaknesses Tests REST API authentication for bypasses, broken JWT implementations, and unprotected endpoints. Useful for security auditing before production. CX Codex +1 484installs analyzing-azure-activity-logs-for-threats Runs KQL queries against Azure Monitor activity and sign-in logs to surface suspicious admin operations and sign-in anomalies. CX Codex +1 471installs analyzing-indicators-of-compromise Scores IPs, domains, hashes, URLs and email artifacts for maliciousness, then sorts them into block, monitor or whitelist. CX Codex +1 466installs analyzing-campaign-attribution-evidence A skill that scores cyber-campaign evidence against competing hypotheses and returns a confidence level for attribution. Useful when an incident report has to defend its conclusion. CX Codex +1 464installs

Project sponsors

Companies that keep this analytics open
Gold sponsor

Impressions, clicks and code copies — open statistics. We keep the numbers public for the same reason NeBlask itself is public. Become a sponsor