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

Форум по Javascript
Ответить
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 МБ.

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