Zelix KlassMaster - Java Obfuscator

Change History

In descending chronological order and with the major releases underlined.

Version 5.1 release 1 (29 Apr 2008)

  • Stops the creation of an empty file named "Z_log.txt".

Version 5.1 release 0 (07 Dec 2007)

  • Now requires a Java 5 (i.e. JDK 1.5) JVM to run.
  • Enhanced to exclude statement to allow the the exclusion of method name prefixes such as get or set. The names of the methods with matching prefixes are then "linked" to the name of a matching field. See the exclusions tutorial for more detail.
  • Enhanced the obfuscate statement by adding the localVariables parameter. When the localVariables parameter is set to keepVisibleMethodParameters, the method parameter variable names are retained. This is of use when obfuscating a library that will be used within an IDE.
  • Introduces the ZKM_FIXED_TOTALLY_UNCHANGED configuration option that allows you to tell Zelix KlassMastertm to copy across any classes that you have specified as "fixed" completely unchanged.
  • Enhanced the fixed classes functionality so that the line numbers of a specified class are never scrambled.
  • Enhanced to open statement's "skip" syntax so that you can tell Zelix KlassMaster to not open a specified class file in an archive file. The new syntax is the -"x.jar!com/mycompany/MyClass.class".
  • Enhanced to open statement's "skip" functionality so that skipped archives or class files are automatically added to the effective classpath.
  • Introduces the ZKM_REFLECTION_WARNINGS configuration option that allows you to supress Reflection API warnings in the Zelix KlassMastertm log.
  • Introduces the ZKM_CREATE_BACKUP configuration option that allows you to prevent overwritten JAR files being backed up with the .BACKUP extension.
  • Other minor changes and bug fixes.

Version 5.0 release 7 (01 Nov 2007)

  • Corrected a bug that could cause a NullPointerException in the incremental obfuscation of very complex class hierarchies.

Version 5.0 release 6 (22 Oct 2007)

  • Corrected a bug that prevented the renaming of single classes interactively using the GUI.

Version 5.0 release 5 (19 Oct 2007)

  • Corrected a bug that could cause a NullPointerException in input change log processing.
  • Corrected a bug that resulted the default directory specification being ignored in some circumstances in classpath processing.

Version 5.0 release 4 (26 Sep 2007)

  • Corrected a bug that could cause a NullPointerException in input change log processing.

Version 5.0 release 3 (07 Jun 2007)

  • Corrected a bug that could cause problems with class suffix and prefix (i.e. <link>) exclusions.

Version 5.0 release 2 (19 Jan 2007)

  • Corrected a bug that could cause an inappropriate "WARNING: Input change log <ChangeLogName> : Package <PackageName> no longer appears in the opened classes and will be assumed to be no longer used" message.

Version 5.0 release 1 (11 Dec 2006)

  • Corrected a bug that could cause an inappropriate "Check <link> search paths" message.
  • Other minor changes and bug fixes.

Version 5.0 release 0 (15 Nov 2006)

  • Now requires a JDK 1.4 JVM to run.
  • Enhanced to process Java 6 (JDK 1.6) classes. Obfuscated Java 6 bytecode will run correctly even if the -XX:-FailOverToOldVerifier JVM parameter is used.
  • Enhances the ZKM Script exclusion statements such as trimExclude and exclude to allow exclusion based on class, field, method and method parameter annotations. Allows better automatic handling of EJB 3 applications.
  • Enhances Incremental Obfuscation functionality to allow only part of an application to be opened. Requires the use of the new allClassesOpened parameter with the obfuscate statement.
  • Enhances Incremental Obfuscation functionality so that any line number mappings present in an input change log will be enforced provided line number scrambling is specified in the corresponding obfuscate statement.
  • Enhances the obfuscate statement by adding the randomize parameter which allows you to specify that new obfuscated name generation should be random (i.e. not consistent across releases).
  • Enhances the obfuscate statement by adding the deriveGroupingsFromInputChangeLog parameter.
  • Changes the default for the trim statement deleteAnnotationAttributes parameter from true to false.
  • Changes the default for the obfuscate statement keepGenericsInfo parameter from false to true.
  • ZKMTask Ant task enhanced to allow easy setting of System properties
  • Classpath functionality enhanced to search archives nested within other archives.
  • Other minor changes and bug fixes.

Version 4.5 release 1 (12 July 2006)

  • Enhances the handling of XML files.
  • Corrects a bug in the ZKM Script open statement's nested archive exclusion.
  • Other minor changes and bug fixes.

