使用C ++在运行时修改Java方法/字节码

时间:2017-09-29 00:38:22

标签: java c++ jvm bytecode-manipulation jvmti

我和我的一个朋友正在编写一个编码项目,我们遇到了一个小问题。我们本质上是在尝试使用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
}

基本上,我们希望通过操作字节代码将返回值更改为运行时期间的值。

1 个答案:

答案 0 :(得分:0)

有一个公共标准API可以执行此操作 - JVM TI RedefineClassesRetransformClasses

相关问题