javavm

脑洞型so加载过程实验

人走茶凉 提交于 2020-11-02 16:37:34
1.文章难易度【★★★★★】 2.文章作者:penguin_wwy 3.本文参与 i春秋社区 原创文章奖励计划,未经许可禁止转载 4.阅读基础:熟悉Android虚拟机源码、so加载过程、Native编程 【预备~~~起】 前几天有人在群里问,ELF的可执行文件能不能调用so文件的JNI_OnLoad函数。这倒是一个有脑洞的想法,我尝试了一夜,就把尝试的过程记录下来。 【一二三四】 先从理论上分析一下可能性,对于so文件我们在代码里是可以dlopen函数打开,然后dlsym函数定位so文件中的函数地址执行调用的。也就是说只要我们可以解决参数问题,调用so文件中的任意函数都是可以的。 JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* vm, void* reserved); 这是jni.h中JNI_OnLoad函数的声明,对于第二个参数我们可以不管。第一个参数是一个虚拟机实例。在正常的APK调用so的过程中,Java层会将自己的JavaVM传递到JNI_OnLoad中,通过JavaVM对象中的函数表中的GetEnv,可以获得JNIEnv对象,JNIEnv对象的函数表中保存了我们在编写so代码中经常用到的函数如NewStringUTF,该函数接受一个char *字符串转化为jstring字符串。也就是说