本文共 1343 字,大约阅读时间需要 4 分钟。
其中jni_CallStaticVoidMethod执行了静态方法,最后执行到了
static void jni_invoke_static(JNIEnv *env, JavaValue* result, jobject receiver, JNICallType call_type, jmethodID method_id, JNI_ArgumentPusher *args, TRAPS)methodHandle method(THREAD, Method::resolve_jmethod_id(method_id));void JavaCalls::call_helper(JavaValue* result, methodHandle* m, JavaCallArguments* args, TRAPS)
但其实非静态也调用了JavaCalls::call_helper函数。
如果hook掉的化,我们就能获取java进程执行的调用序列。 method对象有个name_and_sig_as_C_string,可以获取调用序列的名称。这里进行组合,其实效果和栈序列差不多,也可做很多的事情。这里让我想到了xposed的逻辑,https://blog.csdn.net/bme314/article/details/104892514
dvmCallMethodV
dvmIsNativeMethod(method)判断是本地方法还是java方法,java方法用dvmInterpret(self, method, pResult);执行。
本地方法用(method->nativeFunc)((u4)self->interpSave.curFrame, pResult, method, self);hook框架修改了dvmCallMethodV,把java方法全部修改到SET_METHOD_FLAG(method, ACC_NATIVE),增加了一段中间代码,根据java method的函数签名,会先加载自定义的module,判断其中是否添加了hook模块,如果有就执行,没有就简单的恢复原来的java代码。
其实这里似乎也可以做这样的东西。
可以在void JavaCalls::call_helper里面做,加载自定义的模块并执行,然后再恢复原来的执行逻辑,效果是一样的。不过并没有找到本地方法和java方法直接判断的代码,因为到了call_helper里面,直接会执行StubRoutines::call_stub(), 这就是解释器了好像,但是并不影响代码劫持。