About frida-android-hooks
frida-android-hooks is a skill for instrumenting Android Java, Kotlin, and JNI behavior with Frida. It covers setup, hook patterns, discovery, and investigation of common Android security checks.
Key features
- 01Frida setup and process selection
- 02Java method and constructor hooks
- 03Class-loader and method discovery
- 04TLS and integrity-check investigation
Use cases
- 01Inspect app behavior at startup or runtime
- 02Trace callers through Java stack traces
- 03Investigate obfuscated or dynamically loaded classes
- 04Examine TLS trust and pinning paths
Install
Copy the command and run it in a terminal.
$
npx skills add https:/ / github.com/ rudra-ravi/ frida-skills --skill frida-android-hooksAfter installing, type/frida-android-hooksin Claude Code to confirm it loaded.
Bundled filesagents/openai.yamlreferences/android-patterns.md
Details
From the project READMEFrida Android Hooks
Use this skill when instrumenting Android Java/Kotlin/JNI behavior.
Setup Checks
- Verify host and device versions match:
frida --version adb shell /data/local/tmp/frida-server --version frida-ps -Uai - Use spawn for early initialization:
frida -U -f com.example.app -l agent.js --no-pause - Use attach for behavior reachable after app startup:
frida -U -n com.example.app -l agent.js
Java Hook Pattern
Java.perform(() => {
const Target = Java.use("com.example.Target");
Target.method.overload("java.lang.String").implementation = function (value) {
console.log("[Target.method]", value);
const result = this.method(value);
console.log("[Target.method] ->", result);
return result;
};
});
Android Rules
- Always hook inside
Java.perform()unless only native APIs are used. - Resolve overloads explicitly. Do not rely on ambiguous method names.
- Hook constructors through
$init. - For Kotlin, expect companion classes, synthetic methods, default-argument helpers, and obfuscated names.
- If a class is not found, inspect class loaders and set
Java.classFactory.loaderto the app loader that can see it. - For native methods, bridge to
frida-native-hooksafter identifying the loaded.soand JNI symbol.
Practitioner Patterns
- For obfuscated code, hook meaningful platform boundaries first: URL/request builders, JSON parsers, Base64, crypto, SharedPreferences, keystore, file I/O, WebView, class loading, and native library loading.
- Log Java stack traces on high-signal hooks to find the app-owned caller before writing app-specific hooks.
- Convert byte arrays deliberately. Print both hex and UTF-8/ASCII only when valid; binary crypto material is often not text.
- Hook reflection and dynamic loading when classes appear late:
Class.forName,ClassLoader.loadClass,DexClassLoader,PathClassLoader, andRuntime.loadLibrary*. - For TLS/pinning, identify the actual stack before bypassing: OkHttp/CertificatePinner, TrustManager, Conscrypt, WebView, Flutter/BoringSSL, or native custom validation.
- For root/emulator/integrity bypasses, avoid blind mega-scripts as the final answer. Use them to reveal checks, then keep the smallest hooks that change the target behavior.
Discovery Snippets
Java.perform(() => {
const groups = Java.enumerateMethods("*crypto*!*/isu");
console.log(JSON.stringify(groups, null, 2));
});
Java.perform(() => {
Java.enumerateClassLoaders({
onMatch(loader) {
try {
Java.classFactory.loader = loader;
Java.use("com.example.Target");
console.log("loader:", loader);
} catch (_) {}
},
onComplete() {}
});
});
Pinning and Auth Work
- Treat public bypass snippets as reconnaissance, not final proof.
- Identify the actual trust path: platform trust manager, OkHttp, Conscrypt, WebView, native TLS, custom signature, or backend challenge.
- Log inputs/outputs before replacing trust decisions.
- Preserve evidence: hooked class, stack trace, endpoint, certificate or hash material observed, and app version.
References
Read references/android-patterns.md for overload, constructor, class-loader, JNI, OkHttp, WebView, and spawn timing patterns.
Comments
Markdown supported