Seit ich das java 7 jdk heruntergeladen habe lassen sich alle damit erstellten programme nicht mehr mit proguard obfuscieren. Es kommt immer folgende Fehlermeldung:
Ich habe die aktuelle proguard version (4.6)! Was kann man da machen? Gibt es ein alternatives programm zum obfuscieren?
ProGuard steht unter der GPL.
Gibt es dadrin nicht irgendwo eine Zeile
if (major <= 50) {}
oder
if (major < 51) {}
?
Wobei ich das mit den Versionsmummern auch nie richtig verstehe.
Man kann selbst mit Java 7 mit "javac -target 1.4 -source 1.4 Program.java" zu 1.4-Versionsnummern kompilieren. Selbst wenn Klassen von Java 7 verwendet werden. Geht halt nur um die Syntax.
Ein "javac -taregt 1.4 -source 1.5" oder so ist hingegen nicht möglich.
Schreibt man aber ein Programm mit Java7 Syntax (switch über Strings) und verändert dann mit einem Hex-Editor die Klassenversionsnummer, dann läuft es trotzdem selbst auf Java 1.4. Denn die VM bleibt gewöhnlich gleich.
So wird ein
Java:
String text ="Mein Text";switch(text){case"Du da":System.out.println("*01");break;case"Mein Text":System.out.println("*02");break;case"Noch was anderes":System.out.println("*03");break;default:System.out.println("*04");break;}
wenn man sich das Kompilat mit einem Dekompiler wie Jad ansieht, zu einem
Erst nun mit Java7 ist der Assemblerbefehl invokedynamic hinzugekommen. Und wenn solche Klassen die Versionsnummer 51.0 tragen ist es ja ok. Aber die anderen brauchen sie ja nicht.
Vielleicht sollte man mal ein Tool schreiben, daß sämtliche die Version sämtlicher Klassen in einem Verzeichnis (mit der Option "-r" auch Unterzeichnissse) auf eine bestimmte (ebenfalls mit einer Option festgelegten) Version ändert.
Vielleicht sollte man mal ein Tool schreiben, daß sämtliche die Version sämtlicher Klassen in einem Verzeichnis (mit der Option "-r" auch Unterzeichnissse) auf eine bestimmte (ebenfalls mit einer Option festgelegten) Version ändert
Habe gerade mal nachgesehen. Ein in wenigen Zeilen geschriebenes Prgramm, das die Minor- und MajorNummern ausliest, gibt es schon im Web: Check the class version - Real's Java How-to
Jetzt muß es nur noch die beiden Werte ändern und neu abspeichern. Und das ganze im großen Stil über mehrere Dateien (und Verzeihnisse) hinweg.
Gerade erst mit begonnen, da ich bis gerade noch Internet-Videos (YouTube) gesehen habe.
Und gleich werde ich schon wieder schlafen gehen.
Aber hier schon mal auf die Schnelle ein Zwischenergebnis:
Java:
importjava.io.*;publicclassClassVersionEdit{publicstaticvoidmain(String[] args)throwsIOException{for(int i =0; i < args.length; i++)//checkClassVersion(args[i]);changeClassVersion(args[i],0,48);}privatestaticvoidcheckClassVersion(String filename)throwsIOException{DataInputStream in =newDataInputStream(newFileInputStream(filename));int magic = in.readInt();if(magic !=0xcafebabe){System.out.println(filename +" is not a valid class!");;}int minor = in.readUnsignedShort();int major = in.readUnsignedShort();System.out.println(filename +": "+ major +" . "+ minor);
in.close();}privatestaticvoidchangeClassVersion(String filename,int minor,int major)throwsIOException{FileInputStream in =null;String text ;File file =newFile(filename);long size = file.length();byte[] buf =newbyte[(int)size];
in =newFileInputStream(file);
in.read(buf);try{if(in!=null) in.close();}catch(Exception ex){}if(buf[0]==-54&& buf[1]==-2&& buf[2]==-70&& buf[3]==-66){
buf[4]=0;
buf[5]=(byte) minor;
buf[6]=0;
buf[7]=(byte) major;FileOutputStream out =null;
out =newFileOutputStream(filename);
out.write(buf);try{if(out!=null) out.close();}catch(Exception ex){}}}/*
public static boolean isClassFile(String filename) throws IOException {
DataInputStream in = new DataInputStream (new FileInputStream(filename));
int magic = in.readInt();
if(magic != 0xcafebabe) {
System.out.println(filename + " is not a valid class!");;
}
in.close();
}
*/}
Einfach kompilieren und über sämtliche .class-Dateien laufen lassen.
Dann sollte das Problem mit der falschen Klassenversion nicht mehr existieren.