Version 4.5 release 0 (19 April 2006)

  • Enhances Trim functionality by automatically excluding classes and some fields referenced by manifest or XML files.
  • Enhances the ZKM Script classpath statement by allowing wildcards in the final qualifier of a file path. (e.g /lib/*.jar)
  • Enhances the ZKM Script open statement by allowing wildcards in the final file name when excluding nested archives. (e.g -"x.ear!y.war!WEB-INF/lib/*.jar")
  • Introduces the ZKM_RANDOMIZE_OBFUSCATION configuration option that allows you to specify that new obfuscated name generation should be random (i.e. not consistent across releases).
  • Corrects a NullPointerException which could occur in processing XML files during obfuscation.
  • Other minor changes and bug fixes.

Version 4.4 release 6 (02 November 2005)

  • Corrects bugs in the trimming and obfuscation of annotation attributes.
  • Corrects a NullPointerException which could occur during obfuscation.
  • Other minor changes and bug fixes.
Sub-releases:
  • release 4a
    • Reports a fatal error if a file directly specified in a ZKM Script "open" statement
      • does not exist or
      • has an unrecognized file name suffix.
    • Corrects an ArrayIndexOutOfBoundsException which could occur when opening certain unusual classes.
    • Corrects a bug present since version 4.4.0 which prevented the "-dte" command line parameter from being processed.
  • release 4b
    • Corrects a NullPointerException which could occur during Name Obfuscation.
  • release 4c
    • Corrects a bug in the processing of some generics involving wildcards.
  • release 4d
    • Enhances the Change Log API.
  • release 4e
    • Enhances the Change Log API.
  • release 4f
    • Enhances the Change Log API.

Version 4.4 release 5 (12 October 2005)

  • Enhances Incremental Obfuscation to better handle the introduction of new fields in superclasses and interfaces.
  • Improves reporting of ZKM Script warning and message counts to the command line.
  • Other minor changes and bug fixes.

Version 4.4 release 4 (12 August 2005)

  • Corrects a NullPointerException that could occur when obfuscating bytecode containing "dead code".
  • Improves error reporting when obfuscating certain corrupted bytecode files.
Sub-releases:
  • release 4a
    • Corrects a spurious "ERROR: input change log '<changeLogName>': Class '<className>' appears more than once" message that could occur in very unusual circumstances.
  • release 4b
    • Corrects a StackOverflowError that could occur with certain complex exception handling.

Version 4.4 release 3 (19 July 2005)

  • Corrects a bug that could cause Zelix KlassMaster to perform very poorly when opening classes with certain unusually complex methods.

Version 4.4 release 2 (17 June 2005)

  • Introduces the -ro command prompt option to allow you to redirect stdout to a file.
  • Enhances the Zelix KlassMaster build tool API to allow you to redirect stdout and/or stderr to files.
  • Reports an error rather than a fatal error if part of the classpath in a ZKM Script "classpath" statement is invalid.
  • Other minor changes and bug fixes.
Sub-releases:
  • release 2a
    • Corrects a NullPointerException bug in the "Obfuscate Options" dialog.

Version 4.4 release 1 (24 May 2005)

  • Corrects a bug in the handling of UTF-16 XML files.
  • Other minor changes and bug fixes.

Version 4.4 release 0 (20 April 2005)

Version 4.3 release 6 (01 December 2004)

  • Corrects bugs in the handling of Annotations that could cause errors like "Invalid type index" or "Wrong type at constant pool index".
Sub-releases:
  • release 6a
    • Corrects a bug in the handling of complex annotations.
  • release 6b
    • Corrects a bug in Input Change Log processing which could occur if no methods appear in the change log.
  • release 6d
    • Corrects a bug in the handling of enums.

Version 4.3 release 5 (13 November 2004)

  • Corrects a bug that could cause an ArrayIndexOutOfBoundsException when trimming or obfuscating bytecode generated with the new JDK 1.5.
  • Other minor changes and bug fixes.

Version 4.3 release 4 (16 September 2004)

  • Corrects a bug that could cause a ClassCastException when trimming bytecode generated with the new JDK 1.5.
  • Other minor changes and bug fixes.

Version 4.3 release 3 (05 September 2004)

  • Enhances the obfuscate statement by adding the newNamesPrefix parameter that allows you to specify a prefix for all new obfuscated package, class, field and method names.
  • Corrects a bug that could cause the Flow Obfuscation function to run very inefficiently when processing very deep implementation hierarchies.
  • Introduces the ZKM_NEW_CHANGE_LOG_ENCODING configuration option that allows you to specify the character encoding to be used when generating a change log.

Version 4.3 release 2 (08 July 2004)

  • Allows you to choose whether you use aggressive method renaming. Aggressive method renaming was introduced with Zelix KlassMaster 4.3 and was initially switched on by default.
  • Improves error handling in Zelix KlassMaster's XML parser.
  • Fixes a bug in the way Zelix KlassMaster writes to JAR files.
  • Other minor changes and bug fixes.

Version 4.3 release 1 (29 June 2004)

  • Fixes a bug that could cause XML files to be written to the obfuscated archive using the wrong character encoding.
  • Enhances the open statement with the -"x.ear!y.war!z.jar" syntax so that you can tell Zelix KlassMaster to not open a specified nested archive file.

Version 4.3 release 0 (16 June 2004)

  • Enhanced to support bytecode generated with the JDK 1.5 including
    • ability to specify whether annotation attributes should be removed. The "deleteAnnotationAttributes" parameter has been added to the trim statement and "delete annotation attributes" option has been added to the Trim Options dialog.
    • ability to specify whether generics information should be removed. The "keepGenericsInfo" parameter has been added to the obfuscate statement and "keep generics information" option has been added to the Obfuscate Options dialog.
  • Adds the ability to retain inner class information only if the inner class has not been name obfuscated. The obfuscate statement's "keepInnerClassInfo" parameter has been given an extra value of "ifNameNotObfuscated".
  • Enhanced control flow analysis.
  • Other minor changes and bug fixes.

Version 4.2 release 4 (05 April 2004)

  • Corrects a bug that could result in a VerifyError in MIDlets obfuscated using the Zelix KlassMaster Wireless ToolKit Obfuscator Plugin.

Version 4.2 release 3 (11 March 2004)

  • Works around a bug in the IBM JVM 1.4 that could cause a VerifyError or IncompatibleClassChangeError in certain circumstances.

Version 4.2 release 2 (13 January 2004)

  • Corrects a NullPointerException that could occur during String encryption in certain unusual circumstances.

Version 4.2 release 1 (22 December 2003)

  • Corrects a NullPointerException that could occur when a class name is matched by
    • an unresolved exclude statement <link> parameter and
    • an existingSerializedClasses or a fixedClasses statement.

Version 4.2 release 0 (11 November 2003)

  • Enhances effectiveness the name obfuscation function by allowing the package structure to be collapsed. See the collapse packages documentation for more detail.
  • Allows J2ME MIDlets to be obfuscated AFTER preverification. This simplifies the integration of Zelix KlassMaster into the J2ME build process. See the J2ME obfuscation tutorial for more detail.
  • Attempts to automatically handle unrecognized, non-standard attributes within the bytecode.
  • Improves the handling of String literals containing relative resource file paths.
  • Name obfuscation enhanced to automatically exclude the name of the outer class if the name of an inner class has been excluded from being renamed and inner class format is being retained.
  • Other minor changes and bug fixes.

Version 4.1 release 2 (15 September 2003)

  • Corrects a bug that could cause an OutOfMemoryError if retaining inner class format when obfuscating.
Sub-releases:
  • release 2a
    • Corrects a bug that occurred when an identical class file was opened from different archives. The obfuscated class file was not being copied to each corresponding new archive.

Version 4.1 release 1 (05 August 2003)

  • Corrects a NullPointerException that could occur when opening classes which used the Reflection API to access a field named "TYPE".

Version 4.1 release 0 (24 July 2003)

  • Enhances String encryption to dramatically reduce
    • its runtime performance impact,
    • its side effects.
  • Replaces the Change Log Translate tool with the Stack Trace Translate tool which
    • translates an entire stack trace as a whole rather than one line at a time,
    • can analyze the obfuscated bytecode to greatly improve the quality of the translation,
    • has a Java API for programmatic access.
  • Introduces the ZKM Script unexclude statement which operates on the results of preceding exclude statements to allow finer control of name obfuscation exclusions.
  • Introduces the ZKM Script trimUnexclude statement which operates on the results of preceding trimExclude statements to allow finer control of trim exclusions.
  • Adds a Sun J2ME Wireless Toolkit plugin.
  • Adds the "-tl", "-de", "-dte" and "-dd" start up parameters to allow the specification of alternative trim log, default exclusion and default trim exclusion files.
  • Automatically updates the directory qualifiers of Strings that refer to resource files to reflect obfuscated package names.
  • Enhances the Reflection API analysis so that the Trim function works better with bytecode compiled with the Jikes compiler.
  • Corrects the ZKM Script trim statement so that it takes account of preceding fixedClasses and exisitingSerializedClasses statements.
  • Simplifies the Classpath dialog.
  • Fixes a bug in the Trim function that prevented "unknown" attributes from being removed from fields and methods if the deletion of unknown attributes was specified.
  • Other minor changes and bug fixes.

Version 4.0 release 5 (16 June 2003)

  • Corrects a bug that could cause a spurious "Stack mismatch with types: ..." error when obfuscating classes compiled with Jikes.

Version 4.0 release 4 (18 April 2003)

  • Corrects a bug that prevented the ZKM Script "execute" statement from working in Windows XP.
  • Other minor changes and bug fixes.
Sub-releases:
  • release 4a
    • Works around a JBuilder problem that can occur when obfuscating inner class names.
  • release 4b

Version 4.0 release 3 (15 Jan 2003)

  • Corrects a bug in the Trim function that could result in the inappropriate removal of some methods in certain unusually complex inheritance and implementation hierarchies.
  • Broadens the exclusion parameters associated with the "Non-extensible class library" and "Extensible framework" application types on the "Trim Exclusions" and "Name Exclusions" windows.
  • Other minor changes and bug fixes.

Version 4.0 release 2 (10 Jan 2003)

  • Corrects a bug in the "Open Dialog Helper - Open Classes" window where clicking on the "Cancel" button disabled the browser window menus.
  • Corrects a bug in the Name Obfuscation function that resulted in the fields of interfaces which had no implementors being always unobfuscated.
  • Adds the exclusion of no-argument constructors to the defaultTrimExclude.txt file and to the internal default trim exclusions.

Version 4.0 release 1 (01 Jan 2003)

  • Corrects a performance problem in the Flow Obfuscation function which occurred when obfuscating a number of overlapping JAR files.
  • Corrects a bug in the Flow Obfuscation function which occurred when obfuscating unusually complex overlapping JAR files.
  • Other minor changes and bug fixes.

Version 4.0 release 0 (22 Dec 2002)

  • Introduces the Trim function which removes unused classes, fields and methods. The Trim function consists of a GUI menu option and the new ZKM Script statements trimExclude, resetTrimExclusions and trim.
  • Introduces the GUI Build Helper tool to guide users through the trim and obfuscate process.
  • Introduces a help function to the GUI.
  • Conversion of the GUI to Swing with general enhancements for improved functionality and ease of use.
  • Enhancement of the Classpath dialog to allow multiple new items to be selected at once.
  • Obfuscation enhanced to obfuscate the name of an inner class even though the name of the outer class has been excluded from being renamed.
  • the Build tool interface enhanced to allow a Properties object to be passed to Zelix KlassMaster for use in substituting System Variables in the ZKM Script.
  • ZKM Script exclude statement enhanced to allow class exclusion parameters that also exclude all the fields and methods of the matching class. Uses the "+" syntax.
  • ZKM Script classpath statement enhanced to allow paths to be broken up as separate Strings on separate lines.
  • ZKM Script saveAll statement asIs parameter enhanced to work at the level of the individual entries rather than the archive as a whole.
  • Removes the public static main(java.lang.String[]) exclusion parameter from the defaultExclude.txt file and the internal default trim exclusions to allow more precise exclusions. This may make it necessary to modify some existing ZKM Scripts.
  • File paths in ZKM Scripts now automatically translated at the time of execution from Windows format to Unix format and visa versa where possible.
  • Introduces the groupings and resetGroupings statements.
  • Other minor changes and bug fixes.
Sub-releases:
  • release 0a
    • Adds the "*.* static createUI(javax.swing.JComponent)" parameter to the defaultExclude.txt and defaultTrimExclude.txt files,
    • Removes a debug statement from the ZKMTask class included in the distribution.

Version 3.1 release 5 (03 Oct 2002)

  • Enhances the Smart Savetm technology so that it will generically translate class and package names in OSGi style manifest files.
  • Corrects a bug that caused a NullPointerException when opening certain unusual classes.
  • Corrects a bug that could cause an infinite loop when obfuscating extremely complicated class hierarchies.
  • Corrects a bug that could cause a deadlock in the "parameter" sub-dialogs of the "Obfuscate Advanced Name Exclusions Options" dialog.
  • Other minor bug fixes.
Sub-releases:
  • release 5a corrects another bug that could cause an infinite loop when obfuscating extremely complicated class hierarchies.
  • release 5b corrects a bug in the String encryption of public static fields in certain interfaces.
  • release 5c corrects another bug that could cause an infinite loop when obfuscating extremely complicated class hierarchies.
  • release 5d more gracefully handles the scenario where an inner class has been opened for obfuscation but its outer class has not.

Version 3.1 release 4 (29 Aug 2002)

  • Corrects a bug that could cause a StackOverflowError when certain unusual classes are being opened inside Zelix KlassMaster.

Version 3.1 release 3 (12 Jul 2002)

  • Introduces the "light" Flow Obfuscation option. Bytecode flow obfuscated with this option generally
    • has significantly improved performance,
    • is much less vulnerable to JIT compiler bugs that can cause problems in flow obfuscated bytecode.
  • Corrects a bug in the obfuscation of some unusual classes compiled with the Sun JDK 1.4. The bug resulted in a NoSuchMethodError when the obfuscated bytecode was executed.
  • Enhances the ZKM Script language, the Input Change Log functionality and the Change Log Translate tool so that they handle all Latin-1 characters that can legally be part of a Java identifier.
  • Layout changes to improve the appearance and functionality of the Zelix KlassMaster GUI when run on Mac OS X.
  • Other minor bug fixes.

Version 3.1 release 2 (22 May 2002)

  • Enhances the GUI classpath dialog.
  • Corrects bugs in the existingSerializedClasses functionality that
    • caused a "java.lang.ClassFormatError: ... (Illegal field modifiers: 0x18)" error in certain classes,
    • caused a java.lang.ClassNotFoundException exception on deserialization of certain classes.
  • Improves Zelix KlassMaster's ability to correctly set its default classpath in Mac OS X.
  • Modifies the default exclusions so that
    • public EJB Remote interface and Bean class methods are excluded from being renamed,
    • the names of native method argument classes are excluded from being renamed.
    .
  • Other minor bug fixes.

Version 3.1 release 1 (27 Mar 2002)

  • Duplicates the ZKM class inside the package com.zelix so that it can be accessed by build tool classes. The JDK 1.4.0 Java compiler will not allow a class in the default package to be accessed from a class in some other package.
  • Corrects a bug that caused a NullPointerException when opening certain classes.
  • Corrects a bug that caused a ClassCastException if Zelix KlassMaster was run in verbose mode when the System Properties contained non-String keys or values.
  • Other minor bug fixes.
Sub-releases:
  • release 1a includes the class com.zelix.ZKM that was left out of the initial release.

Version 3.1 release 0 (13 Mar 2002)

  • Adds the fixedClasses and resetFixedClasses statements to the ZKM Script language. The fixedClasses statement allows you to effectively insulate specified classes from the effects of obfuscation. Can be useful in some JSP scenarios where the JSP servlet can be recompiled at runtime.
  • Adds the +signatureClasses syntax to the ZKM Script exclude statement. In addition to excluding matching methods' names, the new syntax excludes the fully qualified names of matching method return and parameter classes.
  • Enhances the default exclusions so that all essential RMI exclusions are handled automatically.
  • Corrects a bug in the XML parser's handling of CDATA sections.
  • Other minor bug fixes.

Version 3.0 release 0 (18 Jan 2002)

  • Now requires a Java 2 (JDK 1.2) JVM to run.
  • Complete rewrite of the control flow analysis functionality to improve the effectiveness of flow obfuscation.
  • Flow obfuscation functionality enhanced to automatically handle multiple archive files.
  • Improves automatic handling of Java Reflection API calls.
    • warnings reported only for those calls that could not be automatically handled.
    • limited ability to automatically handle Reflection API calls that access fields or methods by name.
  • Enhances the ZKM Script saveAll statement to give control over archive compression.
  • Improves handling of classes compiled with the Sun JDK 1.4.
  • Corrects a bug in the ZKM Script saveAll statement that prevented an archive from being saved over itself.
  • Corrects a bug in the ZKM Script existingSerializedClasses statement so that interfaces are never treated as existing serialized classes.
  • Changes the handling of class source names in change logs so that they are treated as simple Strings. Works around a problem with invalid source names in some bytecode.
  • Other minor bug fixes and enhancements.

Version 2.7 release 5 (27 Nov 2001)

  • Corrects a flow obfuscation bug that could cause a "Incompatible object argument for method call" VerifyError.
  • Slightly increases the possibility of flow obfuscation in simple methods.
Sub-releases:
  • release 5a corrects a bug that resulted in a "Stack mismatch with primitive types" message at the time of flow obfuscation of certain complex methods.

Version 2.7 release 4 (14 Nov 2001)

  • Corrects ZKM Script bugs that resulted in
    • the exclusion parameter '+' syntax not working for class names.
    • field types in field exclusion parameters being ignored.
  • Other minor enhancements.

Version 2.7 release 3 (05 Sep 2001)

  • Corrects a flow obfuscation bug that can cause a VerifyError in complex methods with unusual exception handling.

Version 2.7 release 2 (18 Jul 2001)

  • Deals with an idiosyncracy in the compiler of the Sun JDK 1.4.0 beta JDK.

Version 2.7 release 1 (12 Jul 2001)

  • Adds the existingSerializedClasses and resetExistingSerializedClasses statements to the ZKM Script language. These statements greatly simplify the obfuscation of classes with pre-existing serialized instances.
  • Enhances the ZKM Script language exclusion statements by allowing complex package, class, field and method name specifications. For example (name* && !(name1 || name2)). See the exclusions tutorial for more detail.
  • Enhances the ZKM Script language exclude statement by
    • introducing the "^" tag that allows "containing object" exclusions in a more general fashion than is currently allowed by the "+" wildcard. See the exclusions tutorial for more detail.
    • allowing an optional prefix to be specified in "class suffix exclude" (ie. <link>) parameters. Again see the exclusions tutorial for more detail.
  • Enhances the handling of JAR manifest entries by copying across non-standard attributes in the entry (ie. not main) sections. If the values of any such attributes are class names then they are translated to the corresponding obfuscated class name.
  • Modifies the standard defaultExclude.txt file by:
    • adding exclusions for RMI/IIOP "Stub" and "Tie" classes.
    • making the existing exclusions for ordinary RMI "Stub" and "Skel" classes more precise to avoid overlap with the new RMI/IIOP exclusions.
    • adding an exclusion for serialization related readObjectNoData methods.
    See the documentation for more detail.
  • Other minor bug fixes and enhancements.

Version 2.6 release 0 (24 Apr 2001)

  • Adds the stringEncryptionExclude and resetStringEncryptionExclusions statements to the ZKM Script language.
  • Enhances the Smart Savetm technology. The principal enhancements are:
    • Automatic handling of WAR (J2EE web applications) and EAR (J2EE application) archive files.
    • Generic translation of non-standard XML files including the translation of attribute values.
    • Saving of all META-INF directory files (except INDEX.LIST and signature files) to the new archive.
    • Handling of nested archive files.
    • Creation of a new archive file as uncompressed if the source archive is uncompressed.
  • Enhancement of the ZKM Script language to allow the embedding of quotes within any String literal. An embedded quote can now be escaped as two quotes (ie. ""). This is particularly useful for the execute statement.
  • Enhances the Name Exclusion Options and Advanced Name Exclusion Options dialogs so that previously entered options are used as the initial defaults.
  • Corrects a bug in the handling of continued lines in META-INF/MANIFEST.MF files.
  • Removes the Unobfuscate tool from the menu of the GUI since it is now obsolete and will not be enhanced.
  • Other minor bug fixes and enhancements.

Version 2.5 release 2 (28 Feb 2001)

  • Corrects a bug in the handling of JAR manifest "Name:" attributes which resulted in a StringIndexOutOfBoundsException when the attribute value was not a class file name.
  • Enhances the handling of JAR manifest entries by copying across non-standard attributes in the main section. If the values of any such attributes are class names then they are translated to the corresponding obfuscated class name.
  • Reduces the stack space required by Zelix KlassMaster's flow obfuscation functionality.

Version 2.5 release 0 (19 Feb 2001)

  • Introduces Smart Savetm which enhances the "save" functionality embodied in the File|SaveAll menu option and the ZKM Script saveAll statement. Details of the new functionality are:
    • class files opened from zip or jar file archives will be saved to a corresponding zip or jar file archive in the nominated save directory,
    • non-class files such as images and properties files, appearing in archive files from which at least one class has been opened, will be copied to the new archives after some path translation,
    • manifest, EJB deployment descriptor and service provider files will be copied across after some name translation.
    • class files opened from the directory system will continue to be saved to corresponding directories as in previous versions.
    See the documentation for more detail.
  • Adds the saveAllOld statement to the ZKM Script language which provides exactly the same functionality as the preexisting saveAll statement.
  • Adds the execute statement to the ZKM Script language. The execute statement allows the execution of basic operating system commands (eg. mkdir) from within a ZKM Script. Again, see the documentation for more detail.
  • Adds a parameter to the default exclusions so that the names of all methods
    • declared in an interface that extends java.rmi.Remote
    • that throw java.rmi.RemoteException
    are, by default, excluded from being changed. This improves automatic support for RMI.
  • Corrects a bug in flow obfuscation that could occur if a fully qualified class name started with character 'L'.
  • Corrects a bug in the ZKM Script "open" statement that caused it to fail to recognize ".zip" and ".jar" extensions unless they were in lower case.

Version 2.4 release 1 (29 Jan 2001)

  • Corrects a minor bug that resulted in change log method signatures being displayed in the change log using the obfuscated class names rather than the original class names.

Version 2.4 release 0 (21 Dec 2000)

  • Enhances the Input Change Log and Flow Obfuscation functionalities to allow true incremental obfuscation of flow obfuscated bytecode. All classes must still be opened inside Zelix KlassMaster at the time of re-obfuscation but only the changed subset of re-obfuscated classes need to be replaced in the existing distribution jar. This allows the distribution of patches.
  • Enhances the ZKM Script interface by introducing a Preprocessor which allows:
    • Inclusion of one ZKM script inside another
    • Substitution of environmental variables.
  • Exposes an API that allows Zelix KlassMaster to be called by build tools such as Apache Ant.
  • Enhances the default exclusions to exclude the renaming of certain EJB methods (eg. "create(*)" and "ejbCreate(*)").
  • Corrects a bug in the Flow Obfuscation functionality that could cause IllegalAccessErrors if the flow obfuscated classes were run in application environments that used more than one class loader. This is typical of EJB server environments.
  • Corrects a bug in the Flow Obfuscation functionality that could cause a runtime verification error of the form "Accessing value from uninitialized register" if more than 4,095 classes were opened at the time of obfuscation.
  • Relaxes the parsing of input change logs to work around a bug in some Java compilers that use a fully qualified path in the class file SourceFile attribute of the form "pack1/pack2/ClassName.java".

Version 2.3 release 2 (28 Aug 2000)

  • Enhances the name obfuscation functionality so that Zelix KlassMaster will always produce constant pool entries with a consistent order regardless of which Java VM is being used. This removes a source of variation that complicated configuration management based upon binary file comparisons.
  • Corrects a bug in the handling of certain interface method references produced by the Jikes Java compiler.
  • Catches exceptions sometimes thrown by the Microsoft VM when the Zelix KlassMaster user options are deserialized.
  • Corrects a bug in the method name exclusion functionality that allowed a method exclusion parameter to take precedence over an input change log entry if the class containing the method name to be excluded didn't appear in the input change log.
  • Corrects a bug in the method name obfuscation functionality that occurred when:
    • a set of interfaces declaring the same method signature were "linked" to each other due to their positions in the inheritance hierarchy,
    • one or more of the interfaces extended another interface that was
      • not opened inside Zelix KlassMaster and
      • declared the same method signature.

Version 2.3 release 1 (09 Jul 2000)

  • Improves the ability of the Flow Obfuscation functionality to obfuscate classes compiled with the JDK 1.3 or Jikes compilers.
  • Provides support for the draft second edition of the Java Language Specification. (The Jikes compiler already supports significant aspects of the draft.) This has involved:
    • Switching off field and static method hiding by default.
    • Adding the "hideFieldNames" and "hideStaticMethodNames" parameters to the ZKM Script "obfuscate" statement so that hiding can be optionally switched back on.
    Zelix KlassMaster v2.3.0 already provided effective support but there remained a risk that the Input Change Log functionality might not correctly handle all situations. This risk has now been removed regardless of whether or not fields and static methods are hidden.
  • Further improves the handling of very complex interface relationships. This removes a cause of "Assert failed" errors.
  • Corrects a bug that could result in an infinite loop if Zelix KlassMaster encountered certain cyclic interface dependencies.
  • Corrects a bug that could result in VerifyErrors if a method with more than 256 local variables was flow obfuscated.

Version 2.3 release 0 (21 May 2000)

  • Enhances Name Exclusion functionality by allowing:
    • exclusion of class, field and method names that do NOT have a specified modifier (e.g. "!static !transient").
    • exclusion of method names where the method throws a specified exception or one of the exception's subclasses.
  • Introduces Flow Obfuscation Exclusion functionality to the ZKM Script interface to allow specific methods or classes of methods to be excluded from flow obfuscation.
  • Relaxes the parsing of Input Change Logs to allow partial change logs to be used.
  • Introduces the "Flow Obfuscate" option to String Encryption to further protect the String Encryption decrypt methods from decompilation.
  • Corrects the following bugs in the Name Exclusion functionality:
    • exclusions based on "implements" clauses could fail in some cases where classes implemented more than one interface.
    • exclusions based on complex wildcard combinations could sometimes fail.
  • Corrects a bug in the Input Change Log functionality that could result in an "Assert failed" error in applications with complex interface relationships.
  • Corrects a "NullPointerException" error in the Flow Obfuscation functionality that occurred when dead code was found in a particular position within methods.
  • Works around a problem that WebLogic Servlet engines had with String Encrypted classes.
  • Provides improved support for classes compiled using the Jikes compiler.
  • Some GUI layout tweaks to improve cross-platform consistency.
Sub-releases:
  • Release 0a switches on the new Name Exclusion functionality for the GUI interface.

Version 2.2 release 0 (26 Jan 2000)

  • Introduces Input Change Log functionality. Allows consistent renaming across releases.
  • Improves the Obfuscation function's handling of very complex inheritance and implementation relationships.
  • Corrects a bug in Flow Obfuscation that caused a consistent IllegalAccessError in certain applications.
  • Corrects a bug in the Obfuscation function that allowed it to generate some illegal names when obfuscating very large applications.
  • Corrects a bug in the Change Log Translate function that caused a parse error if an original class, field or method was named "and".
  • Many GUI layout tweaks to improve cross-platform consistency.

Version 2.1 release 1 (05 Apr 1999)

  • Introduces "aggressive" String encryption. This option extends previous String encryption functionality by encrypting static final String field values in interfaces and classes. With this option String literal encryption has no exceptions.
  • More gracefully handles the "<classname> not found. Check the classpath option and reload." error that could occur during flow obfuscation. Instead of abandoning obfuscation, Zelix KlassMaster will now skip flow obfuscation of the method in which the error occurred and present a warning message.
  • More gracefully handles invalid classpaths in the "Options/Classpath" dialog.
  • Includes Applet classes in the "Don't change main class name" list in the "Tools/Obfuscate" and "Tools/Unobfuscate" dialogs.
  • The GUI now uses the local environment's foreground color as well as its background color so that users can use a setup like white on black without difficulty.
  • Some GUI layout fixes.
Sub-releases:
  • Release 1a adjusts the nature of the warning message mentioned in point 2 above.
  • Release 1b reduces the strength of the "aggressive" flow obfuscation to the level that it was in release 2.1.0. This was done to work around problems with the Microsoft VM JIT.
  • Release 1c fixes a bug in the ZKM Script "classpath" statement which causes it to work incorrectly in Unix environments.
  • Release 1f fixes a bug that caused Zelix KlassMaster to sometimes crash after it had removed "synthetic" methods.
  • Release 1g reduces the size of the String decryption method.
  • Release 1h removes unnecessary GUI initialization that caused problems when running from a UNIX script
  • Release 1i performs an automatic search for the Java bootstrap classes
  • Release 1j corrects a bug in the flow obfuscation logic that caused certain methods to fail verification

Version 2.1 release 0 (12 Feb 1999)

Introduces flow obfuscation and includes some minor fixes.

Version 2.0 release 4 (07 Nov 1998)

Fixes bugs in the Advanced Exclusion Options and Change Log Translate dialogs introduced by version 2.0 release 3.

Version 2.0 release 3 (04 Nov 1998)

Contains a workaround for the Windows JDK 1.1.7 JIT bug.

Version 2.0 release 2 (30 Oct 1998)

Corrects the handling of non-ASCII strings. Can now encrypt non-ASCII strings.

Version 2.0 release 1 (23 Oct 1998)

Change to make the Garbage Collector's job easier when the Change Log Translate tool is used on large change logs.

Version 2.0 release 0 (21 Oct 1998)

  1. New features:
    • the ZKM Script file interface.
    • the ZKM Script Helper file generation tool.
    • greatly enhanced exclusion functionality when obfuscating and unobfuscating.
    • the option of retaining scrambled line numbers when obfuscating.
    • the Change Log Translation tool.
    • the ability to open class files from zip and jar files.
    • directory and file selection dialogs now default to the last directory used.
  2. Minor changes to the renaming engine:
    • it generates shorter legal identifiers.
    • enhanced method overloading when obfuscating.
    • enhanced handling of complex interface relationships.
  3. Runtime String decryption algorithm improved to make it run almost twice as fast.
  4. Adjustment to a change in the JDK 1.1.6 handling of drive names in the Windows environment (which means that Zelix KlassMaster v2.0 will not work in Windows with the JDK 1.1.5 or less).

Version 1.0 release 2 (01 Feb 1998)

Corrects a bug that caused a NullPointerException during obfuscation or unobfuscation when:
  • a superclass or implemented interface is not opened inside Zelix KlassMaster and
  • the superclass or interface is stored in a jar file that is stored in the classpath.

Version 1.0 release 1 (16 Nov 1997)

  1. Corrects a bug that caused a NullPointerException when opening classes that:
    • contained at least one corrupt Inner Class Attribute table entry and
    • contained at least one valid Inner Class Attribute table entry.
    Note that, amongst other things, Zelix KlassMaster treats Inner Class Attribute table entries as corrupt if they contain inner class names that do not start with the outer class name followed by a '$' character.
  2. has improved (but still fallible) handling of bytecode containing calls to the method Class.forName().

Version 1.0 release 0 (30 Oct 1997)

Initial release.