Zelix KlassMaster - Documentation
 

The ZKM Script Language

The ZKM Script language is used to write scripts that automate the process of using Zelix KlassMaster. They allow you to integrate Zelix KlassMaster™ into your development procedures. A quick way to experiment with and learn the language is by using the interactive "ZKM Script Helper" tool.

A ZKM Script consists of a sequence of comments and ZKM Script statements. White space is ignored and note that ZKM Script is case sensitive. ZKM Script comments are identical to Java comments. You can use "//" to comment a line or "/* ... */" to comment a block.

Preprocessor directives are not part of the ZKM Script language. They are actioned by the preprocessor prior to the ZKM Script being parsed and executed. The ZKM Script interpreter doesn't understand and normally will never see preprocessor directives.

In describing the syntax of ZKM Script statements the following notation is used:
  • X | Y | Z means X or Y or Z
  • [X] means X is optional
  • (X)* means zero or more occurrences of X
  • (X)+ means one or more occurrences of X
  • X means X is a key word

A ZKM Script statement is always terminated by a ";". The ZKM Script statements are:
 

An example using every statement and parameter with color coding


/*****************************************************************************/
/* Sample ZKM Script using every statement and parameter                     */
/*****************************************************************************/

classpath   ".;c:\jdk1.8.0\jre\lib\rt.jar";

ignoreMissingReferences   pack9.Class9 *(*); //ignore missing methods in pack9.Class9
                                             //must precede the open statement

open  openNestedArchives=true //open nested archives. This is the default.
      "c:\directory1\Class1.class" //load a specific class
      "c:\directory1\MyZip.zip"    //load all classes in a zip file
      "c:\directory1\MyJar.jar"    //load all classes in a jar file
      "c:\directory2"              //load all classes in a specific directory
      "c:\directory3\*";           //load all classes in a directory and its subdirectories

trimExclude pack1.Class1^ public static main(java.lang.String[]) and
            pack2.*.* public *(*);  

trimUnexclude pack2.pack3.* public method(*); //Don't exclude public methods in pack2.pack3

trim        deleteSourceFileAttributes=false  //could be omitted. Default is false
            deleteDeprecatedAttributes=true   //could be omitted. Default is true
            deleteAnnotationsAttributes=false //could be omitted. Default is false
            deleteExceptionAttributes=false //could be omitted. Default is false
            deleteUnknownAttributes=false;    //could be omitted. Default is false 

removeMethodCallsInclude java.lang.System print*(*); //Remove System print calls

//Don't remove printStackTrace calls
removeMethodCallsExclude java.lang.System printStackTrace(*);

removeMethodCalls java.lang.System printStackTrace(*); //Remove the specified method calls

//Remove effect of preceding removeMethodCallsInclude & removeMethodCallsExclude
resetRemoveMethodCalls; 

exclude     p*2.* and
            p*.C*1 and
            *.Class2 implements pack3.Class3, pack4.Class4 and
            @pack2.MyAnnotation *.* @pack2.MyAnnotation *(@*.* int, *) and
            public abstract *.* private transient java.lang.String f* and
            *.* extends pack2.Class2 public native m*(*) and
            *.<link>_Skel implements pack3.Class3 search pack4, pack4.p*5;

unexclude   pack2.Class4; //Don't exclude pack2.Class4

obfuscateFlowExclude 
   pack2.Class2 method1() and //Don't flow obfuscate method1() in Class2
   pack1.* *(*) and //Don't flow obfuscate any method in package pack1
   pack1.*; //Don't flow obfuscate methods or add special members to pack1 classes

obfuscateFlowUnexclude pack1.Class0 foo(int); //Unexclude method "foo(int)" in pack1.Class0

stringEncryptionExclude pack2.Class2 and //Don't string encrypt any String literals in Class2
                        *.* public *; //Don't string encrypt the value of any public field

stringEncryptionUnexclude pack2.Class2 foo; //Unexclude field "foo" in pack2.Class2


integerEncryptionExclude pack2.Class2 and //Don't encrypt any integer constants in Class2
                        *.* public *; //Don't integer encrypt the value of any public field

integerEncryptionUnexclude pack2.Class2 foo; //Unexclude field "foo" in pack2.Class2


longEncryptionExclude pack2.Class2 and //Don't encrypt any long constants in Class2
                        *.* public *; //Don't long encrypt the value of any public field

longEncryptionUnexclude pack2.Class2 foo; //Unexclude field "foo" in pack2.Class2

//Changes to pack2.Class2 must be Serialization compatible
existingSerializedClasses pack2.Class2; 

fixedClasses pack2.Class2; //Insulates pack2.Class2 from any obfuscation

groupings {pack1.* and pack2.*}   //1st grouping contains pack1 and pack2 classes
          {pack3.* and pack4.*};  //2nd grouping contains pack3 and pack4 classes

//Asserts that ClassA always initialized before ClassB
classInitializationOrder pack3.ClassA > pack3.ClassB; 

//All methods in pack1.Class2 named "foo" accessed by Reflection
accessedByReflection pack1.Class2 foo(*); 

accessedByReflectionExclude pack1.Class2 foo(int[]);  //foo(int[]) NOT accessed by Reflection

//Obfuscate all references to a java.lang.System method contained in class "pack0.Class0"
obfuscateReferencesInclude containedIn{pack0.Class0 *(*)} java.lang.System *(*); 

//Exclude references to any method named "println" in java.lang.System that 
//are contained in class "pack0.Class0"
obfuscateReferencesExclude  containedIn{pack0.Class0 *(*)} java.lang.System println(*);

