如何在库*.so中找到本地方法的可执行代码?(安卓)

逆向工程 艾达 反编译 安卓 爪哇 图书馆
2021-06-29 15:50:35

我正在对 android 的移动应用程序进行逆向工程,我有一个问题如何在库 * .so 中找到本机方法的可执行代码。从代码的代码来看,void method(int i)调用了native方法但它不在库中的导出函数列表中!

我做了一个测试项目。事实是,当我们在 Java 代码中声明本地方法时,我们是这样写的:

extern "C"
JNIEXPORT jstring
JNICALL
Java_com_test_MainActivity_stringFromJNI(
        JNIEnv *env,
        jobject /* this */) {
    std::string hello = "Hello from C++";
    return env->NewStringUTF(hello.c_str());
}

在这种情况下,该方法将位于导出的库方法列表中。我不明白如何定义本机函数以使其在导出函数列表中不可见?以及如何查找此类函数的源代码?

1个回答

有两种不同的方式来定义 JNI 方法。最简单的方法是像在您看到的示例中一样为函数指定特殊名称。

然而,这不是必需的。JNI 方法也可以使用RegisterNatives方法动态注册这通常在名为 的函数中完成,该函数JNI_OnLoad将在加载库时自动调用。这让您基本上只需将函数指针表传递给 VM,因此这些方法甚至不必出现在符号表中的任何地方。事实上,理论上你可以在运行时写出代码并传递一个指向它的指针。