使用C 修改Java方法/字节码

Modifying Java Methods/Bytecode in Runtime with C++

本文关键字:字节 方法 Java 修改 使用      更新时间:2023-10-16

我和我的一个朋友正在从事一个编码项目,我们遇到了一个小问题。我们基本上正在尝试使用C 在运行时修改Java方法/字节码。我只是好奇是否可能或可能如何。我们已经尝试使用JVMTI和JNI来实现这一目标,但是似乎您只能修改当前正在加载到JVM中的类。在流程运行时,我们将代码加载为DLL,因此我们无法执行此操作。我们还认为,组装可以通过实现这一目标来起作用。在下面可以看到一些我们试图做的事情的展示。

public boolean Method()
{
     boolean value = true;

     return value; //<- Value that we want to modify (in java)

}

jclass JVMUtilities::getClass(std::string clazzname) {
     jstring name = Wrapper::getJVMHook().getJNI()->NewStringUTF(clazzname.c_str());
     jobject classLoader = getclassloader();
     jmethodID mid = Wrapper::getJVMHook().getJNI()->GetMethodID(Wrapper::getJVMHook().getJNI()->GetObjectClass(classLoader), "findClass", "(Ljava/lang/String;)Ljava/lang/Class;");
     return (jclass)Wrapper::getJVMHook().getJNI()->CallObjectMethod(classLoader, mid, name);
     //This is the function we use for geting the class information in c++ including location
}

基本上是上面的,我们希望通过操纵字节代码将返回值更改为我们想要的内容。

有一个公共标准API可以做到这一点-JVM Ti redefineclasses和RetanSformClasses。