android-reverse-engineering — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited android-reverse-engineering (Plugin) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Author: incogbyte
Claude Code skill that automates Android application reverse engineering. Decompiles APK, XAPK, AAB, DEX, JAR, and AAR files, extracts HTTP endpoints (Retrofit, OkHttp, Volley, GraphQL, WebSocket), traces call flows, analyzes security patterns, documents discovered APIs, and performs adaptive dynamic analysis with Frida — generating custom bypass scripts based on static analysis findings and iterating through crash logs to defeat runtime protections (RASP, root detection, SSL pinning, anti-tamper).
PreferenceActivity with missing/permissive isValidFragment)PreferenceActivity subclasses with missing or permissive isValidFragment() overrides, plus dynamic fragment instantiation driven by Intent extras, and provides an adb + Frida confirmation playbook| Tool | Minimum version | Purpose |
|---|---|---|
| Java JDK | 17+ | Runtime for jadx and Fernflower |
| jadx | any | Primary decompiler (APK/DEX/JAR/AAR to Java) |
| Tool | Purpose |
|---|---|
| Vineflower (Fernflower fork) | Higher quality decompilation for lambdas, generics, and complex Java code |
| dex2jar | Convert DEX to JAR (required to use Fernflower with APKs/DEX files) |
| bundletool | Convert AAB (App Bundle) to APK for decompilation |
| apktool | Resource decoding (XML, drawables) when jadx fails |
| adb | Extract APKs directly from a connected Android device |
| Tool | Purpose |
|---|---|
| Python 3.8+ | Runtime for frida-tools (installed in a venv, never globally) |
| adb | Communication with device/emulator |
| frida-server | Runs on the Android device/emulator (the skill detects if you already have it) |
| frida-tools | Client-side Frida CLI — auto-installed in a venv matching your server version |
The skill includes a script that automatically detects the OS and package manager:
# Check what is installed and what is missing
bash scripts/check-deps.sh
# Install dependencies individually (detects brew/apt/dnf/pacman)
bash scripts/install-dep.sh java
bash scripts/install-dep.sh jadx
bash scripts/install-dep.sh vineflower
bash scripts/install-dep.sh dex2jar
bash scripts/install-dep.sh bundletoolThe script installs without sudo when possible (local download to ~/.local/). When sudo is needed, it asks for confirmation. If it cannot install, it prints manual instructions.
The Frida setup is handled by a dedicated script that detects your existing environment first before changing anything:
# Detect everything: device, frida-server version, create matching venv
bash scripts/setup-frida.sh
# If frida-server is not on the device, auto-download and push it:
bash scripts/setup-frida.sh --install-serverWhat setup-frida.sh does:
/data/local/tmp/frida-server and running processes on the device~/.local/share/frida-re/venv — frida-tools is never installed globallyfrida-ps -U to verify everything worksIf you already have frida-server on your device (most users do), the script just creates the venv and matches the client version. No unnecessary reinstalls.
#### Manual Frida installation
# 1. Create venv (always use a venv, never install globally)
python3 -m venv ~/.local/share/frida-re/venv
# 2. Check your frida-server version on device
adb shell /data/local/tmp/frida-server --version
# 3. Install matching frida-tools
~/.local/share/frida-re/venv/bin/pip install frida-tools==<server-version>
# 4. Verify
~/.local/share/frida-re/venv/bin/frida-ps -U#### Manual installation
Java JDK 17+:
# macOS
brew install openjdk@17
# Ubuntu/Debian
sudo apt install openjdk-17-jdk
# Fedora
sudo dnf install java-17-openjdk-devel
# Arch
sudo pacman -S jdk17-openjdkjadx:
# macOS/Linux (Homebrew)
brew install jadx
# Or download directly from GitHub:
# https://github.com/skylot/jadx/releases/latest
# Extract and add bin/ to PATHVineflower (Fernflower fork):
# macOS (Homebrew)
brew install vineflower
# Or download the JAR:
# https://github.com/Vineflower/vineflower/releases/latest
# Save the JAR and set:
export FERNFLOWER_JAR_PATH="$HOME/vineflower/vineflower.jar"dex2jar:
# macOS (Homebrew)
brew install dex2jar
# Or download:
# https://github.com/pxb1988/dex2jar/releases/latest
# Extract and add to PATHbundletool:
# macOS (Homebrew)
brew install bundletool
# Or download the JAR:
# https://github.com/google/bundletool/releases/latest
# Save and set:
export BUNDLETOOL_JAR_PATH="$HOME/bundletool/bundletool.jar"In Claude Code, add the marketplace and install:
/plugin marketplace add incogbyte/android-reverse-engineering-claude-skill
/plugin install android-reverse-engineering@android-reverse-engineering-claude-skillgit clone https://github.com/incogbyte/android-reverse-engineering-claude-skill.gitIn Claude Code, add the local marketplace and install:
/plugin marketplace add /path/to/android-reverse-engineering-claude-skill
/plugin install android-reverse-engineering@android-reverse-engineering-claude-skillLoad the plugin directly for the current session:
claude --plugin-dir /path/to/android-reverse-engineering-claude-skill/plugins/android-reverse-engineering/decompile path/to/app.apkRuns the full flow: checks dependencies, decompiles, and analyzes the app structure.
The skill activates automatically with phrases like:
The scripts can be used directly outside of Claude Code:
# Decompile with jadx (default)
bash scripts/decompile.sh app.apk
# Decompile XAPK (extracts and decompiles each internal APK)
bash scripts/decompile.sh app-bundle.xapk
# Decompile AAB (uses bundletool to extract universal APK)
bash scripts/decompile.sh app-bundle.aab
# Decompile DEX file directly
bash scripts/decompile.sh classes.dex
# Decompile with Fernflower (better for JARs)
bash scripts/decompile.sh --engine fernflower library.jar
# Decompile with both engines and compare
bash scripts/decompile.sh --engine both --deobf app.apk
# Decompile code only (no resources, faster)
bash scripts/decompile.sh --no-res app.apk
# Search for API calls in decompiled code (all patterns)
bash scripts/find-api-calls.sh output/sources/
# Search with context lines for better readability
bash scripts/find-api-calls.sh output/sources/ --context 3
# Search for Retrofit endpoints only
bash scripts/find-api-calls.sh output/sources/ --retrofit
# Search for hardcoded URLs only
bash scripts/find-api-calls.sh output/sources/ --urls
# Search for authentication patterns
bash scripts/find-api-calls.sh output/sources/ --auth
# Search for Kotlin coroutines/Flow patterns
bash scripts/find-api-calls.sh output/sources/ --kotlin
# Search for RxJava patterns
bash scripts/find-api-calls.sh output/sources/ --rxjava
# Search for GraphQL queries/mutations
bash scripts/find-api-calls.sh output/sources/ --graphql
# Search for WebSocket connections
bash scripts/find-api-calls.sh output/sources/ --websocket
# Security audit (cert pinning, exposed secrets, debug flags, crypto)
bash scripts/find-api-calls.sh output/sources/ --security
# Fragment Injection scan (exported PreferenceActivity, isValidFragment status)
bash scripts/find-fragment-injection.sh output/ --report fragment-injection-report.md
# Full analysis with Markdown report, context, and deduplication
bash scripts/find-api-calls.sh output/sources/ --context 3 --dedup --report report.md
# --- Dynamic Analysis (Frida) ---
# Setup Frida environment (detect device, create venv, match versions)
bash scripts/setup-frida.sh
# Setup + auto-install frida-server on device if missing
bash scripts/setup-frida.sh --install-server
# Launch app and capture crash diagnostics (before any hooks)
bash scripts/adb-crash-capture.sh -p com.example.app
# Launch with longer monitoring window and save logs
bash scripts/adb-crash-capture.sh -p com.example.app -t 20 -o ./crash-logs/
# Run a Frida script against an app (spawn mode)
bash scripts/frida-run.sh -p com.example.app -l bypass.js
# Run with early hook (pause on spawn, hook before app code runs)
bash scripts/frida-run.sh -p com.example.app -l bypass.js --pause
# Run inline JavaScript
bash scripts/frida-run.sh -p com.example.app -e "Java.perform(function() { console.log('hooked'); })"
# Attach to already running app
bash scripts/frida-run.sh -p com.example.app -l analysis.js --attach
# Run with timeout and save output
bash scripts/frida-run.sh -p com.example.app -l bypass.js -t 60 --output-dir ./frida-output/| Option | Description |
|---|---|
-o <dir> | Output directory (default: <name>-decompiled) |
--deobf | Enable deobfuscation (renames obfuscated classes/methods) |
--no-res | Skip resource decoding (faster) |
--engine ENGINE | jadx (default), fernflower, or both |
| Option | Description |
|---|---|
--retrofit | Search only for Retrofit annotations |
--okhttp | Search only for OkHttp patterns |
--volley | Search only for Volley patterns |
--urls | Search only for hardcoded URLs |
--auth | Search only for auth-related patterns |
--kotlin | Search only for Kotlin coroutines/Flow patterns |
--rxjava | Search only for RxJava patterns |
--graphql | Search only for GraphQL patterns |
--websocket | Search only for WebSocket patterns |
--security | Search only for security patterns (cert pinning, secrets, debug flags, crypto) |
--all | Search all patterns (default) |
--context N | Show N lines of context around matches |
--dedup | Deduplicate results by endpoint/URL |
--report FILE | Export results as structured Markdown report |
| Option | Description |
|---|---|
-s, --serial SERIAL | Target specific device by serial |
--install-server | Download and push frida-server to device if missing |
--venv-dir DIR | Custom venv directory (default: ~/.local/share/frida-re) |
| Option | Description |
|---|---|
-p, --package PKG | Target package name (required) |
-l, --load FILE | JavaScript file to load (required, or use -e) |
-e, --eval CODE | Inline JavaScript to execute |
-t, --timeout SECS | Max seconds to run (default: 30, 0=unlimited) |
--attach | Attach to running process instead of spawning |
--pause | Pause app on spawn (hooks run before any app code) |
-s, --serial SERIAL | Target specific device |
--output-dir DIR | Save stdout/stderr/crash logs to directory |
| Option | Description |
|---|---|
-p, --package PKG | Target package name (required) |
-a, --activity ACT | Specific activity to launch (default: auto-detect) |
-t, --time SECS | Monitor window in seconds (default: 10) |
-s, --serial SERIAL | Target specific device |
-o, --output-dir DIR | Save logs to directory |
-v, --verbose | Include full logcat output |
| Scenario | Recommended engine |
|---|---|
| First pass on any APK/AAB | jadx (faster, decodes resources) |
| JAR/AAR library analysis | fernflower (better Java output) |
| jadx has warnings or broken code | both (compare and pick the best per class) |
| Complex lambdas, generics, streams | fernflower |
| Quick overview of a large APK | jadx --no-res |
| DEX file analysis | jadx (native support) or fernflower (via dex2jar) |
Unlike tools that ship generic bypass scripts, this skill uses Claude as the intelligence layer. The approach:
Static Analysis → Find protections in code
↓
Launch app → Crash? → Read crash logs
↓ ↓
No crash Cross-reference with
(skip to analysis) decompiled source
↓ ↓
Runtime analysis Generate targeted hook
(traffic, crypto, ↓
method tracing) Run with Frida → New crash?
↓ ↓
Success Repeat (next check)This approach handles RASP, root detection, SSL pinning, anti-tamper, and Frida detection — because it doesn't rely on known signatures. It reads the actual code and adapts.
android-reverse-engineering-claude-skill/
├── .claude-plugin/
│ └── marketplace.json
├── plugins/
│ └── android-reverse-engineering/
│ ├── .claude-plugin/
│ │ └── plugin.json
│ ├── skills/
│ │ └── android-reverse-engineering/
│ │ ├── SKILL.md
│ │ ├── references/
│ │ │ ├── setup-guide.md
│ │ │ ├── jadx-usage.md
│ │ │ ├── fernflower-usage.md
│ │ │ ├── api-extraction-patterns.md
│ │ │ ├── call-flow-analysis.md
│ │ │ ├── firebase-google-api-testing.md
│ │ │ └── android-fragment-injection.md
│ │ └── scripts/
│ │ ├── check-deps.sh
│ │ ├── install-dep.sh
│ │ ├── decompile.sh
│ │ ├── find-api-calls.sh
│ │ ├── find-firebase-config.sh
│ │ ├── find-fragment-injection.sh
│ │ ├── test-firebase-google.sh
│ │ ├── setup-frida.sh
│ │ ├── frida-run.sh
│ │ └── adb-crash-capture.sh
│ ├── tests/
│ │ ├── run_tests.sh
│ │ └── fixtures/ # synthetic decompiled apps
│ └── commands/
│ └── decompile.md
├── LICENSE
└── README.mdThe detection scripts use bash heuristics that are easy to silently break (manifest parsing, isValidFragment classification, targetSdkVersion gating, AndroidX dynamic-load correlation). A committed fixture suite guards them:
bash plugins/android-reverse-engineering/tests/run_tests.shFixtures under tests/fixtures/ are synthetic decompiled apps covering: vulnerable / legacy (targetSdk < 19) / broken (missing + targetSdk ≥ 19) / safe (whitelist) / AndroidX (modern preference API + dynamic load) / clean / minified single-line manifest, plus Firebase config present and minified, and a no-Firebase control. Add a fixture + assertion whenever you touch a detector.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.