Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用C+在运行时修改Java方法/字节码+;_Java_C++_Jvm_Bytecode Manipulation_Jvmti - Fatal编程技术网

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

使用C+在运行时修改Java方法/字节码+;,java,c++,jvm,bytecode-manipulation,jvmti,Java,C++,Jvm,Bytecode Manipulation,Jvmti,我和我的一个朋友正在做一个编码项目,我们遇到了一个小问题。我们基本上试图在运行时使用C++修改java方法/字节码。我只是好奇这是否可能,或者它是如何可能的。我们已经尝试使用JVMTI和JNI来实现这一点,但似乎您只能修改当前加载到JVM中的类。我们在进程运行时将代码作为DLL加载,因此无法执行此操作。我们还认为,通过实现这一点,大会可能会起作用。下面可以看到我们正在尝试做的一些演示 public boolean Method() { boolean value = true;

我和我的一个朋友正在做一个编码项目,我们遇到了一个小问题。我们基本上试图在运行时使用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
}
公共布尔方法()
{
布尔值=真;
返回值;//NewStringUTF(clazzname.c_str());
jobject classLoader=getclassloader();
jmethodID=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);
//这是我们用于在C++中获取类信息的函数,包括位置
}

基本上,我们希望通过操作字节码来将返回值转换为运行时所需的值。

< P>有一个公共标准API来完成这一点。出于好奇,JVM TI和./P>如何知道C++代码的位置(地址)要修改?如何传递指针到这个位置?我添加了用于获取C++中的类信息的代码。简单的答案是Ya’。谢谢帮助,但是当我尝试使用Rechange类方法时,我注意到的是,它经常导致程序中的随机崩溃和故障。你认为使用重定义类时会发生同样的事情吗?@BigLenny这不是重传FormClass的问题,而是它的使用方式。当然,重定义类的不正确使用也可能导致do错误。使用<代码> -XQuest:Auth/<代码>选项以确保转换的类是有效的。感谢快速响应,我实际上使用了RealCeC类类来触发C++中的类FieleOrdHoover事件。现在我唯一需要弄清楚的是如何修改原始字节码。我可以用ClassFileLoadHook很好地处理它,但我需要一种方法来修改它。@BigLenny有
new\u class\u data
参数,它正好用于替换字节码。