diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..017ef52 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +in +out +.vscode +.windows-serial +.lh + diff --git a/Obfuscator.jar b/Obfuscator.jar old mode 100755 new mode 100644 index 686be10..0350a9d Binary files a/Obfuscator.jar and b/Obfuscator.jar differ diff --git a/README.md b/README.md index e5b0b76..9cd9f34 100644 --- a/README.md +++ b/README.md @@ -48,6 +48,11 @@ Arguments: 5. -namelength | the length of each unique name, you need to also use -uniquenames 6. -help | display available commands +Settings files: Not required, MUST be stored in the working dir +* ignoreclass.txt: List of class won't be renamed +* ignorepackage.txt: List of package won't be renamed, all sub package and class inside this package still be renamed. +* ignorerenamememberinclass.txt: List of class which all public and protected function, public variable won't be renamed. Private function, private and protected properties still be ranmed. +* ignorevarname.txt: List of variable name, function name which won't be renamed. This affact for all public, protected and private functions/porperties. **Tips n Tricks:** @@ -90,6 +95,15 @@ Keep in mind that when local variables have the same name as global variables, i ---------- Updates +- 27 October 2022: + + Support Namespaces, support file without having any class + + Support regular expression + + Support load ignore list from: + ignoreclass.txt: All class in this file will be keep it's name + ignorepackage.txt: All packages in this file will be keep as is + ignorerenamememberinclass.txt: All member (methods, properties, local variable) will be keep as is + ignorevarname.txt: All methods, properties, local variable name in this file will be keep as is + + Fix many other errors - 12 October 2012: Make the Obfuscator ignore Anonymous functions instead of terminate. - 14 October 2012: Added Vector Type safety support. @@ -97,18 +111,23 @@ Updates Unsupported: ------------ -1. Namespaces, will generate errors - They're not too usefull. -2. The 'with' statement, will generate errors +1. The 'with' statement, will generate errors Its slow and unhandy to read because of the extra { it creates -3. mxml, will not get parsed; only .as files +2. mxml, will not get parsed; only .as files This is an actionscript obfuscator, not a UI obfuscator. -4. Local functions and anymous functions, may generate errors +3. Local functions and anymous functions, may generate errors there is a chance where there can be collisions with names. -5. Dynamically typed members, may generate errors +4. Dynamically typed members, may generate errors Without a type the variable or function cannot be referenced correctly, look out for warnings when you compile your original code for this. -7. Global function or field in separate .as file (global to the package) -8. Reflection, variable names will get changed. - +5. Global function or field in separate .as file (global to the package) +6. Reflection, variable names will get changed. +7. Public/protected get magic method, such as public function get Width() +8. Multi level methods/properties calling in some case + Such as: + ret = SLogicsCore.Character.Appliances.GetAll() + You should convert it to: + var ch: CCharacter = SLogicsCore.Character; + var app: CAppliances = ch.Appliances(); + ret = app.getAll(); diff --git a/ignoreclass.txt b/ignoreclass.txt new file mode 100644 index 0000000..2324abe --- /dev/null +++ b/ignoreclass.txt @@ -0,0 +1 @@ +TApplication diff --git a/ignorepackage.txt b/ignorepackage.txt new file mode 100644 index 0000000..e69de29 diff --git a/ignorerenamememberinclass.txt b/ignorerenamememberinclass.txt new file mode 100644 index 0000000..e69de29 diff --git a/ignorevarname.txt b/ignorevarname.txt new file mode 100644 index 0000000..e69de29 diff --git a/src/asformat/CodeParser.java b/src/asformat/CodeParser.java index 26cfa22..43a35c1 100644 --- a/src/asformat/CodeParser.java +++ b/src/asformat/CodeParser.java @@ -40,6 +40,7 @@ public class CodeParser { public CodeParser(File file) throws FileNotFoundException { _fileName = file.getPath(); + System.out.println("Processing file " + _fileName); FileInputStream inputStream = new FileInputStream(file); DataInputStream dataInput = new DataInputStream(inputStream); try { diff --git a/src/classes/ActionScriptClass.java b/src/classes/ActionScriptClass.java index a45fa12..a10299b 100644 --- a/src/classes/ActionScriptClass.java +++ b/src/classes/ActionScriptClass.java @@ -19,6 +19,8 @@ import data.IRenameLockable; import data.RenameObjectCounter; import data.Variable; +import java.util.Random; +import java.io.File; /** * Stores all the data that is to be stored on an Actionscript class. Also calls @@ -125,6 +127,8 @@ public ActionScriptClass(File file, IGetClass model) { _translationMap = new HashMap(); _importMap = new HashMap(); _asteriskImports = new ArrayList(); + //_renamed = true; + //_classNameRenamed = true; } /** @@ -167,9 +171,16 @@ public int renameClassName(int i) { return i; } if (ObfuscationSettings.uniqueNames()) - _newName = UniqueStringCreator.getUniqueName(RenameType.CLASSNAME); + _newName = UniqueStringCreator.getUniqueName(RenameType.CLASSNAME, this.getClassName()); else - _newName = "C" + i++; + { + Random rand = new Random(); + i += rand.nextInt(10); + _newName = "C" + i; + } + + lockRename(); + return i; } @@ -209,7 +220,18 @@ public void renameVariables() { public int renameVariables(int index) { if (_renamed) return index; - int i = MemberRenamer.renameAllMembers(index, _members, this, _classManager); + + int i = index; + + MemberRenamer.setTypeAllMembers(index, _members, this, _classManager); + + if (!ObfuscationSettings.isIgnoredMemberInClass(this._className)) + { + i = MemberRenamer.renameAllMembers(index, _members, this, _classManager); + } + + i = MemberRenamer.renameAllLocalVars(i, _members, this, _classManager); + _renamed = true; return i; } @@ -321,9 +343,15 @@ public void renameReferences() { */ //TODO offload logic to helper class public void outClass(File out) { + System.out.println("Write file " + this._file.toString()); + + File myOut = new File(out.getAbsolutePath() + "/" + getPackageStructure(out.getAbsolutePath()) + _newName + ".as"); + + if (_newName == null) + { + myOut = new File(out.getAbsolutePath() + "/" + getPackageStructure(out.getAbsolutePath()) + this._file.getName()); + } - File myOut = new File(out.getAbsolutePath() + "/" + getPackageStructure(out.getAbsolutePath()) + _newName - + ".as"); int tabCount = 0; try { myOut.createNewFile(); @@ -426,6 +454,12 @@ public void setPackageName(String packageName) { public void setClassName(String className) { this._className = className; _newName = _className; + + if (ObfuscationSettings.isIgnoredClass(className)) + { + //_renamed = false; + _classNameRenamed = true; + } } @Override diff --git a/src/classes/interpreters/ClassParseInterpreter.java b/src/classes/interpreters/ClassParseInterpreter.java index 18f6cff..01be0f6 100644 --- a/src/classes/interpreters/ClassParseInterpreter.java +++ b/src/classes/interpreters/ClassParseInterpreter.java @@ -74,6 +74,14 @@ public static void parseClass(File file, ArrayList _elements, ArrayList< _translationMap.put(var.getOldName(), var); } + if (asClass.getClassName() != null) + { + Variable variable = new Variable("super"); + variable.SetType(asClass.getFullType(asClass.getClassName())); + + _translationMap.put("super", variable); + } + asClass.setNewLines(parser.getNewLineList()); asClass.setSpaces(parser.getSpaceList()); } diff --git a/src/classes/interpreters/MemberInterpreter.java b/src/classes/interpreters/MemberInterpreter.java index b534d75..7eca7b0 100644 --- a/src/classes/interpreters/MemberInterpreter.java +++ b/src/classes/interpreters/MemberInterpreter.java @@ -94,6 +94,12 @@ private static Variable parseProperty(String variableName, CodeParser parser, Ar checkType(variableName, parser, elements, variable); + variable.setProtected(occursBefore(elements, "protected", 9)); + variable.setPrivated(occursBefore(elements, "private", 9)); + variable.setVar(occursBefore(elements, "var", 7)); + variable.setStatic(occursBefore(elements, "static", 8)); + variable.setFunction(false); + if (addVarsTo != null) addVarsTo.addVariable(variable); @@ -225,7 +231,7 @@ private static void checkType(String memberName, CodeParser parser, ArrayList elements, Variable member, String type) { if (type.equals("Vector.<")) { - System.out.println("type is a vector!"); + //System.out.println("type is a vector!"); String vectorType = getOrFail(parser, elements, "Vector.<"); member.setVectorType(vectorType); } @@ -273,8 +279,14 @@ private static Variable parseFunction(String functionName, CodeParser parser, Ar } else function = new Variable(functionName); - // store whether this function overrides + //Search for member type function.setOverride(occursBefore(elements, "override", 5)); + function.setProtected(occursBefore(elements, "protected", 4)); + function.setPrivated(occursBefore(elements, "private", 4)); + function.setVar(false); + function.setStatic(occursBefore(elements, "static", 3)); + function.setFunction(true); + //function.setConst(occursBefore(elements, "privated", 5)); // function definition should be followed by a '(' String validAfterFunction = getOrFail(parser, elements, "function definition! " + functionName); diff --git a/src/classes/makechange/RenamingExecuter.java b/src/classes/makechange/RenamingExecuter.java index baf5b56..53c709d 100644 --- a/src/classes/makechange/RenamingExecuter.java +++ b/src/classes/makechange/RenamingExecuter.java @@ -196,7 +196,9 @@ public static int getReferences(ActionScriptClass baseType, ActionScriptClass ty Variable var = null; // TODO make check if superclass == null better! if (varName.equals("super") && classManager.getClass(baseType.getFullType(superClassName)) != null) { - var = classManager.getClass(baseType.getFullType(superClassName)).askVariable(varName); + var = classManager.getClass(baseType.getFullType(superClassName)).askVariable("super"); + var.lockRename(); + //var = classManager.getClass(baseType.getFullType(superClassName)); } if (type != null && var == null && isInChain) { @@ -264,6 +266,12 @@ public static int getReferences(ActionScriptClass baseType, ActionScriptClass ty } i++; + if (i >= elements.size()) + { + //System.out.println("Something wrong with the file"); + i--; + return i; + } string = elements.get(i); if (string.equals("(") || string.equals("[")) { @@ -296,7 +304,7 @@ public static int getReferences(ActionScriptClass baseType, ActionScriptClass ty private static ActionScriptClass checkVector(Variable var, int i, ArrayList elements, IGetClass classManager, ActionScriptClass baseType, Variable inFunction, String superClassName) { i++; String next = elements.get(i); - System.out.println("point: " + next); + //System.out.println("point: " + next); if (next.equals("[")) { while (true) { i++; diff --git a/src/classes/renaming/MemberRenamer.java b/src/classes/renaming/MemberRenamer.java index 9e66ebe..11ff931 100644 --- a/src/classes/renaming/MemberRenamer.java +++ b/src/classes/renaming/MemberRenamer.java @@ -18,6 +18,25 @@ */ public class MemberRenamer { + private static ArrayList takenNames; + + public static void setTypeAllMembers(int index, ArrayList members, IClassPropertyGetterSetter asClass, + IGetClass model) { + // first get the full path of each type on each variable, for example + // Sprite to flash.display.Sprite + for (Variable variable : members) { + variable.SetType(asClass.getFullType(variable.getType())); + ArrayList locals = variable.getLocalVariables(); + for (Variable localVar : locals) { + localVar.SetType(asClass.getFullType(localVar.getType())); + checkVectorException(localVar, asClass); + } + checkVectorException(variable, asClass); + } + + takenNames = new ArrayList(); + + } /** * Renames all the members of a class. * @@ -34,17 +53,6 @@ public class MemberRenamer { */ public static int renameAllMembers(int index, ArrayList members, IClassPropertyGetterSetter asClass, IGetClass model) { - // first get the full path of each type on each variable, for example - // Sprite to flash.display.Sprite - for (Variable variable : members) { - variable.SetType(asClass.getFullType(variable.getType())); - ArrayList locals = variable.getLocalVariables(); - for (Variable localVar : locals) { - localVar.SetType(asClass.getFullType(localVar.getType())); - checkVectorException(localVar, asClass); - } - checkVectorException(variable, asClass); - } ActionScriptClass superClass = model.getClass(asClass.getFullType(asClass.getSuperClassName())); @@ -58,12 +66,10 @@ public static int renameAllMembers(int index, ArrayList members, IClas for (String implemented : asClass.getInterfaces()) { ActionScriptClass myInterface = model.getClass(asClass.getFullType(implemented)); if (myInterface == null) - rageQuit("Interal error, Interface " + implemented + " is null in " + asClass.getPackageName() + "." - + asClass.getClassName()); + rageQuit("Interal error, Interface " + implemented + " is null in " + asClass.getPackageName() + "." + asClass.getClassName()); myInterface.getPreRenamed(preRenamed); } - ArrayList takenNames = new ArrayList(); HashMap translationMap = asClass.getTranslationMap(); @@ -75,13 +81,30 @@ public static int renameAllMembers(int index, ArrayList members, IClas } } if (superClass != null) + { for (Variable variable : superClass.getVariables()) { takenNames.add(variable.getName()); } + } + + + //Rename for overrideFunctions ArrayList overrideFunctions = asClass.getOverrideFunctions(); if (superClass != null) { for (Variable override : overrideFunctions) { - override.rename(superClass.askVariable(override.getOldName()).getName()); + + String oldName = override.getOldName(); + if (oldName == null) + { + continue; + } + + Variable valr = superClass.askVariable(oldName); + if (valr == null) + { + continue; + } + override.rename(valr.getName()); takenNames.add(override.getName()); } } else { @@ -105,7 +128,12 @@ public static int renameAllMembers(int index, ArrayList members, IClas int i = index; for (Variable variable : members) { - if (variable.isRenamed()) + if ( + variable.isRenamed() + || variable.isStatic() + || variable.isPrivated() + || (variable.isProtected() && variable.isVar()) + ) continue; String newName = null; @@ -114,22 +142,55 @@ public static int renameAllMembers(int index, ArrayList members, IClas while (newName == null || takenNames.indexOf(newName) >= 0) newName = renamePrefix + i++; if (ObfuscationSettings.uniqueNames()) - variable.rename(UniqueStringCreator.getUniqueName(RenameType.VARIABLE)); + variable.rename(UniqueStringCreator.getUniqueName(RenameType.VARIABLE, variable.getName())); else variable.rename(newName); } - } + return i; + } + + public static int renameAllLocalVars(int index, ArrayList members, IClassPropertyGetterSetter asClass, + IGetClass model) { + if (!ObfuscationSettings.doLocalVars()) - return i; + { + return index; + } + + String renamePrefix = (asClass.isInterFace() ? "i" : "_"); + + int i = index; + for (Variable variable : members) { + if (variable.isRenamed() || variable.isStatic()) + continue; + + if (!(variable.isPrivated() || (variable.isProtected() && variable.isVar()))) + continue; + + + String newName = null; + + if (!variable.getName().equals(asClass.getClassName())) { + // loop used for incremental renaming only + while (newName == null || takenNames.indexOf(newName) >= 0) + newName = renamePrefix + i++; + if (ObfuscationSettings.uniqueNames()) + variable.rename(UniqueStringCreator.getUniqueName(RenameType.VARIABLE, variable.getName())); + else + variable.rename(newName); + } + } for (Variable variable : members) { int p = 0; for (Variable local : variable.getLocalVariables()) { if (ObfuscationSettings.uniqueNames()) - local.rename(UniqueStringCreator.getUniqueName(RenameType.VARIABLE)); + { + local.rename(UniqueStringCreator.getUniqueName(RenameType.LOCALVARIABLE, local.getName())); + } else local.rename("l" + p); p++; diff --git a/src/classes/renaming/RenameType.java b/src/classes/renaming/RenameType.java index 70e3483..000bc4f 100644 --- a/src/classes/renaming/RenameType.java +++ b/src/classes/renaming/RenameType.java @@ -5,5 +5,5 @@ * @author sander */ public enum RenameType { - VARIABLE, CLASSNAME, PACKAGENAME + VARIABLE, CLASSNAME, PACKAGENAME, LOCALVARIABLE } diff --git a/src/classes/renaming/UniqueStringCreator.java b/src/classes/renaming/UniqueStringCreator.java index dd303cc..de6c71e 100644 --- a/src/classes/renaming/UniqueStringCreator.java +++ b/src/classes/renaming/UniqueStringCreator.java @@ -3,6 +3,10 @@ import java.nio.charset.Charset; import java.nio.charset.CharsetEncoder; import java.util.HashMap; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.io.FileWriter; /** * This class creates unique strings used to name variables @@ -13,6 +17,10 @@ public class UniqueStringCreator { private static HashMap usedWordsMap; + private static Map renamedDict; + private static Map renamedClassDict; + private static Map renamedPackageDict; + //lol lazy: http://stackoverflow.com/questions/2578233/how-do-i-get-the-set-of-all-letters-in-java-clojure private static String getAllLetters(String charsetName) { @@ -52,6 +60,10 @@ public static void setupChars() { validCharPackage = validCharClass; validCharVariable = (allLetters + allNumbers + "_$").toCharArray(); usedWordsMap = new HashMap(); + + renamedDict = new HashMap(); + renamedClassDict = new HashMap(); + renamedPackageDict = new HashMap(); } /**gets the posibilities based on the length of the variable name. @@ -72,31 +84,45 @@ public static long getExpectedPossibilities() { return out; } + public static String getDictUniqueName(String oldname){ + return renamedDict.getOrDefault(oldname.toLowerCase(), null); + } + /**Returns a unique name. * * @param rename the type of name that is wanted * @return the name */ - public static String getUniqueName(RenameType rename) { + public static String getUniqueName(RenameType rename, String oldname) { char[] first = null; char[] norm = null; - + + if (rename == RenameType.VARIABLE) + { + String indist = renamedDict.getOrDefault(oldname.toLowerCase(), null); + if (indist != null) + { + return indist; + } + } + switch (rename) { - case VARIABLE: - first = firstCharValidVariable; - norm = validCharVariable; - break; - case CLASSNAME: - first = firstCharValidClass; - norm = validCharClass; - break; - case PACKAGENAME: - first = firstCharValidPackage; - norm = validCharPackage; - break; - default: - System.out.println("this is impossible! HHAHAHAHAHAHAH"); - break; + case VARIABLE: + case LOCALVARIABLE: + first = firstCharValidVariable; + norm = validCharVariable; + break; + case CLASSNAME: + first = firstCharValidClass; + norm = validCharClass; + break; + case PACKAGENAME: + first = firstCharValidPackage; + norm = validCharPackage; + break; + default: + System.out.println("this is impossible! HHAHAHAHAHAHAH"); + break; } char[] out = new char[length]; @@ -111,10 +137,45 @@ public static String getUniqueName(RenameType rename) { } else{ //collision detected TODO log? - return getUniqueName(rename); + return getUniqueName(rename, oldname); } - return new String(out); - + String strOut = new String(out); + + renamedDict.put(new String(oldname), strOut); + + switch (rename) { + case VARIABLE: + case LOCALVARIABLE: + break; + case CLASSNAME: + renamedClassDict.put(oldname, strOut); + break; + case PACKAGENAME: + renamedPackageDict.put(oldname, strOut); + break; + default: + break; + } + + return strOut; + } + + public static void resetDict(){ + //renamedDict.clear(); + } + + public static void writeDistToFile(){ + try { + FileWriter writer = new FileWriter("output.txt"); + + for(String str: renamedDict.keySet()) { + writer.write(str + "\t" + renamedDict.get(str) + System.lineSeparator()); + } + writer.close(); + + } catch (Exception e) { + // TODO: handle exception + } } } diff --git a/src/data/Variable.java b/src/data/Variable.java index cb3596d..3e1795e 100644 --- a/src/data/Variable.java +++ b/src/data/Variable.java @@ -2,6 +2,8 @@ import java.util.ArrayList; +import main.ObfuscationSettings; + /** * This class holds a Variable or a Function, it can also have local variables * if it is a function. @@ -20,6 +22,11 @@ public class Variable implements IAddVariable, IRenameLockable { private boolean _isOverride; private boolean _anonymous = false; private boolean _isVector = false; + private boolean _isProtected = false; + private boolean _isPrivated = false; + private boolean _isVar; + private boolean _isFunction; + private boolean _isStatic; public Variable(String variableName) { RenameObjectCounter.increaseCount(1); @@ -27,7 +34,14 @@ public Variable(String variableName) { System.err.println("Variable with null in constructor!!!"); System.exit(0); } - _renamed = false; + if (ObfuscationSettings.isIgnoredMemberName(variableName)) + { + _renamed = true; + } + else + { + _renamed = false; + } this._variableName = variableName; _argVars = new ArrayList(); _oldName = variableName; @@ -37,7 +51,7 @@ public String getName() { return _variableName; } - public void rename(String newName) { + public void rename(String newName) { if (newName == null) { System.err.println("RENAMED TO NULL NAME!!, " + _oldName); System.exit(0); @@ -88,6 +102,38 @@ public void setOverride(boolean b) { _isOverride = b; } + public void setProtected(boolean b) { + _isProtected = b; + } + + public void setPrivated(boolean b) { + _isPrivated = b; + } + + public void setVar(boolean b) { + _isVar = b; + } + + public void setFunction(boolean b) { + _isFunction = b; + } + + public boolean isVar(){ + return _isVar; + } + + public boolean isFunction(){ + return _isFunction; + } + + public boolean isProtected(){ + return _isProtected; + } + + public boolean isPrivated(){ + return _isPrivated; + } + public boolean isOverride() { return _isOverride; } @@ -128,7 +174,7 @@ public String getVectorType() { } public void setVectorType(String _vectorType) { - System.out.println("setting Vector type: " + _vectorType); + //System.out.println("setting Vector type: " + _vectorType); this._vectorType = _vectorType; _isVector = true; } @@ -136,4 +182,14 @@ public void setVectorType(String _vectorType) { public boolean isVector() { return _isVector; } + + public void setStatic(boolean b) { + _isStatic = b; + } + + public boolean isStatic() + { + return _isStatic; + } + } diff --git a/src/main/Obfuscate.java b/src/main/Obfuscate.java index a8b98bd..1748fcd 100644 --- a/src/main/Obfuscate.java +++ b/src/main/Obfuscate.java @@ -71,8 +71,8 @@ public Obfuscate(boolean isGUI) { UniqueStringCreator.length = 4; if (!isGUI) { System.out.println("Welcome to AS Obfuscator!, put your files in the subfolder ./in"); - System.out.println("To start press ENTER....."); - new Scanner(System.in).nextLine(); // block until new line so user + //System.out.println("To start press ENTER....."); + //new Scanner(System.in).nextLine(); // block until new line so user // can put stuff in ./in } @@ -86,6 +86,8 @@ public Obfuscate(boolean isGUI) { } makeChangeNameAndOutput(); + + UniqueStringCreator.writeDistToFile(); } /** @@ -131,15 +133,23 @@ public boolean renameEverything() { if (interF.isInterFace()) { it.remove(); interfaces.add(interF); + if (ObfuscationSettings.renameClasses()) interF.renameClassName(classIndex); - interfaceIndex = interF.renameVariables(interfaceIndex); + + if (ObfuscationSettings.doLocalVars()) + interfaceIndex = interF.renameVariables(interfaceIndex); } } // now the normal classes can do the same for (ActionScriptClass actionScriptClass : classes) { - actionScriptClass.renameVariables(); + if (actionScriptClass.getClassName() == null) + continue; + + if (ObfuscationSettings.doLocalVars()) + actionScriptClass.renameVariables(); + if (ObfuscationSettings.renameClasses()) classIndex = actionScriptClass.renameClassName(classIndex); } @@ -149,7 +159,7 @@ public boolean renameEverything() { // rename package names int packageIndex = 0; for (PackageAS packageAS : manager.getPackages()) { - if (ObfuscationSettings.renamePackages()) + if (ObfuscationSettings.renamePackages() && packageAS.getName().length() > 0) packageIndex = packageAS.renamePackage(packageIndex); } @@ -171,7 +181,7 @@ public void makeChangeNameAndOutput() { if (!out.exists()) out.mkdirs(); - for (ActionScriptClass actionScriptClass : classes) { + for (ActionScriptClass actionScriptClass : classes) { actionScriptClass.outClass(out); } } @@ -241,9 +251,9 @@ private void setArgs(String[] args) { System.out.println("-nolocal | don't obfuscate local variables"); System.out.println("-nopackages | don't obfuscate packages"); System.out.println("-noclasses | don't obfuscate class names"); - System.out.println("-uniquenames | give every field an unique name"); + System.out.println("-nouniquenames | don't give every field an unique name"); System.out - .println("-namelength | the length of each unique name, you need to also use -uniquenames"); + .println("-namelength | the length of each unique name, you need to also NOT use -uniquenames"); System.out.println("-help | display this message"); System.out.println("press ENTER to exit"); new Scanner(System.in).nextLine(); @@ -253,12 +263,12 @@ private void setArgs(String[] args) { int indexOf = a.indexOf("-namelength"); if (indexOf >= 0) { System.out.println("found namelength argument!"); - if (args.length <= indexOf + 1) { - System.out.println("missing length argument after -namelength argument!"); - System.out.println("Press ENTER to exit"); - new Scanner(System.in).nextLine(); - System.exit(0); - } + // if (args.length <= indexOf + 1) { + // System.out.println("missing length argument after -namelength argument!"); + // System.out.println("Press ENTER to exit"); + // new Scanner(System.in).nextLine(); + // System.exit(0); + // } try { int length = Integer.parseInt(args[indexOf + 1]); UniqueStringCreator.length = length; @@ -270,11 +280,15 @@ private void setArgs(String[] args) { System.exit(0); } } + else + { + UniqueStringCreator.length = 10; + } boolean localVars = a.indexOf("-nolocal") == -1; boolean packages = a.indexOf("-nopackages") == -1; boolean classNames = a.indexOf("-noclasses") == -1; - boolean uniqueRenaming = a.indexOf("-uniquenames") >= 0; + boolean uniqueRenaming = a.indexOf("-nouniquenames") == -1; System.out.println("unique names!: " + uniqueRenaming); ObfuscationSettings.initSettings(new ObfuscationSettings(localVars, packages, classNames, uniqueRenaming)); } diff --git a/src/main/ObfuscationSettings.java b/src/main/ObfuscationSettings.java index 7b6a3ed..b48da9d 100644 --- a/src/main/ObfuscationSettings.java +++ b/src/main/ObfuscationSettings.java @@ -1,5 +1,13 @@ package main; +import java.util.List; +import java.util.Map; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.util.ArrayList; +import java.util.HashMap; + /**Stores some settings about the obfuscation process that are globally accessible * * @author sander @@ -12,9 +20,14 @@ public class ObfuscationSettings { private final boolean obfuscateClassNames; private final boolean obfuscatePackages ; private final boolean uniqueRenaming; + private final List ignoreClassList; + private final List ignoreMemberName; + private final List ignorePackage; + private final List ignoreMemberInClass; + public static void initSettings(ObfuscationSettings settings) { - ObfuscationSettings.settings = settings; + ObfuscationSettings.settings = settings; } @@ -23,7 +36,128 @@ public ObfuscationSettings(boolean obfuscateLocalVars, boolean obfuscatePackages this.obfuscateClassNames = obfuscateClassNames; this.obfuscatePackages = obfuscatePackages; this.uniqueRenaming = uniqueRenaming; - } + + + this.ignoreClassList = new ArrayList(); + this.ignoreMemberName = new ArrayList(); + this.ignorePackage = new ArrayList(); + this.ignoreMemberInClass = new ArrayList(); + + BufferedReader br; + File file = new File("ignorepackage.txt"); + + if (file.exists()) + { + try { + br = new BufferedReader(new FileReader(file)); + String st; + + while ((st = br.readLine()) != null) + { + st = st.trim(); + this.ignorePackage.add(st); + } + br.close(); + } catch (Exception e) { + // TODO: handle exception + } + } + + // this.ignorePackage.add("Logics"); + // this.ignorePackage.add("Logging"); + // this.ignorePackage.add("Externals"); + // this.ignorePackage.add("Logics.Agent"); + // this.ignorePackage.add("Logics.Battle"); + // this.ignorePackage.add("LocalStorages"); + // this.ignorePackage.add("Foundation.Sound"); + // this.ignorePackage.add("Foundation.Fonts"); + // this.ignorePackage.add("Foundation.Timing"); + // this.ignorePackage.add("Foundation.Worker"); + // this.ignorePackage.add("Foundation.Network"); + // this.ignorePackage.add("Foundation.Resources"); + // this.ignorePackage.add("Foundation.LoaderQueue"); + // this.ignorePackage.add("Foundation.SensitiveWord"); + // this.ignorePackage.add("Rendering.Overlayers.HelpTips"); + // this.ignorePackage.add("Processors.Game.Lobby.SocketSpeed"); + + file = new File("ignoreclass.txt"); + + if (file.exists()) + { + try { + br = new BufferedReader(new FileReader(file)); + String st; + + while ((st = br.readLine()) != null) + { + st = st.trim(); + this.ignoreClassList.add(st); + } + br.close(); + } catch (Exception e) { + // TODO: handle exception + } + } + // this.ignoreClassList.add("TApplication"); + // this.ignoreClassList.add("TUIComponent"); + // this.ignoreClassList.add("TBaseActivity"); + // this.ignoreClassList.add("Oper"); + // this.ignoreClassList.add("TransitionLayerBase"); + // this.ignoreClassList.add("TFont"); + // this.ignoreClassList.add("TCoordinate"); + // this.ignoreClassList.add("THyperStringElement"); + // this.ignoreClassList.add("Back"); + // this.ignoreClassList.add("TProcessorBaseActivity"); + // this.ignoreClassList.add("TUnstreamizer"); + // this.ignoreClassList.add("TOverlayerHelpTips"); + // this.ignoreClassList.add("TProcessorLobbyWindow"); + // this.ignoreClassList.add("TUIBaseWindow"); + // this.ignoreClassList.add("TActive"); + // this.ignoreClassList.add("TStringOperator"); + // this.ignoreClassList.add("TStringGeometer"); + // this.ignoreClassList.add("TStringParagrapher"); + // this.ignoreClassList.add("TUIRoleCanMove"); + + + file = new File("ignorevarname.txt"); + + if (file.exists()) + { + try { + br = new BufferedReader(new FileReader(file)); + String st; + + while ((st = br.readLine()) != null) + { + st = st.trim(); + this.ignoreMemberName.add(st); + } + br.close(); + } catch (Exception e) { + // TODO: handle exception + } + } + + file = new File("ignorerenamememberinclass.txt"); + + if (file.exists()) + { + try { + br = new BufferedReader(new FileReader(file)); + String st; + + while ((st = br.readLine()) != null) + { + st = st.trim(); + this.ignoreMemberInClass.add(st); + } + br.close(); + } catch (Exception e) { + // TODO: handle exception + } + } + + } public static boolean doLocalVars(){ return settings.obfuscateLocalVars; @@ -45,5 +179,28 @@ public static boolean renamePackages() { } + public static boolean isIgnoredClass(String classname) + { + if (classname == null) + return true; + return settings.ignoreClassList.indexOf(classname) > -1; + } + + public static boolean isIgnoredMemberName(String classname) + { + return settings.ignoreMemberName.indexOf(classname) > -1; + } + + public static boolean isIgnoredMemberInClass(String classname) + { + return settings.ignoreMemberInClass.indexOf(classname) > -1; + } + + public static boolean isIgnorePackage(String packagename) + { + if (packagename == null || packagename.length() == 0) + return true; + return settings.ignorePackage.indexOf(packagename) > -1; + } } diff --git a/src/packages/PackageAS.java b/src/packages/PackageAS.java index fcdfad1..32b7711 100644 --- a/src/packages/PackageAS.java +++ b/src/packages/PackageAS.java @@ -8,6 +8,7 @@ import classes.renaming.UniqueStringCreator; import data.IRenameLockable; import data.RenameObjectCounter; +import java.util.Random; /** * Holds the information that needs to be stored for each package. @@ -25,10 +26,19 @@ public PackageAS(String name) { this._name = name; _newName = name; _classes = new ArrayList(); + if (ObfuscationSettings.isIgnorePackage(name)) + { + this.lockRename(); + } } public void addClass(ActionScriptClass classToAdd) { + //DuongTC + // if (classToAdd.getClassName() == null) + // return; _classes.add(classToAdd); + if (_renamed) + classToAdd.setNewPackageName(_name); } public String getName() { @@ -37,8 +47,22 @@ public String getName() { public ActionScriptClass getActionScriptClass(String className) { for (ActionScriptClass a : _classes) { - if (a.getClassName().equals(className)) - return a; + if (a != null) + { + String fClassName = a.getClassName(); + + if (fClassName != null) + { + if (fClassName.equals(className)) + return a; + } + // else + // { + // System.out.println("Found file without class: " + a.toString()); + // System.out.println("Please correct it"); + // System.exit(0); + // } + } } return null; } @@ -56,9 +80,14 @@ public int renamePackage(int i) { return i; if (ObfuscationSettings.uniqueNames()) - _newName = UniqueStringCreator.getUniqueName(RenameType.PACKAGENAME); + _newName = UniqueStringCreator.getUniqueName(RenameType.PACKAGENAME, getName()); else - _newName = "P" + i++; + { + Random rand = new Random(); + i += rand.nextInt(10); + _newName = "P" + i; + } + for (ActionScriptClass asClass : _classes) { asClass.setNewPackageName(_newName);