//All methods in pack1.Class3 named "bar"
methodParameterChangesInclude pack1.Class3 bar(*); 

methodParameterChangesExclude pack1.Class3 bar(int[]);  //Exclude bar(int[])

//All methods in pack1.Class3 named "bar"
methodParameterObfuscationInclude pack1.Class3 bar(*); 

methodParameterObfuscationExclude pack1.Class3 bar(int[]);  //Exclude bar(int[])

obfuscate changeLogFileIn="ChangeLogIn.txt" //omit parameter if no input change log
          changeLogFileOut="ChangeLog.txt" //could be omitted. Default is ChangeLog.txt
          aggressiveMethodRenaming=false      //could be omitted. Default is false
          keepInnerClassInfo=false            //could be omitted. Default is false
          keepGenericsInfo=true               //could be omitted. Default is true
          obfuscateFlow=light                 //could be omitted. Default is light
          encryptStringLiterals=enhanced      //could be omitted. Default is enhanced
          encryptIntegerConstants=aggressive  //Default is none
          encryptLongConstants=normal         //Default is none
          exceptionObfuscation=light          //could be omitted. Default is light
          autoReflectionHandling=normal //Default is none for backwards compatibility
          autoReflectionPackage="pack0" //Put autoReflection lookup class into package "pack0"
          autoReflectionHash="SHA-512"  //Use SHA-512 hash in autoReflection lookup class
          collapsePackagesWithDefault="xyz" //Default is to not collapse packages
          obfuscateReferences=normal;       //Obsfuscate references
          obfuscateReferenceStructures=inSpecialClass //Default is to use a special class
          obfuscateReferencesPackage="pack0" //Put special lookup class into package "pack0"
          lineNumbers=delete                //could be omitted. Default is delete
          localVariables=delete             //could be omitted. Default is delete
          methodParameters=keepVisible      //could be omitted. Default is keepVisible
          mixedCaseClassNames=ifInArchive   //could be omitted. Default is ifInArchive
          newNameCharacters=ASCII           //could be omitted. Default is ASCII
          newNamesPrefix="Z"                //Prefix all newly generated names with "Z"
          randomize=false                   //could be omitted. Default is false
          uniqueClassNames=false            //could be omitted. Default is false
          uniqueMethodNames=false            //could be omitted. Default is false
          newPackageNameFile="obfuscatedPackageNames.txt" //List of obfuscated package names
          newClassNameFile="obfuscatedClassNames.txt" //List of obfuscated class names
          newFieldNameFile="obfuscatedFieldNames.txt" //List of obfuscated field names
          newMethodNameFile="obfuscatedMethodNames.txt" //List of obfuscated method names
          allowMethodParameterChanges=false //Deprecated - Use methodParameterChanges instead.
          methodParameterChanges=none //could be omitted. Default is none
          methodParameterChangesPackage="pack0" //Put lookup class into package "pack0"
          obfuscateParameters=none //could be omitted. Default is none
          makeClassesPublic=false //could be omitted. Default is false
          allClassesOpened=true             //could be omitted. Default is true
          deriveGroupingsFromInputChangeLog=false //could be omitted. Default is false
          keepBalancedLocks=false           //could be omitted. Default is false
          preverify=true                    //could be omitted. Default is true
          assumeRuntimeVersion="8"          //Default derived from lowest opened class version
          legalIdentifiers=true             //Deprecated
          hideFieldNames=false              //Deprecated
          hideStaticMethodNames=false;      //Deprecated

resetTrimExclusions;          //remove the effect of any preceding trimExclude statement

resetExclusions;              //remove the effect of any preceding exclude statement

resetObfuscateFlowExclusions; //remove effect of any preceding obfuscateFlowExclude statement

resetStringEncryptionExclusions; //remove effect of any preceding stringEncryptionExclude

resetIntegerEncryptionExclusions; //remove effect of any preceding integerEncryptionExclude

resetLongEncryptionExclusions; //remove effect of any preceding longEncryptionExclude

resetExistingSerializedClasses; //remove effect of any preceding existingSerializedClasses

resetFixedClasses; //remove effect of any preceding fixedClasses

resetGroupings; //remove effect of any preceding groupings

resetClassInitializationOrder; //remove effect of any preceding classInitializationOrder

//remove effect of any preceding accessedByReflection and accessedByReflectionExclude
resetAccessedByReflection;  

//remove effect of any preceding obfuscateReferencesInclude and obfuscateReferencesExclude
resetObfuscateReferenceExclusions; 

resetIgnoreMissingReferences; //remove effect of any preceding ignoreMissingReferences

//remove effect of any preceding methodParameterChangeInclude or methodParameterChangeExclude
resetMethodParameterChangesExclusions; 

//remove effect of any preceding methodParameterObfuscationInclude 
//or methodParameterObfuscationExclude
resetMethodParameterObfuscationExclusions; 
									  
exclude     *. and          //exclude all packages
            *.* and         //exclude all classes
            *.* * and       //exclude all fields
            *.* *(*);       //exclude all methods

gc 500;     //500 could have been omitted. 500ms sleep is the default.

print       "About to obfuscate a second time";     //prints to standard out and the log

obfuscate; //Using implicit defaults

execute     "deltree /Y c:\Temp"; //executes a simple OS command

saveAll archiveCompression=asIs 
        deleteEmptyDirectories=false 
        deleteXMLComments=false 
        "c:\Temp";    
 
Documentation Table of Contents
Zelix KlassMaster - Java Obfuscator