(JNI)获取Java方法&x27;具有GetMethodID的内存地址

(JNI)获取Java方法&x27;具有GetMethodID的内存地址,java,c++,jvm,java-native-interface,reverse-engineering,Java,C++,Jvm,Java Native Interface,Reverse Engineering,如何获取我拥有JNI MethodID的方法的内存位置 我想通过使用JNI来钩住或操纵Java方法,因为众所周知,JVM重新定位了这些方法,所以无法使用指向方法的静态指针 所以我使用C++和JNI从JVM中得到一个MeoODE。 MethodID可以强制转换为整数,即十六进制内存地址 我已经发现,在MethodID的内存位置,有一个指向堆地址的指针。此堆地址指向 “jvm.dll.53A14DE8方法:元数据:MetaspaceObj” (我的反向工具“ReClass.NET”就是这么说的) 因

如何获取我拥有JNI MethodID的方法的内存位置

我想通过使用JNI来钩住或操纵Java方法,因为众所周知,JVM重新定位了这些方法,所以无法使用指向方法的静态指针

所以我使用C++和JNI从JVM中得到一个MeoODE。 MethodID可以强制转换为整数,即十六进制内存地址

我已经发现,在MethodID的内存位置,有一个指向堆地址的指针。此堆地址指向

“jvm.dll.53A14DE8方法:元数据:MetaspaceObj”

(我的反向工具“ReClass.NET”就是这么说的)

因此jvm.dll.xxx方法得到了一些函数指针,但这些不是方法,因为它们由3个字节组成(太小)或太大(30条指令+)。 我要查找的方法只返回1.0的浮点值

这是ReClass.NET中的jvm.dll.xxx方法:


或者在没有JVMTI的情况下,有没有其他本机钩住/操纵Java方法的方法?

你不能像本机方法那样钩住Java方法,也就是说,直接在内存中替换机器代码

jmethodID
是对Java方法的不透明引用。它可以在不同的JVM中实现,甚至在同一JVM的不同版本中实现。例如,随着元空间的出现,
jmethodID
的内部表示在JDK 7和JDK 8之间发生了变化

现在,在HotSpot JVM中,
jmethodID
是指向元空间中
方法
结构的指针。它不是Java方法的代码,而是表示JVM中方法的内部结构

请注意,Java方法最初根本没有任何机器代码——相反,JVM解释其字节码。由于JIT编译、重新编译或去优化,方法的机器代码可能会出现、更改或完全消失。此外,一个方法可能同时具有多个JIT编译版本。这就是为什么传统的挂钩技术不能应用于Java方法。此外,一个方法可以内联到其他JIT编译的方法中,在这种情况下,
jmethodID
将毫无用处

然而,有一种用于操作Java方法的标准技术—Java方法。它可以通过标准API(即,和JVM TI的函数)获得

如果您使用的是JNI,那么也可以使用JVMTI函数。JVM TI即使在没有代理或特殊JVM参数的情况下也能工作;它可以从任何JNI上下文获得。例如,如何从
JNIEnv*
获取
jvmtiEnv*

JavaVM* vm;
(*env)->GetJavaVM(env, &vm);

jvmtiEnv* jvmti;
(*vm)->GetEnv(vm, (void**)&jvmti, JVMTI_VERSION_1_0);

您可以看看JNA()是如何获取回调地址的,为什么jvmti不呢?这是操作Java方法的正确方法(我想说,这是唯一的方法)。我试图通过获取方法的地址来找到另一种操作方法。JNA和JVM TI都打了补丁,会使我想要操作的东西崩溃。你说的“JVM TI打了补丁,会崩溃”是什么意思?这是标准JVM的基本部分,应该像JNI一样可用。Java方法可能有一个字节码地址和多个(可能为零)编译项。即使您将它们全部修补,这仍然不能保证行为会发生更改,因为该方法可能已经内联到其他一些已编译的方法中。后者尤其适用于“return1.0”这样的简单方法。在这种情况下,您必须找到该方法的所有调用站点,递归地修补它们,等等。。。理论上,这是可能的,但这是一个远远超出您最初问题的庞大研究。我不知道JNI中的JVMTI,谢谢。但这不是我需要的,因为这是可能的。这段视频中的家伙就是这样做的:问题是视频显示了我想要钩住方法的方式的结果,但它没有解释任何事情。@yungcxn事情是这样的。如果您想深入研究编译的Java方法的二进制代码,我建议从
-XX:+printsassembly
JVM选项开始-它将转储所有带有方法名称、地址等的JIT编译代码。。。我理解。我会像你说的那样做,但是你会如何在内存中找到这些方法实例呢?我不介意这有多困难,我有时间:)你有jni的jvmti资源吗?