Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Performs runtime dynamic analysis of Android applications using Frida, Objection, and Android Debug Bridge to observe application behavior during execution, intercept function calls, modify runtime values, and identify vulnerabilities that static analysis misses. Use when testing Android apps for runtime security flaws, hooking sensitive methods, bypassing client-side protections, or analyzing obfuscated applications. Activates for requests involving Android dynamic analysis, runtime hooking, Frida Android instrumentation, or live app behavior analysis.
.claude/skills/performing-dynamic-analysis-of-android-app/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-18 | ✗→✓ | ▲ Improved | — | — |
| case-01 | ✗→✓ | ▲ Improved | — | — |
| case-03 | ✓→✓ | = Same ✓ | — | — |
| case-22 | ✓→✓ | = Same ✓ | — | — |
| case-09 | ✓→✓ | = Same ✓ | — | — |
Use this skill when:
Do not use this skill on production environments without authorization -- dynamic instrumentation can alter app behavior and trigger security alerts.
frida-tools and objection packagesbash# Check device architecture adb shell getprop ro.product.cpu.abi # Output: arm64-v8a # Download matching Frida server from GitHub releases # https://github.com/frida/frida/releases # Push to device adb push frida-server-16.x.x-android-arm64 /data/local/tmp/frida-server adb shell chmod 755 /data/local/tmp/frida-server adb shell /data/local/tmp/frida-server & # Verify Frida connection frida-ps -U
bash# List all packages frida-ps -U -a # Attach Objection for high-level exploration objection --gadget com.target.app explore # List activities, services, receivers android hooking list activities android hooking list services android hooking list receivers # List loaded classes android hooking list classes android hooking search classes com.target.app
bash# Hook all methods of a class android hooking watch class com.target.app.auth.LoginManager # Hook specific method with argument dumping android hooking watch class_method com.target.app.auth.LoginManager.authenticate --dump-args --dump-return # Hook crypto operations android hooking watch class javax.crypto.Cipher --dump-args android hooking watch class java.security.MessageDigest --dump-args # Hook network calls android hooking watch class okhttp3.OkHttpClient --dump-args android hooking watch class java.net.URL --dump-args
javascript// hook_crypto.js - Intercept encryption/decryption operations Java.perform(function() { var Cipher = Java.use("javax.crypto.Cipher"); Cipher.doFinal.overload("[B").implementation = function(input) { var mode = this.getAlgorithm(); console.log("[Cipher] Algorithm: " + mode); console.log("[Cipher] Input: " + bytesToHex(input)); var result = this.doFinal(input); console.log("[Cipher] Output: " + bytesToHex(result)); return result; }; function bytesToHex(bytes) { var hex = []; for (var i = 0; i < bytes.length; i++) { hex.push(("0" + (bytes[i] & 0xFF).toString(16)).slice(-2)); } return hex.join(""); } });
bash# Execute custom Frida script frida -U -f com.target.app -l hook_crypto.js --no-pause
javascript// root_bypass.js - Common root detection bypass Java.perform(function() { // Bypass RootBeer library var RootBeer = Java.use("com.scottyab.rootbeer.RootBeer"); RootBeer.isRooted.implementation = function() { console.log("[RootBeer] isRooted() bypassed"); return false; }; // Bypass generic file-based root checks var File = Java.use("java.io.File"); var originalExists = File.exists; File.exists.implementation = function() { var path = this.getAbsolutePath(); var rootPaths = ["/system/app/Superuser.apk", "/system/xbin/su", "/sbin/su", "/system/bin/su", "/data/local/bin/su"]; if (rootPaths.indexOf(path) >= 0) { console.log("[Root] Blocked check for: " + path); return false; } return originalExists.call(this); }; // Bypass SafetyNet/Play Integrity try { var SafetyNet = Java.use("com.google.android.gms.safetynet.SafetyNetApi"); console.log("[SafetyNet] Class found - may need additional bypass"); } catch(e) {} });
javascript// network_monitor.js - Monitor all HTTP requests Java.perform(function() { // Hook OkHttp3 try { var OkHttpClient = Java.use("okhttp3.OkHttpClient"); var Interceptor = Java.use("okhttp3.Interceptor"); var Chain = Java.use("okhttp3.Interceptor$Chain"); console.log("[OkHttp] Monitoring network requests..."); var Request = Java.use("okhttp3.Request"); Request.url.implementation = function() { var url = this.url(); console.log("[OkHttp] URL: " + url.toString()); return url; }; } catch(e) { console.log("[OkHttp] Not found, trying HttpURLConnection"); } // Hook HttpURLConnection var URL = Java.use("java.net.URL"); URL.openConnection.overload().implementation = function() { console.log("[URL] Opening: " + this.toString()); return this.openConnection(); }; });
bash# Using Objection for quick extraction objection --gadget com.target.app explore # Dump Android Keystore entries android keystore list android keystore dump # Search heap for sensitive objects android heap search instances com.target.app.model.User android heap evaluate <handle> "JSON.stringify(clazz)" # Memory string search memory search "password" --string memory search "api_key" --string
| Term | Definition | |------|-----------| | Dynamic Instrumentation | Modifying application behavior at runtime by injecting code into the running process | | Method Hooking | Replacing or wrapping function implementations to intercept arguments and return values | | Frida Server | Daemon running on the target device that receives instrumentation commands from the host | | Dalvik/ART Runtime | Android runtime environments; Frida hooks at the ART level for Java/Kotlin methods | | Heap Inspection | Examining live objects in the application's memory heap to extract runtime data |
/proc/self/maps. Use Frida Gadget injection or custom server builds.a.b.c.d()). Use android hooking search classes to discover actual runtime names.Java.enumerateLoadedClasses() after app is fully initialized.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-18 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-12 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-14 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-03 | pass→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-01 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-22 | pass→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-09 | pass→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-15 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-13 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-11 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-04 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-07 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-20 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-10 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-19 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-05 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-23 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-21 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-17 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-16 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-02 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-08 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-06 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted. The headline lift of +9 percentage points is the difference between those two pass rates over the 23 comparable cases.
The per-case answers from this run were removed by the retention sweep, so the case table below shows the verdicts without the text either arm produced. The counts above were recorded at the time and are unaffected. Answers are now kept for 180 days.
Other measured skills in the registry, with their headline benchmark lift.