function
hook_RegisterNatives() {
var
RegisterNatives_addr =
null
;
var
symbols = Process.findModuleByName(
"libart.so"
).enumerateSymbols();
for
(
var
i = 0; i < symbols.length; i++) {
var
symbol = symbols[i].name;
if
((symbol.indexOf(
"CheckJNI"
) == -1) && (symbol.indexOf(
"JNI"
) >= 0)) {
if
(symbol.indexOf(
"RegisterNatives"
) >= 0) {
RegisterNatives_addr = symbols[i].address;
console.log(
"RegisterNatives_addr: "
, RegisterNatives_addr);
}
}
}
Interceptor.attach(RegisterNatives_addr, {
onEnter:
function
(args) {
var
env = args[0];
var
jclass = args[1];
var
class_name = Java.vm.tryGetEnv().getClassName(jclass);
var
methods_ptr = ptr(args[2]);
var
method_count = args[3].toInt32();
console.log(
"RegisterNatives method counts: "
, method_count);
for
(
var
i = 0; i < method_count; i++) {
var
name = methods_ptr.add(i * Process.pointerSize * 3).readPointer().readCString();
var
sig = methods_ptr.add(i * Process.pointerSize * 3 + Process.pointerSize).readPointer().readCString();
var
fnPtr_ptr = methods_ptr.add(i * Process.pointerSize * 3 + Process.pointerSize * 2).readPointer();
var
find_module = Process.findModuleByAddress(fnPtr_ptr);
console.log(
"类: "
, class_name,
"方法: "
, name,
"签名: "
, sig,
"函数地址: "
, fnPtr_ptr,
"模块名: "
, find_module.name,
"函数偏移: "
, ptr(fnPtr_ptr).sub(find_module.base));
}
},
onLeave:
function
(retval) {}
});
}
hook_RegisterNatives()