diff --git a/jode/jode/obfuscator/ClassIdentifier.java b/jode/jode/obfuscator/ClassIdentifier.java index e815f2c..af12863 100644 --- a/jode/jode/obfuscator/ClassIdentifier.java +++ b/jode/jode/obfuscator/ClassIdentifier.java @@ -106,8 +106,18 @@ public class ClassIdentifier extends Identifier { * a compatible class. */ public void preserveSerializable() { - /*XXX*/ - /* add a field serializableVersionUID if not existent */ + preserveIdentifier("writeObject", "(Ljava.io.ObjectOutputStream)V"); + preserveIdentifier("readObject", "(Ljava.io.ObjectOutputStream)V"); + if (Obfuscator.preserveSerial) { + /* XXX - add a field serializableVersionUID if not existent */ + preserveIdentifier("serializableVersionUID", "I"); + for (int i=0; i < fieldCount; i++) { + FieldIdentifier ident = (FieldIdentifier) identifiers[i]; + if ((ident.info.getModifiers() + & (Modifier.TRANSIENT | Modifier.STATIC)) == 0) + identifiers[i].setPreserved(); + } + } } public void initSuperClasses(ClassInfo superclass) { @@ -174,9 +184,11 @@ public class ClassIdentifier extends Identifier { MethodInfo[] minfos = info.getMethods(); if (Obfuscator.swapOrder) { Random rand = new Random(); + // XXX replace the following for JDK12 with: + // Collections.shuffle(Arrays.asList(finfos), rand); + // Collections.shuffle(Arrays.asList(minfos), rand); for (int i=1; i < finfos.length; i++) { int j = (Math.abs(rand.nextInt()) % (i+1)); - // XXX replace with nextInt(i+1) for JDK12. if (j != i) { FieldInfo tmp = finfos[i]; finfos[i] = finfos[j]; @@ -185,7 +197,6 @@ public class ClassIdentifier extends Identifier { } for (int i=1; i < minfos.length; i++) { int j = (Math.abs(rand.nextInt()) % (i+1)); - // XXX replace with nextInt(i+1) for JDK12. if (j != i) { MethodInfo tmp = minfos[i]; minfos[i] = minfos[j]; diff --git a/jode/jode/obfuscator/Main.java b/jode/jode/obfuscator/Main.java index fd0a16c..d250e81 100644 --- a/jode/jode/obfuscator/Main.java +++ b/jode/jode/obfuscator/Main.java @@ -29,6 +29,7 @@ public class Obfuscator { public static boolean shouldStrip = true; public static boolean swapOrder = false; + public static boolean preserveSerial = true; public static PrintStream err = System.err; public static final int PRESERVE_NONE = 0; @@ -49,36 +50,38 @@ public class Obfuscator { err.println("\t[-v] "+"Verbose output"); err.println("\t[-debug] "+"Debugging"); err.println("\t[-nostrip] "+ - "Don't strip not needed methods"); + "Don't strip not needed methods"); err.println("\t[-cp ] "+ "The class path; should contain classes.zip"); err.println("\t[-d ] "+ - "Destination directory for output classes"); + "Destination directory for output classes"); err.println("Preserve options: "); err.println("\t[-package] "+ - "Preserve all package members"); + "Preserve all package members"); err.println("\t[-protected] "+ - "Preserve all protected members"); + "Preserve all protected members"); err.println("\t[-public] "+ - "Preserve all public members"); + "Preserve all public members"); err.println("\t[-preserve ] "+ - "Preserve only the given name (allowed multiple times)"); + "Preserve only the given name (allowed multiple times)"); + err.println("\t[-breakserial] "+ + "Allow the serialized form to change"); err.println("Obfuscating options: "); err.println("\t[-strong] "+ - "Rename identifiers to random unicode identifier"); + "Rename identifiers to random unicode identifier"); err.println("\t[-weak] "+ - "Rename to random, but legal java identifier"); + "Rename to random, but legal java identifier"); err.println("\t[-unique] "+ - "Rename to unique legal java identifier"); + "Rename to unique legal java identifier"); err.println("\t[-none] "+ - "Don't rename any method."); + "Don't rename any method."); err.println("\t[-table ] "+ - "Read translation table from file"); + "Read translation table from file"); err.println("\t[-revtable ] "+ - "Write reversed translation table to file"); + "Write reversed translation table to file"); err.println("\t[-swaporder] "+ - "Swap the order of fields and methods."); + "Swap the order of fields and methods."); } public static void main(String[] params) { @@ -119,6 +122,8 @@ public class Obfuscator { String ident = params[++i]; preservedIdents.addElement(ident); } + else if (params[i].equals("-breakserial")) + preserveSerial = false; /* Obfuscate options */ else if (params[i].equals("-strong"))