Jvm 有没有一种软更改Java版本的方法?
我有一个旧的应用程序,它拒绝在未测试的Java版本上启动。不幸的是,它是一个废弃软件,所以更新的机会很小。它抱怨JVM是由Oracle而不是Sun制造的 在MS DOS时代,有一个Jvm 有没有一种软更改Java版本的方法?,jvm,Jvm,我有一个旧的应用程序,它拒绝在未测试的Java版本上启动。不幸的是,它是一个废弃软件,所以更新的机会很小。它抱怨JVM是由Oracle而不是Sun制造的 在MS DOS时代,有一个setver命令,允许用户设置应用程序看到的操作系统版本,是否有类似于JVM上的版本?我将使用OpenJDK项目中的命令将文件分解为字节码汇编格式。 例如,helloworld如下所示(jdis NameOfClass.class>NameOfClass.j): 然后你可以用Java正常运行它 这只是一个例子 您只需找
setver
命令,允许用户设置应用程序看到的操作系统版本,是否有类似于JVM上的版本?我将使用OpenJDK项目中的命令将文件分解为字节码汇编格式。
例如,helloworld如下所示(jdis NameOfClass.class>NameOfClass.j
):
然后你可以用Java正常运行它
这只是一个例子
您只需找到具有检查版本的方法的类。例如,您可以解压jar文件,例如,如果不匹配版本的消息是,例如:
“检测到错误版本:”
您只需对它进行grep(grep-rbad.version
)即可获得该类。
在这里,您必须更改负责检查Java版本的方法
例如:
A.java:
public class A{
static boolean hasMatchingJavaVersion() {
return System.getProperty("java.version").matches("1.4.*");//Just Java 1.4
}
public static void main(String[] args) {
if(hasMatchingJavaVersion()) {
System.out.println("Matches");
} else {
System.out.println("Bad version");
System.exit(-1);
}
}
}
运行它:false
(例如,在Java15上)
作为大会
super public class A
version 59:0
{
public Method "<init>":"()V"
stack 1 locals 1
{
aload_0;
invokespecial Method java/lang/Object."<init>":"()V";
return;
}
static Method hasMatchingJavaVersion:"()Z"
stack 2 locals 0
{
ldc String "java.version";
invokestatic Method java/lang/System.getProperty:"(Ljava/lang/String;)Ljava/lang/String;";
ldc String "1.4.*";
invokevirtual Method java/lang/String.matches:"(Ljava/lang/String;)Z";
ireturn;
}
public static Method main:"([Ljava/lang/String;)V"
stack 2 locals 1
{
invokestatic Method hasMatchingJavaVersion:"()Z";
ifeq L17;
getstatic Field java/lang/System.out:"Ljava/io/PrintStream;";
ldc String "Matches";
invokevirtual Method java/io/PrintStream.println:"(Ljava/lang/String;)V";
goto L29;
L17: stack_frame_type same;
getstatic Field java/lang/System.out:"Ljava/io/PrintStream;";
ldc String "Bad version";
invokevirtual Method java/io/PrintStream.println:"(Ljava/lang/String;)V";
iconst_m1;
invokestatic Method java/lang/System.exit:"(I)V";
L29: stack_frame_type same;
return;
}
} // end Class A
例如,您可以将其更改为:
static Method hasMatchingJavaVersion:"()Z"
stack 2 locals 0
{
iconst_1;//Load true, always return true
ireturn;
}
然后用jasm
再次编译它
编辑:
该JVM由Oracle而不是Sun制造
我读得太多了,但它的工作方式与上面描述的相同,只是另一个系统属性和一些其他小更改
public class A{
static boolean hasMatchingJavaVersion() {
return System.getProperty("java.version").matches("1.4.*");//Just Java 1.4
}
public static void main(String[] args) {
if(hasMatchingJavaVersion()) {
System.out.println("Matches");
} else {
System.out.println("Bad version");
System.exit(-1);
}
}
}
super public class A
version 59:0
{
public Method "<init>":"()V"
stack 1 locals 1
{
aload_0;
invokespecial Method java/lang/Object."<init>":"()V";
return;
}
static Method hasMatchingJavaVersion:"()Z"
stack 2 locals 0
{
ldc String "java.version";
invokestatic Method java/lang/System.getProperty:"(Ljava/lang/String;)Ljava/lang/String;";
ldc String "1.4.*";
invokevirtual Method java/lang/String.matches:"(Ljava/lang/String;)Z";
ireturn;
}
public static Method main:"([Ljava/lang/String;)V"
stack 2 locals 1
{
invokestatic Method hasMatchingJavaVersion:"()Z";
ifeq L17;
getstatic Field java/lang/System.out:"Ljava/io/PrintStream;";
ldc String "Matches";
invokevirtual Method java/io/PrintStream.println:"(Ljava/lang/String;)V";
goto L29;
L17: stack_frame_type same;
getstatic Field java/lang/System.out:"Ljava/io/PrintStream;";
ldc String "Bad version";
invokevirtual Method java/io/PrintStream.println:"(Ljava/lang/String;)V";
iconst_m1;
invokestatic Method java/lang/System.exit:"(I)V";
L29: stack_frame_type same;
return;
}
} // end Class A
static Method hasMatchingJavaVersion:"()Z"
stack 2 locals 0
{
ldc String "java.version";
invokestatic Method java/lang/System.getProperty:"(Ljava/lang/String;)Ljava/lang/String;";
ldc String "1.4.*";
invokevirtual Method java/lang/String.matches:"(Ljava/lang/String;)Z";
ireturn;
}
static Method hasMatchingJavaVersion:"()Z"
stack 2 locals 0
{
iconst_1;//Load true, always return true
ireturn;
}