Dump DEX files from a running Android app for unpacking/deobfuscation. Activate when the user wants to unpack an Android APK, dump DEX from memory, extract decrypted DEX files, or defeat class-loading packing.
日本語の概要は準備中です。原文の説明を表示しています。
Generate Frida hook scripts using modern Frida API. Activate when the user wants to write Frida scripts, hook functions at runtime, trace calls or arguments or return values, intercept native or ObjC or Java methods, dump memory or exports, or handle native module load timing for Android and other targets.
インストールする前に、エージェントに与えられる指示の中身を確認できます。
Generate Frida instrumentation scripts for dynamic analysis, hooking, and runtime inspection.
Use Frida for:
The modern Frida CLI does not use --no-pause. A spawned process resumes after the script is loaded.
# Spawn and hook
frida -U -f com.example.app -l hook.js
# Attach to running process
frida -U com.example.app -l hook.js
# Attach by PID
frida -U -p 1234 -l hook.js
const mod = Process.getModuleByName("libssl.so");
mod.name;
mod.base;
mod.size;
mod.path;
const ptr = mod.getExportByName("SSL_read");
Process.enumerateModules();
mod.enumerateExports();
mod.enumerateImports();
const addr = Module.getExportByName(null, "open");
Interceptor.attach(ptr, {
onEnter(args) {
console.log("arg0:", args[0].toInt32());
console.log("arg1 str:", args[1].readUtf8String());
},
onLeave(retval) {
console.log("ret:", retval.toInt32());
}
});
Interceptor.replace(ptr, new NativeCallback(function (a0, a1) {
console.log("replaced");
return 0;
}, "int", ["pointer", "int"]));
const open = new NativeFunction(
Module.getExportByName(null, "open"),
"int",
["pointer", "int"]
);
const fd = open(Memory.allocUtf8String("/etc/hosts"), 0);
const cb = new NativeCallback(function (arg) {
console.log("called with:", arg);
return 0;
}, "int", ["int"]);
ptr(addr).readByteArray(size);
ptr(addr).readUtf8String();
ptr(addr).readU32();
ptr(addr).readPointer();
ptr(addr).writeByteArray(bytes);
ptr(addr).writeUtf8String("hello");
ptr(addr).writeU32(0x41414141);
const buf = Memory.alloc(256);
const str = Memory.allocUtf8String("hello");
Memory.scan(mod.base, mod.size, "48 89 5C 24 ?? 48 89 6C", {
onMatch(address, size) {
console.log("found at:", address);
},
onComplete() {}
});
if (ObjC.available) {
const hook = ObjC.classes.ClassName["- methodName:"];
Interceptor.attach(hook.implementation, {
onEnter(args) {
const selfObj = new ObjC.Object(args[0]);
const param = new ObjC.Object(args[2]);
console.log(selfObj.toString());
console.log(param.toString());
}
});
}
if (Java.available) {
Java.perform(function () {
const Activity = Java.use("android.app.Activity");
Activity.onCreate.implementation = function (bundle) {
console.log("onCreate called");
return this.onCreate(bundle);
};
});
}
When generating Frida scripts:
Process.getModuleByName() and mod.getExportByName().--no-pause.try/catch.hexdump() for binary inspection.Do not assume a target .so is already loaded.
Preferred order:
android_dlopen_ext or dlopen and install hooks when the target library loads.Process.findModuleByName() check for already-loaded modules.Use this helper by default:
function hookModuleLoad(moduleName, callback) {
const dlopen = Module.findGlobalExportByName("android_dlopen_ext")
|| Module.findGlobalExportByName("dlopen");
if (!dlopen) {
throw new Error("dlopen/android_dlopen_ext not found");
}
const hooked = new Set();
Interceptor.attach(dlopen, {
onEnter(args) {
this.path = args[0].isNull() ? null : args[0].readCString();
this.shouldHook = this.path && this.path.indexOf(moduleName) !== -1;
},
onLeave(retval) {
if (!this.shouldHook || retval.isNull()) {
return;
}
const mod = Process.findModuleByName(moduleName);
if (!mod) {
return;
}
const key = mod.base.toString();
if (hooked.has(key)) {
return;
}
hooked.add(key);
callback(mod);
}
});
}
Use it like this:
hookModuleLoad("libtarget.so", function (mod) {
const target = mod.getExportByName("target_export");
Interceptor.attach(target, {
onEnter(args) {
console.log("target_export called");
}
});
});
If the target may already be loaded, combine an immediate check with the load hook:
function hookNowOrOnLoad(moduleName, callback) {
const mod = Process.findModuleByName(moduleName);
if (mod) {
callback(mod);
return;
}
hookModuleLoad(moduleName, callback);
}
Use polling only as a fallback:
function hookWhenReady(moduleName, exportName, callbacks) {
const mod = Process.findModuleByName(moduleName);
if (mod) {
Interceptor.attach(mod.getExportByName(exportName), callbacks);
return;
}
const timer = setInterval(function () {
const loaded = Process.findModuleByName(moduleName);
if (!loaded) {
return;
}
clearInterval(timer);
Interceptor.attach(loaded.getExportByName(exportName), callbacks);
}, 100);
}
Notes:
android_dlopen_ext before dlopen.onLeave of dlopen/android_dlopen_ext is usually the right time to install hooks after constructors have run.System.loadLibrary, Runtime.loadLibrary0, dlsym, or RegisterNatives.Do not tell the user to hook .init, .init_array, constructors, or JNI_OnLoad blindly.
These are fragile points:
Before suggesting an init-stage hook:
Prefer this order:
RegisterNatives, dlsym, or the first real business functionJNI_OnLoad only if native registration or anti-debug setup happens there.init_array only if there is strong evidence that the critical logic is thereIf proposing an early init hook, state:
Bad advice:
// do not suggest this without a reason
Interceptor.attach(Module.findBaseAddress("libtarget.so").add(0x1234), ...);
Better advice:
If anti-debug logic is suspected inside the constructor chain, prefer observing or hooking the dispatcher first instead of attaching blindly to raw .init_array entries.
Useful higher-level targets include:
call_constructorscall_arrayWhy this is safer:
Recommended workflow:
call_constructors or call_array when availableOnly suggest call_constructors or call_array when:
Warn about these constraints:
Good guidance:
call_constructors or call_array if present, log the constructor targets, then move to the exact offending constructor.”Bad guidance:
.init_array entry and patch until it stops crashing.”console.log(args[0]);
console.log(args[0].toString());
console.log(hexdump(args[0], {
offset: 0,
length: 64,
header: true,
ansi: false
}));
まだレビューはありません。使ってみた感想をお寄せください。
概要と使いどころ
Dump DEX files from a running Android app for unpacking/deobfuscation. Activate when the user wants to unpack an Android APK, dump DEX from memory, extract decrypted DEX files, or defeat class-loading packing.
日本語の概要は準備中です。原文の説明を表示しています。
IDAPython and IDALib script reference for reverse engineering. Activate when the user needs to write IDAPython scripts in IDA, use IDALib for headless analysis, operate on IDB databases, debug with IDA, manipulate memory/registers, traverse functions/blocks/instructions, work with Hex-Rays decompiler API, handle obfuscation, or batch-process binaries.
日本語の概要は準備中です。原文の説明を表示しています。
Reconstruct data structures by analyzing memory access patterns across functions
日本語の概要は準備中です。原文の説明を表示しています。
Restore function symbols by analyzing code patterns, strings, constants, and cross-references
日本語の概要は準備中です。原文の説明を表示しています。
Dump Unity IL2CPP symbols from iOS/Android builds. Extract method names, addresses, and type info from IL2CPP binaries and global-metadata.dat, then generate IDA/Ghidra import scripts.
日本語の概要は準備中です。原文の説明を表示しています。
Debug and emulate specific code fragments or functions using the Unicorn engine. Activate when the user wants to emulate a function with Unicorn, trace binary execution without running the full program, decrypt or decode data by emulating the algorithm, or bypass environment dependencies (JNI, syscalls, libc) during emulation.
日本語の概要は準備中です。原文の説明を表示しています。