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