Frida Interceptor не запускает метод JNI, зарегистрированный через регистрации (Libnative-lib.so)C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Frida Interceptor не запускает метод JNI, зарегистрированный через регистрации (Libnative-lib.so)

Сообщение Anonymous »

Я анализирую приложение для Android, которое использует собственные методы с помощью общей библиотеки Libnative-Lib.so. Вот соответствующий код Java: < /p>
static {
System.loadLibrary("native-lib");
}

public final native byte[] f(Context context, String m5);

public final native String m(Context context, int p02, int p12);
< /code>
После декомпиляции libnative-lib.so с использованием ghidra я обнаружил только один экспортированный символ: jni_onload (). Никаких символов для f () или m () не присутствовало, что заставило меня подозревать, что собственные методы динамически зарегистрированы через регистрации.undefined4 JNI_OnLoad(long *param_1) {
...

iVar2 = (**(code **)(*local_40 + 0x6b8))(local_40, lVar3, &DAT_001cc108, 5);
...

}
< /code>
Я скопировал сценарий FRIDA, чтобы занять регистрации и извлечь имена и адреса зарегистрированных нативных методов: < /p>
let addrRegisterNatives = null;
Process.enumerateModules().forEach(function (m) {
Module.enumerateSymbolsSync(m.name).forEach(function (s) {
if (s.name.includes("RegisterNatives") && (!s.name.includes("CheckJNI"))) {
console.log(m.name, s.name);
addrRegisterNatives = s.address;
}
});
});

setTimeout(() => {
Interceptor.attach(addrRegisterNatives, {
onEnter: function (args) {
var nMethods = parseInt(args[3]);
console.log("\n[+] env->RegisterNatives()");
console.log("\tNumber of methods:", nMethods);

var class_name = Java.vm.tryGetEnv().getClassName(args[1]);
console.log("\tClass name:", class_name);
var methods_ptr = ptr(args[2]);

for (var i = 0; i < nMethods; i++) {
var base = methods_ptr.add(i * Process.pointerSize * 3);
var methodName = Memory.readCString(Memory.readPointer(base));
var sig = Memory.readCString(Memory.readPointer(base.add(Process.pointerSize)));
var fnPtr = Memory.readPointer(base.add(Process.pointerSize * 2));
console.log(`\t\tMethod: ${methodName}, Signature: ${sig}, Address: ${fnPtr}`);
}
}
});
}, 2000);
< /code>
Это успешно регистрирует имена методов f () и m (), их подписи и указатели функций.

setTimeout(() => {
Java.perform(function () {
const NATIVE_OFFSET = 0x14610c; // offset from base
const libName = "libnative-lib.so";
const libBase = Module.findBaseAddress(libName);
if (libBase) {
const nativeFuncPtr = libBase.add(NATIVE_OFFSET);
Interceptor.attach(nativeFuncPtr, {
onEnter: function (args) {
console.log("[+] Native m() called!");
console.log(`arg1 (this): ${args[0]}`);
console.log(`arg2 (context): ${args[1]}`);
},
onLeave: function (retval) {
console.log(`[+] Native m() returned: ${retval}`);
}
});
} else {
console.error(`[-] Could not find ${libName}`);
}
});
}, 5000);
< /code>
Но нет вывода вообще не напечатано - даже не начальный оператор журнала. Я уверен, что метод вызывается во время выполнения.

Подробнее здесь: https://stackoverflow.com/questions/796 ... rnatives-l
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»