How to Identify Vulnerable Components in an Android App Using This Reverse Engineering Guide

You can identify vulnerable components in an Android app by decompiling the APK using the decompile.sh script and systematically analyzing the manifest, source code, and dependencies for hard-coded secrets, insecure network configurations, and dangerous permissions.

The Android Reverse Engineering skill provides a systematic workflow for transforming compiled binaries into readable source code to locate security-relevant artifacts. According to the SimoneAvogadro/android-reverse-engineering-skill repository, this guide implements a five-phase methodology that security researchers can use to uncover common vulnerable components ranging from exposed API keys to improper SSL certificate validation.

The Five-Phase Security Assessment Workflow

The complete methodology is documented in SKILL.md at plugins/android-reverse-engineering/skills/android-reverse-engineering/SKILL.md. Each phase builds upon the previous to create a comprehensive security audit.

Phase 1: Dependency Verification

Run check-deps.sh to ensure all decompilation tools are present and up-to-date. This script validates installations of jadx, Fernflower/Vineflower, and dex2jar.

Using current decompilers prevents incomplete code recovery that could hide vulnerable components behind obfuscated or malformed output.

Phase 2: Decompilation

Execute decompile.sh with your target engine (jadx, fernflower, or both) to generate complete Java or Kotlin sources. The script processes APK, XAPK, JAR, and AAR formats.

Complete source recovery is required to spot insecure permissions in the manifest and hard-coded secrets in application logic.

Phase 3: Structure Analysis

Inspect AndroidManifest.xml in the decompiled resources directory to identify requested permissions and exported components. Analyze the package layout to determine architectural patterns (MVP, MVVM, Clean).

This phase reveals risky permissions like INTERNET or WRITE_EXTERNAL_STORAGE and maps where networking code resides within the architecture.

Phase 4: Call-Flow Tracing

Starting from the launcher Activity or Application class, follow initialization chains through dependency injection modules to UI-to-network paths. Document how data flows from user input to remote endpoints.

Tracing execution paths exposes whether user input undergoes proper validation and whether TLS enforcement occurs consistently across network calls.

Phase 5: API and Vulnerability Extraction

Run find-api-calls.sh to identify Retrofit, OkHttp, and Volley endpoints. Supplement with targeted grep searches for insecure patterns including hard-coded URLs, API keys, and unsafe SSL implementations.

This produces a concise inventory of endpoints, credentials, and exploitable code patterns for remediation prioritization.

Detecting Specific Vulnerable Components

Apply these targeted searches after decompilation to locate specific security anti-patterns in the generated source code.

Hard-Coded Secrets and Credentials

Search for authentication tokens, API keys, and client secrets embedded directly in source files.

grep -rniE '(api[_-]?key|auth[_-]?token|bearer|authorization|client[_-]?secret|access[_-]?token)' <decompiled>/sources

While find-api-calls.sh includes basic auth patterns, tightening the regex captures proprietary or non-standard token naming conventions that automated scripts might miss.

Insecure HTTP and Clear-Text Traffic

Locate unencrypted endpoint URLs and unsafe HttpURLConnection usage that transmits data without TLS.

grep -rniE '"http://[^"]+"' <decompiled>/sources
grep -rniE 'openConnection\(\).*setRequestMethod\(' <decompiled>/sources

Clear-text HTTP exposes user data to interception, particularly dangerous for authentication endpoints or personal information transmission.

Improper Certificate Validation

Detect custom X509TrustManager implementations that accept all certificates or HostnameVerifier classes that bypass verification.

grep -rniE 'X509TrustManager.*checkServerTrusted' <decompiled>/sources
grep -rniE 'HostnameVerifier.*verify' <decompiled>/sources

Empty checkServerTrusted methods or permissive verify implementations allow man-in-the-middle attacks against otherwise TLS-protected connections.

WebView JavaScript Interface Exposure

Identify addJavascriptInterface calls that expose native Java or Kotlin objects to JavaScript without proper @JavascriptInterface annotations or input validation.

grep -rniE 'addJavascriptInterface\(' <decompiled>/sources

Unsecured JavaScript interfaces can allow remote code execution when malicious web content loads within the application's WebView.

Excessive or Dangerous Permissions

Review AndroidManifest.xml for permissions that exceed the application's core functionality requirements.

grep -nE '<uses-permission' <decompiled>/resources/AndroidManifest.xml

Permissions like WRITE_EXTERNAL_STORAGE, READ_PHONE_STATE, or SYSTEM_ALERT_WINDOW increase attack surface when requested without clear necessity.

Outdated Third-Party Libraries

Identify library version strings in Gradle files or dependency declarations to cross-reference against known CVE databases.

grep -rniE 'implementation|compile' <decompiled>/sources | grep -iE '(okhttp|retrofit|glide|guava)'

Libraries like OkHttp 3.12.0 or older Retrofit versions may contain documented vulnerabilities patched in subsequent releases.

