From b4d6f3bfd872e0de86d4d9b6584892edd4ed9a52 Mon Sep 17 00:00:00 2001 From: hacrot3000 Date: Wed, 26 Oct 2022 16:32:14 +0700 Subject: [PATCH 1/8] Fix: - Error on file which don't have any class - Error on file contain regular expression - Error on somecase Remain: - Error on rename local variable - Sometime it doesn't rename the class name correctly, just add to exclude list --- src/classes/ActionScriptClass.java | 31 +++- .../interpreters/ClassParseInterpreter.java | 8 + src/classes/makechange/RenamingExecuter.java | 10 +- src/classes/renaming/MemberRenamer.java | 36 ++++- src/classes/renaming/RenameType.java | 2 +- src/classes/renaming/UniqueStringCreator.java | 101 ++++++++++--- src/data/Variable.java | 13 +- src/main/Obfuscate.java | 46 ++++-- src/main/ObfuscationSettings.java | 141 +++++++++++++++++- src/packages/PackageAS.java | 37 ++++- 10 files changed, 371 insertions(+), 54 deletions(-) diff --git a/src/classes/ActionScriptClass.java b/src/classes/ActionScriptClass.java index a45fa12..37c91de 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; } @@ -321,9 +332,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 +443,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/makechange/RenamingExecuter.java b/src/classes/makechange/RenamingExecuter.java index baf5b56..3f2b88d 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("[")) { diff --git a/src/classes/renaming/MemberRenamer.java b/src/classes/renaming/MemberRenamer.java index 9e66ebe..2ca5375 100644 --- a/src/classes/renaming/MemberRenamer.java +++ b/src/classes/renaming/MemberRenamer.java @@ -78,10 +78,35 @@ public static int renameAllMembers(int index, ArrayList members, IClas for (Variable variable : superClass.getVariables()) { takenNames.add(variable.getName()); } + 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; + } + + /* DuongTC + String dNewname = UniqueStringCreator.getDictUniqueName(oldName); + + if (dNewname != null) + { + override.rename(dNewname); + takenNames.add(override.getName()); + + continue; + } + */ + + Variable valr = superClass.askVariable(oldName); + if (valr == null) + { + continue; + } + override.rename(valr.getName()); takenNames.add(override.getName()); } } else { @@ -114,22 +139,25 @@ 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); } - } if (!ObfuscationSettings.doLocalVars()) + { return i; + } 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..b6cc03c 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. @@ -27,7 +29,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 +46,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); diff --git a/src/main/Obfuscate.java b/src/main/Obfuscate.java index a8b98bd..3e68db2 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 localVars = false;// 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..c07e45a 100644 --- a/src/main/ObfuscationSettings.java +++ b/src/main/ObfuscationSettings.java @@ -1,5 +1,10 @@ package main; +import java.util.List; +import java.util.Map; +import java.util.ArrayList; +import java.util.HashMap; + /**Stores some settings about the obfuscation process that are globally accessible * * @author sander @@ -12,9 +17,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 needReCorrect; + public static void initSettings(ObfuscationSettings settings) { - ObfuscationSettings.settings = settings; + ObfuscationSettings.settings = settings; } @@ -23,7 +33,116 @@ 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.needReCorrect = new ArrayList(); + + 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"); + + 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"); + //this.ignoreClassList.add(""); + //this.ignoreClassList.add(""); + //this.ignoreClassList.add(""); + //this.ignoreClassList.add(""); + //this.ignoreClassList.add(""); + //this.ignoreClassList.add(""); + //this.ignoreClassList.add(""); + //this.ignoreClassList.add(""); + //this.ignoreClassList.add(""); + //this.ignoreClassList.add(""); + //this.ignoreClassList.add(""); + //this.ignoreClassList.add(""); + //this.ignoreClassList.add(""); + //this.ignoreClassList.add(""); + //this.ignoreClassList.add(""); + //this.ignoreClassList.add(""); + //this.ignoreClassList.add(""); + //this.ignoreClassList.add(""); + //this.ignoreClassList.add(""); + //this.ignoreClassList.add(""); + //this.ignoreClassList.add(""); + //this.ignoreClassList.add(""); + //this.ignoreClassList.add(""); + //this.ignoreClassList.add(""); + //this.ignoreClassList.add(""); + + // this.ignoreMemberName.add("ShortcutModesReset"); + // this.ignoreMemberName.add("FreeInsideItems"); + // this.ignoreMemberName.add("FreeOutsideItems"); + // this.ignoreMemberName.add("Low"); + // this.ignoreMemberName.add("High"); + // this.ignoreMemberName.add("ConstructShortcutModes"); + // this.ignoreMemberName.add("OnTaskClick"); + // this.ignoreMemberName.add("KillHeroId"); + // this.ignoreMemberName.add("Level"); + // this.ignoreMemberName.add("NeedExp"); + // this.ignoreMemberName.add("execute"); + // this.ignoreMemberName.add("end"); + // this.ignoreMemberName.add("WAIT"); + // this.ignoreMemberName.add("NONE"); + // this.ignoreMemberName.add("commit"); + // this.ignoreMemberName.add("halt"); + // this.ignoreMemberName.add("IsOn"); + // this.ignoreMemberName.add("EndTime"); + // this.ignoreMemberName.add("DayTime"); + // this.ignoreMemberName.add("CurStatus"); + // this.ignoreMemberName.add("Status"); + // this.ignoreMemberName.add("Count"); + // this.ignoreMemberName.add("Max"); + // this.ignoreMemberName.add("Min"); + // this.ignoreMemberName.add("THyperStringElement"); + // this.ignoreMemberName.add("Desc"); + // this.ignoreMemberName.add("RenderingPerform_Gauge"); + // this.ignoreMemberName.add("createTo"); + // this.ignoreMemberName.add("state"); + // this.ignoreMemberName.add("destory"); + // this.ignoreMemberName.add("StartTime"); + // this.ignoreMemberName.add("Dereference"); + // this.ignoreMemberName.add("Reference"); + // this.ignoreMemberName.add("GetInventoryByIndex"); + // this.ignoreMemberName.add("Value"); + //this.ignoreMemberName.add(""); + //this.ignoreMemberName.add(""); + //this.ignoreMemberName.add(""); + //this.ignoreMemberName.add(""); + } public static boolean doLocalVars(){ return settings.obfuscateLocalVars; @@ -45,5 +164,23 @@ 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 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); From 87784d81e48607c6b499b44ce5ae8a21894ef402 Mon Sep 17 00:00:00 2001 From: hacrot3000 Date: Thu, 27 Oct 2022 10:31:11 +0700 Subject: [PATCH 2/8] Add load ignore list from file --- src/classes/ActionScriptClass.java | 5 + src/main/Obfuscate.java | 10 +- src/main/ObfuscationSettings.java | 228 ++++++++++++++++------------- 3 files changed, 134 insertions(+), 109 deletions(-) diff --git a/src/classes/ActionScriptClass.java b/src/classes/ActionScriptClass.java index 37c91de..ef59bcb 100644 --- a/src/classes/ActionScriptClass.java +++ b/src/classes/ActionScriptClass.java @@ -449,6 +449,11 @@ public void setClassName(String className) { //_renamed = false; _classNameRenamed = true; } + + if (ObfuscationSettings.isIgnoredMemberInClass(className)) + { + _renamed = true; + } } @Override diff --git a/src/main/Obfuscate.java b/src/main/Obfuscate.java index 3e68db2..520f68a 100644 --- a/src/main/Obfuscate.java +++ b/src/main/Obfuscate.java @@ -137,8 +137,8 @@ public boolean renameEverything() { if (ObfuscationSettings.renameClasses()) interF.renameClassName(classIndex); - // if (ObfuscationSettings.doLocalVars()) - // interfaceIndex = interF.renameVariables(interfaceIndex); + if (ObfuscationSettings.doLocalVars()) + interfaceIndex = interF.renameVariables(interfaceIndex); } } @@ -147,8 +147,8 @@ public boolean renameEverything() { if (actionScriptClass.getClassName() == null) continue; - // if (ObfuscationSettings.doLocalVars()) - // actionScriptClass.renameVariables(); + if (ObfuscationSettings.doLocalVars()) + actionScriptClass.renameVariables(); if (ObfuscationSettings.renameClasses()) classIndex = actionScriptClass.renameClassName(classIndex); @@ -285,7 +285,7 @@ private void setArgs(String[] args) { UniqueStringCreator.length = 10; } - boolean localVars = false;// a.indexOf("-nolocal") == -1; + boolean localVars = false; //a.indexOf("-nolocal") == -1; boolean packages = a.indexOf("-nopackages") == -1; boolean classNames = a.indexOf("-noclasses") == -1; boolean uniqueRenaming = a.indexOf("-nouniquenames") == -1; diff --git a/src/main/ObfuscationSettings.java b/src/main/ObfuscationSettings.java index c07e45a..06477a5 100644 --- a/src/main/ObfuscationSettings.java +++ b/src/main/ObfuscationSettings.java @@ -2,6 +2,9 @@ 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; @@ -20,7 +23,7 @@ public class ObfuscationSettings { private final List ignoreClassList; private final List ignoreMemberName; private final List ignorePackage; - private final List needReCorrect; + private final List ignoreMemberInClass; public static void initSettings(ObfuscationSettings settings) { @@ -38,110 +41,122 @@ public ObfuscationSettings(boolean obfuscateLocalVars, boolean obfuscatePackages this.ignoreClassList = new ArrayList(); this.ignoreMemberName = new ArrayList(); this.ignorePackage = new ArrayList(); - this.needReCorrect = new ArrayList(); - - 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"); - - 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"); - //this.ignoreClassList.add(""); - //this.ignoreClassList.add(""); - //this.ignoreClassList.add(""); - //this.ignoreClassList.add(""); - //this.ignoreClassList.add(""); - //this.ignoreClassList.add(""); - //this.ignoreClassList.add(""); - //this.ignoreClassList.add(""); - //this.ignoreClassList.add(""); - //this.ignoreClassList.add(""); - //this.ignoreClassList.add(""); - //this.ignoreClassList.add(""); - //this.ignoreClassList.add(""); - //this.ignoreClassList.add(""); - //this.ignoreClassList.add(""); - //this.ignoreClassList.add(""); - //this.ignoreClassList.add(""); - //this.ignoreClassList.add(""); - //this.ignoreClassList.add(""); - //this.ignoreClassList.add(""); - //this.ignoreClassList.add(""); - //this.ignoreClassList.add(""); - //this.ignoreClassList.add(""); - //this.ignoreClassList.add(""); - //this.ignoreClassList.add(""); + 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"); - // this.ignoreMemberName.add("ShortcutModesReset"); - // this.ignoreMemberName.add("FreeInsideItems"); - // this.ignoreMemberName.add("FreeOutsideItems"); - // this.ignoreMemberName.add("Low"); - // this.ignoreMemberName.add("High"); - // this.ignoreMemberName.add("ConstructShortcutModes"); - // this.ignoreMemberName.add("OnTaskClick"); - // this.ignoreMemberName.add("KillHeroId"); - // this.ignoreMemberName.add("Level"); - // this.ignoreMemberName.add("NeedExp"); - // this.ignoreMemberName.add("execute"); - // this.ignoreMemberName.add("end"); - // this.ignoreMemberName.add("WAIT"); - // this.ignoreMemberName.add("NONE"); - // this.ignoreMemberName.add("commit"); - // this.ignoreMemberName.add("halt"); - // this.ignoreMemberName.add("IsOn"); - // this.ignoreMemberName.add("EndTime"); - // this.ignoreMemberName.add("DayTime"); - // this.ignoreMemberName.add("CurStatus"); - // this.ignoreMemberName.add("Status"); - // this.ignoreMemberName.add("Count"); - // this.ignoreMemberName.add("Max"); - // this.ignoreMemberName.add("Min"); - // this.ignoreMemberName.add("THyperStringElement"); - // this.ignoreMemberName.add("Desc"); - // this.ignoreMemberName.add("RenderingPerform_Gauge"); - // this.ignoreMemberName.add("createTo"); - // this.ignoreMemberName.add("state"); - // this.ignoreMemberName.add("destory"); - // this.ignoreMemberName.add("StartTime"); - // this.ignoreMemberName.add("Dereference"); - // this.ignoreMemberName.add("Reference"); - // this.ignoreMemberName.add("GetInventoryByIndex"); - // this.ignoreMemberName.add("Value"); - //this.ignoreMemberName.add(""); - //this.ignoreMemberName.add(""); - //this.ignoreMemberName.add(""); - //this.ignoreMemberName.add(""); + 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(){ @@ -175,6 +190,11 @@ 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) { From 7ab648b138a0f8e6843ef14a099a747903d81c04 Mon Sep 17 00:00:00 2001 From: hacrot3000 Date: Thu, 27 Oct 2022 10:37:29 +0700 Subject: [PATCH 3/8] Update readme --- README.md | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index e5b0b76..61da3e2 100644 --- a/README.md +++ b/README.md @@ -90,6 +90,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 +106,16 @@ 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. From 036cbf65dcfb8e32677fa9c3f29c8c01e3e0482b Mon Sep 17 00:00:00 2001 From: hacrot3000 Date: Fri, 28 Oct 2022 14:14:23 +0700 Subject: [PATCH 4/8] Consider private functions/properties, protected properties are local variable, so event class is listed in the ignoreclass this tool still rename them --- Obfuscator.jar | Bin 56207 -> 59521 bytes src/asformat/CodeParser.java | 1 + src/classes/ActionScriptClass.java | 18 ++-- .../interpreters/MemberInterpreter.java | 16 +++- src/classes/makechange/RenamingExecuter.java | 2 +- src/classes/renaming/MemberRenamer.java | 89 ++++++++++++------ src/data/Variable.java | 49 +++++++++- src/main/Obfuscate.java | 2 +- src/main/ObfuscationSettings.java | 2 +- 9 files changed, 139 insertions(+), 40 deletions(-) mode change 100755 => 100644 Obfuscator.jar diff --git a/Obfuscator.jar b/Obfuscator.jar old mode 100755 new mode 100644 index 686be102004df95b768bdf6e4ce63002e90987b3..0350a9d2b2e32747256df9087f1f1fc917e1176c GIT binary patch delta 56107 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 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 ef59bcb..a10299b 100644 --- a/src/classes/ActionScriptClass.java +++ b/src/classes/ActionScriptClass.java @@ -220,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; } @@ -449,11 +460,6 @@ public void setClassName(String className) { //_renamed = false; _classNameRenamed = true; } - - if (ObfuscationSettings.isIgnoredMemberInClass(className)) - { - _renamed = true; - } } @Override 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 3f2b88d..53c709d 100644 --- a/src/classes/makechange/RenamingExecuter.java +++ b/src/classes/makechange/RenamingExecuter.java @@ -304,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 2ca5375..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,10 +81,14 @@ 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) { @@ -89,18 +99,6 @@ public static int renameAllMembers(int index, ArrayList members, IClas continue; } - /* DuongTC - String dNewname = UniqueStringCreator.getDictUniqueName(oldName); - - if (dNewname != null) - { - override.rename(dNewname); - takenNames.add(override.getName()); - - continue; - } - */ - Variable valr = superClass.askVariable(oldName); if (valr == null) { @@ -130,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; @@ -145,9 +148,39 @@ public static int renameAllMembers(int index, ArrayList members, IClas } } + 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) { diff --git a/src/data/Variable.java b/src/data/Variable.java index b6cc03c..3e1795e 100644 --- a/src/data/Variable.java +++ b/src/data/Variable.java @@ -22,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); @@ -97,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; } @@ -137,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; } @@ -145,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 520f68a..1748fcd 100644 --- a/src/main/Obfuscate.java +++ b/src/main/Obfuscate.java @@ -285,7 +285,7 @@ private void setArgs(String[] args) { UniqueStringCreator.length = 10; } - boolean localVars = false; //a.indexOf("-nolocal") == -1; + boolean localVars = a.indexOf("-nolocal") == -1; boolean packages = a.indexOf("-nopackages") == -1; boolean classNames = a.indexOf("-noclasses") == -1; boolean uniqueRenaming = a.indexOf("-nouniquenames") == -1; diff --git a/src/main/ObfuscationSettings.java b/src/main/ObfuscationSettings.java index 06477a5..b48da9d 100644 --- a/src/main/ObfuscationSettings.java +++ b/src/main/ObfuscationSettings.java @@ -155,7 +155,7 @@ public ObfuscationSettings(boolean obfuscateLocalVars, boolean obfuscatePackages } catch (Exception e) { // TODO: handle exception } - } + } } From 90a6c57a59eeb0ce5c21941e9f1ffbcb6afcfd08 Mon Sep 17 00:00:00 2001 From: hacrot3000 Date: Fri, 28 Oct 2022 14:20:47 +0700 Subject: [PATCH 5/8] Update README.md --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index 61da3e2..ee33e4e 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:** From c205b962bd7ac6d21fdb2735ce62b121d13a5671 Mon Sep 17 00:00:00 2001 From: hacrot3000 Date: Fri, 28 Oct 2022 14:23:45 +0700 Subject: [PATCH 6/8] Add sample ignore file --- ignoreclass.txt | 1 + ignorepackage.txt | 0 ignorerenamememberinclass.txt | 0 ignorevarname.txt | 0 4 files changed, 1 insertion(+) create mode 100644 ignoreclass.txt create mode 100644 ignorepackage.txt create mode 100644 ignorerenamememberinclass.txt create mode 100644 ignorevarname.txt 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 From 40d1650cec2d53e783f05a3cf7b1e7acb303c9ae Mon Sep 17 00:00:00 2001 From: hacrot3000 Date: Fri, 28 Oct 2022 14:26:09 +0700 Subject: [PATCH 7/8] Add .gitignore --- .gitignore | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .gitignore 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 + From 49543f81f144307e7cb4caf29d448ae8e6a1b727 Mon Sep 17 00:00:00 2001 From: hacrot3000 Date: Fri, 28 Oct 2022 15:52:39 +0700 Subject: [PATCH 8/8] Update readme --- README.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index ee33e4e..9cd9f34 100644 --- a/README.md +++ b/README.md @@ -121,6 +121,13 @@ Unsupported: Without a type the variable or function cannot be referenced correctly, look out for warnings when you compile your original code for this. 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();