Frida is the most powerful tool in the Android pentesting toolkit. This cheatsheet covers everything from basic method hooking to complex native code interception, organized for quick reference during engagements.
Setup
# Install Python client pip install frida-tools
# Download frida-server for device architecture # https://github.com/frida/frida/releases # Match version exactly between client and server!
# Push and start server adb push frida-server /data/local/tmp/frida-server adb shell "chmod +x /data/local/tmp/frida-server" adb shell "/data/local/tmp/frida-server &"
# Verify connection frida-ps -U # list processes frida-ps -Uai # list all installed apps
Attaching to a Process
# By package name (attach to running process) frida -U -n com.target.app -l script.js
# Spawn app (start fresh, script runs before any Java code) frida -U -f com.target.app -l script.js --no-pause
# By PID frida -U -p 1234 -l script.js
# Interactive REPL (no script) frida -U -n com.target.app
// List methods of a class var clazz = Java.use('com.target.app.AuthManager'); var methods = clazz.class.getDeclaredMethods(); methods.forEach(function(m) { console.log(m.getName() + ' → ' + m.getReturnType()); }); });
Hooking All Methods of a Class
Java.perform(function() { varClassName = Java.use('com.target.app.SomeClass'); var methods = ClassName.class.getDeclaredMethods();
methods.forEach(function(method) { var name = method.getName(); try { ClassName[name].overloads.forEach(function(overload) { overload.implementation = function() { var args = Array.prototype.slice.call(arguments); console.log('[*] ' + name + '(' + args.join(', ') + ')'); return overload.apply(this, arguments); }; }); } catch(e) {} }); });
Native Function Hooking
// Hook by export name var malloc = Module.findExportByName("libc.so", "malloc"); Interceptor.attach(malloc, { onEnter: function(args) { var size = args[0].toInt32(); // console.log('malloc(' + size + ')'); }, onLeave: function(retval) { // retval is the pointer returned } });
// Hook by address var addr = Module.findBaseAddress("libtarget.so").add(0x1234); Interceptor.attach(addr, { onEnter: function(args) { console.log('Hit function at 0x1234'); console.log('arg0: ' + args[0].readUtf8String()); } });
// Replace function entirely Interceptor.replace(addr, newNativeCallback(function(a, b) { return1; }, 'int', ['int', 'int']));
Memory Operations
// Read string from pointer var ptr = ptr("0xdeadbeef"); console.log(ptr.readUtf8String()); console.log(ptr.readByteArray(16)); // read 16 bytes
// Write to memory Memory.writeByteArray(ptr, [0x41, 0x42, 0x43]);
# List all activities frida -U -n com.target.app -e "Java.perform(function(){Java.use('android.app.ActivityThread').currentApplication().getPackageManager().getPackageInfo('com.target.app',8).activities.forEach(function(a){send(a.name);});})"
No comments yet. Be the first.