SQL Injection in SQLite Usage

Locate raw execSQL calls that concatenate user input directly into SQL statements.

grep -rniE 'execSQL\([^"]*\+"' <decompiled>/sources

Dynamic SQL construction without parameterized queries enables data extraction or manipulation attacks against local databases.

End-to-End Workflow Example

Execute this complete session from your terminal after cloning the repository. Replace <path-to-apk> with your target Android package.


# 1️⃣ Verify required tools

bash plugins/android-reverse-engineering/skills/android-reverse-engineering/scripts/check-deps.sh

# 2️⃣ Decompile the APK using both engines for maximum coverage

OUTPUT_DIR=$(basename "<path-to-apk>" .apk)-decompiled
bash plugins/android-reverse-engineering/skills/android-reverse-engineering/scripts/decompile.sh \
  --engine both -o "$OUTPUT_DIR" "<path-to-apk>"

# 3️⃣ Analyze the manifest for risky permissions

echo "=== Permissions ==="
grep -nE '<uses-permission' "$OUTPUT_DIR/resources/AndroidManifest.xml"

# 4️⃣ Run the generic API-search script

bash plugins/android-reverse-engineering/skills/android-reverse-engineering/scripts/find-api-calls.sh \
  "$OUTPUT_DIR/sources"

# 5️⃣ Search for insecure HTTP URLs

echo "=== Hard-coded HTTP URLs ==="
grep -rniE '"http://[^"]+"' "$OUTPUT_DIR/sources"

# 6️⃣ Detect unsafe TrustManager implementations

echo "=== TrustManager that accepts all certs ==="
grep -rniE 'X509TrustManager.*checkServerTrusted' "$OUTPUT_DIR/sources"

# 7️⃣ Find WebView JavaScript interfaces

echo "=== WebView JavaScript interfaces ==="
grep -rniE 'addJavascriptInterface\(' "$OUTPUT_DIR/sources"

Generate a markdown report summarizing your findings for developer handoff:

cat <<'EOF' > vulnerability-report.md

## Vulnerable Components Detected

### 1. Hard-coded HTTP URL

- **File:** com/example/network/ApiClient.java:27
- **Snippet:** `"http://api.example.com/v1/login"`
- **Risk:** Clear-text transmission of credentials.

### 2. TrustManager that trusts all certificates

- **File:** com/example/security/UnsafeTrustManager.kt:12
- **Snippet:** `override fun checkServerTrusted(chain: Array<out X509Certificate>?, authType: String?) {}`
- **Risk:** Man-in-the-middle attacks.
EOF

Summary

  • The Android Reverse Engineering skill provides a structured five-phase workflow for decompiling APKs and locating vulnerable components.
  • Phase 1 uses check-deps.sh to ensure decompilers (jadx, Fernflower, dex2jar) are current, preventing incomplete code analysis.
  • Phase 2 executes decompile.sh to generate Java/Kotlin sources from APK, XAPK, JAR, or AAR files.
  • Phase 3 analyzes AndroidManifest.xml and architectural patterns to map risky permissions and networking code locations.
  • Phase 4 traces call flows from Activity or Application classes through DI modules to identify validation and TLS enforcement gaps.
  • Phase 5 runs find-api-calls.sh and targeted grep searches to extract hard-coded secrets, insecure HTTP endpoints, and unsafe SSL implementations.

Frequently Asked Questions

What file contains the master workflow documentation for this reverse engineering guide?

The master documentation resides in SKILL.md at plugins/android-reverse-engineering/skills/android-reverse-engineering/SKILL.md. This file defines the five-phase process from dependency verification through API extraction, serving as the authoritative reference for the security assessment workflow.

How does the decompilation script handle different Android package formats?

The decompile.sh script accepts APK, XAPK, JAR, and AAR files through the --engine flag supporting jadx, fernflower, or both options. Using both engines provides maximum coverage, as different obfuscation techniques may yield better results with one decompiler versus the other.

Which grep patterns detect the most critical vulnerability: custom TrustManager implementations?

Search for X509TrustManager alongside checkServerTrusted to identify certificate validation bypasses. The pattern grep -rniE 'X509TrustManager.*checkServerTrusted' locates implementations where the method body is empty or unconditionally accepts certificates, representing immediate man-in-the-middle vulnerabilities.

Can this workflow integrate with automated CI/CD security scanning?

Yes, the bash scripts return machine-readable status codes suitable for pipeline integration. You can automate check-deps.sh and decompile.sh in CI environments to perform regression testing on release builds, while the grep patterns from api-extraction-patterns.md can feed into static analysis tools for continuous vulnerability monitoring.

Have a question about this repo?

These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:

Share the following with your agent to get started:
curl -s "https://instagit.com/install.md"

Works with
Claude Codex Cursor VS Code OpenClaw Any MCP Client

Maintain an open-source project? Get it listed too →