为什么要获取Java层的函数在Dalvik中对应的Method数据结构呢?
因为要Hook Java层的某个函数,首先得获取该函数在Dalvik中对应的Method数据结构,然后修改其函数指针指向另外一个函数,从而达到Hook的效果。
首先提出一个猜想,Java层通过反射可以获取函数的Method,而这个Method是否和Dalvik中的Method是一回事呢?
新建一个工程来验证一下(工程下载地址)
分别通过三种方式来获取Method:通过反射、通过slot、通过函数签名。
首先新建一个类Test.class,如下
public class Test {
static {
System.loadLibrary("test");
}
public static void hello() {
Log.i("bush", "hello called");
}
public native static void showMethodFromReflect(Method method);
public native static void showMethodFromSlot(Class<?> clazz, int slot);
public native static void showMethodFromSig(Class<?> clazz, String methodName, String methodSig);
}
Native层的实现如下:
#include <jni.h>
#include <stdlib.h>
#define ANDROID_SMP 0
#include "Dalvik.h"
JNIEXPORT jint
JNI_OnLoad(JavaVM *vm, void *reserved) {
JNIEnv *env = NULL;
jint result = -1;
if (vm->GetEnv((void **) &env, JN