Zelix KlassMaster - Java Obfuscator

Change History

In descending chronological order and with the major releases underlined.

Version 8.0 release 8 (16 Dec 2016)

  • Corrects a bug which could cause a ClassCastException in JME bytecode containing dead code.
  • Other minor changes and bug fixes.

Version 8.0 release 7 (20 Sep 2016)

  • Enhances Zelix KlassMaster to better support idiosynchracies in ProGuard style configuration.
Sub-releases:
  • release 7a
    • Works around an inappropriate "Zelix KlassMaster is not thread safe" error which can occur in some scenarios.
  • release 7b
    • Corrects a bug in release 8.0.7 which could result in unintended broad exclusions when translating ProGuard style configuration.
    • Other minor changes and bug fixes.
  • release 7c
    • Corrects a bug in ZKM Script which causes a parse error if a specified package name contains the package qualifier "enhanced".
    • Other minor changes and bug fixes.
  • release 7d to 7f
    • Improvements to the way String Encryption handles very large Strings.
    • Workaround for a HotSpot bug that can cause a spurious ClassCastException in unusual circumsatnces.
    • Other minor changes and bug fixes.

Version 8.0 release 6 (12 Sep 2016)

  • Corrects a bug which could cause a "Assert Failed: bean, factory-method" error when processing certain Spring XML files.

Version 8.0 release 5 (19 Aug 2016)

  • Corrects a bug which could cause a "Assert Failed: Duplicate class" error when using the package collapsing feature while specifying an input change log with incompatible package name mappings.

Version 8.0 release 4 (01 Aug 2016)

  • Corrects a bug which could cause a ClassNotFoundException when classes in a JAR file are not stored relative to the root directory (e.g. in a "/lib" directory).

Version 8.0 release 3 (29 Jul 2016)

  • Corrects the cause of a possible NullPointerException when processing Java 8 bytecode containing the MethodParameters attribute.

Version 8.0 release 2 (28 Apr 2016)

  • Corrects a bug which can result in JAR file corruption when opening classes from the file system and saving them to an archive in the Windows environment.
  • Other minor changes and bug fixes.

Version 8.0 release 1 (12 Mar 2016)

Version 8.0 release 0 (29 Dec 2015)

  • Implements the "hardening" of the existing Flow Obfuscation, Exception Obfuscation and String Encryption functions to make them more difficult to reverse.
  • Enhances the String Encryption function with the introduction of the new "enhanced" option which provides enhanced encryption which is more difficult to reverse. The "enhanced" option has been made the default option instead of the "flowObfuscate" option.
  • Enhances the String Encryption function to dramatically reduce the chances of a "Bytecode length greater than 65535" error when a class contains a very large number of String literals.
  • Reduces some of the size limitations for the AutoReflection™ and Obfuscate References functions.
  • Enhances the ZKM Script open statement by introducing "unskip" syntax which allows broad "skip" specifications to be modified by narrowing "unskip" specifications.
  • Introduces a command line alternative to the ProGuard Configuration Translate tool.
  • Introduces a command line tool to convert Zelix KlassMaster™ change logs into ProGuard mapping file format.
  • Now requires a Java 7 (i.e. JDK 1.7) JVM to run.
  • Other minor changes and bug fixes.
Sub-releases:
  • release 0a
    • Corrects processing of XML files.
    • Other minor changes and bug fixes.
  • release 0b
    • Corrects processing of XML files.
    • Other minor changes and bug fixes.
  • release 0c
    • Corrects translation of ProGuard style configuration files.
  • release 0d
    • Corrects a cause of a NullPointerException when translating ProGuard style configuration.
    • Other minor changes and bug fixes.
  • release 0e
  • release 0f
    • Corrects a problem which could contribute to an "Invalid lambda deserialization" error.
    • Corrects a problem which could occur when adjusting absolute paths to reflect obfuscated package names.

Version 7.0 release 16 (24 Dec 2015)

  • Corrects a possible NullPointerException when processing a ZKM Script stringEncryptionUnexclude statement.
  • Improves the handling of Spring XML files.
  • Other minor changes and bug fixes.

Version 7.0 release 15 (07 Dec 2015)

  • Improves the handling of Android AndroidManifest.xml files.
  • Other minor changes and bug fixes.

Version 7.0 release 14 (27 Sep 2015)

  • Updates the translation of ProGuard style configuration files.

Version 7.0 release 13 (12 Sep 2015)

  • Corrects a problem in the handling of XML end tags.
  • Other minor changes and bug fixes.

Version 7.0 release 12 (20 Aug 2015)

  • Corrects a problem in the handling of certain MANIFEST.MF attribute values.
  • Other minor changes and bug fixes.

Version 7.0 release 11 (04 Aug 2015)

  • Corrects a problem with annotation values containing both '.' and '/' characters.
  • Other minor changes and bug fixes.

Version 7.0 release 10 (02 Jul 2015)

  • Corrects a problem which could cause a "ClassFormatError: Invalid constant pool index" runtime error message in certain unusual circumstances.

Version 7.0 release 9 (22 May 2015)

  • Corrects a problem which could cause a "Multiple 'property' definitions for property 'x'" runtime error message in certain unusual circumstances.
  • Other minor changes and bug fixes.
Sub-releases:
  • release 9a
    • Corrects another problem which could cause a "Multiple 'property' definitions for property 'x'" runtime error message in certain unusual circumstances.
    • Other minor changes and bug fixes.
  • release 9b
    • Corrects another problem which could cause a "Multiple 'property' definitions for property 'x'" runtime error message in certain unusual circumstances.
    • Improves the handling of Hibernate XML files.
    • Other minor changes and bug fixes.
  • release 9c
    • Corrects another problem which could cause a "Multiple 'property' definitions for property 'x'" runtime error message in certain unusual circumstances.
    • Further improves the handling of Hibernate XML files.
  • release 9d
    • Further improves the handling of Hibernate XML files.
    • Other minor changes and bug fixes.
  • release 9e
    • Improves the handling of Spring XML files.
    • Other minor changes and bug fixes.

Version 7.0 release 8 (11 May 2015)

  • Improves support for the Spring @ComponentScan annotation.
  • Improves support for executable JAR files produced by Eclipse.
  • Other minor changes and bug fixes.

Version 7.0 release 7 (20 Apr 2015)

  • Corrects a "ClassFormatError: Short length on BootstrapMethods" error which could occur in certain circumstances.
  • Corrects a source of a NullPointerException which could occur when using the GUI.

Version 7.0 release 6 (14 Apr 2015)

  • Corrects a bug in the handling of type annotations.
  • Further reduces heap space usage. Reduction compared to version 6.1 now as much as 35% for version 6.1 functionality.

Version 7.0 release 5 (01 Apr 2015)

  • Corrects an "Ambiguous save file reference in 'saveAll' statement" error which can occur inappropriately.

Version 7.0 release 4 (31 Mar 2015)

  • Updates the translation of ProGuard style configuration files.
  • Corrects a NullPointerException which can occur in the Android Studio environment.
  • Other minor changes and bug fixes.

Version 7.0 release 3 (20 Mar 2015)

  • Corrects bugs in the translation of FXML and Spring XML files.

Version 7.0 release 2 (18 Mar 2015)

  • Corrects bugs in the translation of ProGuard style "keep" commands.
  • Other minor changes and bug fixes.

Version 7.0 release 1 (04 Mar 2015)

  • Fixes a bug that can result in ResourceBundle.getBundle(String) Reflection API calls being incorrectly identified as unresolved.

Version 7.0 release 0 (10 Feb 2015)

  • Introduces Obfuscate References functionality. It allows you to selectively obscure field accesses and method calls in or to sensitive parts of your applications.
  • Introduces the "extra aggressive" Flow Obfuscation option which provides deeper flow obfuscation.
  • Enhances the ZKM Script exclusion syntax by introducing the archive qualifier. The archive qualifier allows you to specify classes contained in specific archive files. (E.g. "MyJar*.jar"!*.*)
  • Reduces heap space usage by as much as 20%.
  • Other minor changes and bug fixes.

Version 6.1 release 9 (09 Feb 2015)

  • Corrects a NullPointerException in incremental obfuscation.
Sub-releases:
  • release 9a
    • Changes the default StackMapTable algorithm to work around a change in the Oracle verifier which could cause a "VerifyError: Inconsistent stackmap frames" error.

Version 6.1 release 8 (23 Nov 2014)

  • Corrects a bug in the handling of JAR file manifests.

Version 6.1 release 7 (30 Oct 2014)

  • Corrects an AutoReflection™ issue which could occur when the file encoding at the time of obfuscation differs from that at runtime.
  • Other minor changes and bug fixes.

Version 6.1 release 6 (13 Oct 2014)

  • Corrects an AutoReflection™ issue.

Version 6.1 release 5 (22 Aug 2014)

  • Improves the handling of FXML documents.

Version 6.1 release 4 (31 Jul 2014)

  • Improves the handling of FXML documents.
  • Improves the handling of JAR file manifests.
  • Other minor changes and bug fixes.

Version 6.1 release 3 (14 Apr 2014)

  • Corrects a problem which could cause a "ClassFormatError: StackMapTable format error" in certain unusual circumstances.
  • Corrects a problem which could cause a NullPointerException when processing FXML.

Version 6.1 release 2 (10 Apr 2014)

  • Corrects a problem in version 6.1.1 which could cause a VerifyError or a "Stack mismatch" error if Zelix KlassMaster™ is run in verbose mode.
  • Corrects another obscure cause of VerifyErrors or "Stack mismatch" errors.
  • Corrects the handling of Java 8 "MethodParameter" attributes and enhances the obfuscate statement by introducing the methodParameters keyword.
  • Other minor changes and bug fixes.

Version 6.1 release 1 (03 Apr 2014)

Version 6.1 release 0 (14 Jan 2014)

  • Improves support for JavaFX and FXML.
  • Enhances the obfuscate statement by introducing the "keepBalancedLocks" keyword to support the Android ART verifier. See the documentation for the Obfuscate Options dialog for more detail.
  • Other minor changes and bug fixes.

Version 6.0 release 2 (03 Dec 2013)

  • Corrects bugs in the translation of ProGuard style "keep" commands.
  • Other minor changes and bug fixes.

Version 6.0 release 1 (10 Oct 2013)

  • Corrects a StringIndexOutOfBoundsException which could occur when processing a JAR file manifest containing a "Class-Path" attribute.
  • Corrects an "Inconsistent stack heights" error which could occur in certain unusal circumstances.
  • Other minor changes and bug fixes.
  • Sub-releases:
    • sub-release 1a
      • Corrects the cause of an "Invalid classpath" that could occur when a JAR in the classpath contains a complex "Class-Path" attribute.
      • Other minor changes and bug fixes.
    • sub-release 1b
      • Corrects a NullPointerException which could occur when processing dead code.
    • sub-release 1c
      • Corrects another "Inconsistent stack heights" error which could occur in certain unusal circumstances.
      • Provides support for JavaFX manifests and preliminary support for FXML files.
      • Other minor changes and bug fixes.
    • sub-release 1d
      • Corrects a bug in the translation of the -keepattributes command in a ProGuard style configuration file.
      • Other minor changes and bug fixes.
    • sub-release 1e
      • Changes the ZKM_ADD_MANIFEST_CLASSPATHS configuration option so that it defaults to false.
      • Corrects an issue where spurious output was written to System.err in certain situations.

Version 6.0 release 0 (19 Sep 2013)

  • Implements preliminary support for the Java 8 bytecode including the invokedynamic instruction.
  • Introduces broad support for the ProGuard obfuscator's configuration and mapping files to allow much easier migration from ProGuard to Zelix KlassMaster™. This allows Zelix KlassMaster™ to execute most ProGuard configuration files and take the place of ProGuard in build environments such as the ADT (Android Development Tools) plugin for Eclipse.
  • Introduces the GUI ProGuard Configuration Translate Tool which can translate the ProGuard obfuscator's configuration files into ZKM Script.
  • Tweaks the Trim functionality and the handling of stack maps to further reduce the size of obfuscated bytecode.
  • Enhances the saveAll statement to allow the specification of a default archive file as opposed to a default directory.
  • Enhances the open statement by allow the use of wildcards such as "*.class" and "*.xml".
  • Enhances the obfuscate statement by introducing
    • the "mixedCaseClassNames" keyword to allow the use of mixed case obfuscated package and class names,
    • the "preverify" keyword to allow you to switch off the preverification of bytecode in situations where the bytecode will not be run on a JVM.
  • Enhances the syntax of all ZKM Script exclusion statements
    • to allow annotations and wildcards to appear in extends and implements clauses.
    • to allow exclusions based upon the presence or absence of the "synthetic", "enum", "bridge" or "annotation" attributes.
  • Enhances the trim statement by adding the "deleteDebugExtensionAttributes" parameter to allow the removal of "SourceDebugExtensionAttribute" attributes.
  • Removes the deprecated saveAllOld statement.
  • Other minor changes and bug fixes.

Version 5.5 release 9 (23 Jun 2013)

  • Corrects a bug in the processing of MANIFEST.MF files in certain unusual circumstances.
  • Other minor changes and bug fixes.

Version 5.5 release 8 (21 Mar 2013)

  • Modified to reduce heap and stack space requirements when processing very large and complex methods.

Version 5.5 release 7 (01 Mar 2013)

  • Corrects a bug which could cause a NullPointerException or perhaps a StackMapTable VerifyError in certain unusual classes.
  • Other minor changes and bug fixes.

Version 5.5 release 6 (25 Jan 2013)

  • Corrects a bug which could trigger a "VerifyError: ... Illegal return from subroutine" error in flow obfuscated bytecode.
  • Corrects a bug which could cause a NullPointerException when attempting to list the contents of certain Windows directories.
  • Other minor changes and bug fixes.

Version 5.5 release 5 (28 Nov 2012)

  • Corrects a bug which could trigger a "VerifyError: Inconsistent stackmap frames" error in obfuscated bytecode.
  • Corrects a bug which could cause a NullPointerException in the Stack Trace Translate Tool.
  • Other minor changes and bug fixes.

Version 5.5 release 4 (05 Oct 2012)

  • Corrects a bug in the processing of Spring and Hibernate configuration XML.
Sub-releases:
  • release 4a
    • Corrects a bug that could cause an "IllegalArgumentException: Comparison method violates its general contract!" error when running Zelix KlassMaster™ on Java 7.

Version 5.5 release 3 (18 Sep 2012)

  • Corrects a bug in the processing of exclusion parameters which specify a method parameter type which is an inner class. (E.g. "exclude *.* *(pack0.Class0$Inner0);")
  • Corrects a bug that could cause a StackOverflowError in certain rare circumstances.

Version 5.5 release 2 (22 Aug 2012)

  • Corrects a bug that could cause a NullPointerException in certain circumstances when processing multi-dimensional arrays of primitive types.

Version 5.5 release 1 (24 May 2012)

  • Corrects a bug in the handling of META-INF/INDEX.LIST files.

Version 5.5 release 0 (15 Feb 2012)

  • Introduces the AutoReflection™ functionality which allows the automatic handling of any Java Reflection API calls that Zelix KlassMaster™ could not fully resolve. This invloves
  • Enhances the obfuscate statement by introducing the "obfuscate" and "keep" values of the "localVariables" parameter. These new settings allow the local variable debugging information to be obfuscated or kept unchanged.
  • Enhances the ZKM Script exclusion statements by introducing method parameter placeholders (i.e. '?') in the specification of method signatures. See ZKM Script Exclusions Tutorial for examples of the use of method parameter placeholders.
  • Enhances the ZKM Script open statement's "skip" syntax so that you can tell Zelix KlassMaster™ to NOT open specified XML or TLD files.
  • Other minor changes and bug fixes.

Version 5.4 release 6 (11 Jun 2011)

  • Corrects a bug which can occur when the ZKM Script obfuscate statement's collapsePackagesWithDefault parameter is used when there are a number of "package-info" classes.
  • Enhances the ZKM Script open statement's "skip" syntax processing so that the skipped archives and classes are prepended to the classpath in the order in which the parent archives appeared in the open statement rather than in an unpredictable order.
  • Other minor changes and bug fixes.

Version 5.4 release 5 (01 Mar 2011)

  • Corrects a bug in the handling of Hibernate and Spring XML property names.

Version 5.4 release 4 (11 Feb 2011)

  • Introduces the ZKM_IGNORE_MISSING_MEMBERS configuration option that tells Zelix KlassMaster™ to ignore missing fields and methods in classes in the classpath.
  • Corrects a bug that prevented some class names in Hibernate and Spring XML from being translated to match obfuscated class names.
  • Other minor changes and bug fixes.

Version 5.4 release 3 (26 Nov 2010)

  • Corrects a bug that caused some class names in Hibernate and Android XML to be output using the '/' character as the package delimiter.
  • Corrects a bug that caused class names appearing in Android XML files to not be translated in some scenarios.

Version 5.4 release 2 (28 Oct 2010)

  • Changed to read and write a MIDP JAD file using the UTF-8 character encoding by default.
  • Introduces the ZKM_JAD_ENCODING configuration option that allows you to specify the character encoding to be used when reading and writing a MIDP JAD file.

Version 5.4 release 1 (11 Oct 2010)

  • Corrects a bug in the Exception Obfuscation functionality which could cause problems with pre-existing exception handlers.

Version 5.4 release 0 (17 Sep 2010)

Version 5.3 release 3 (17 Aug 2010)

  • Corrects a bug that could cause the incorrect handling of some relative file paths begining with a directory that has the initial character '.'.
  • Other minor bug fixes.

Version 5.3 release 2 (21 Apr 2010)

  • Corrects a bug that could cause an archive file specified in a classpath statement to remain locked after Zelix KlassMaster™ terminates.
Sub-releases:
  • release 2a
    • Corrects a bug that could cause a VerifyError error in obfuscated bytecode in certain unusual circumstances.
    • Corrects a bug in the handling of Service Provider configuration files.

Version 5.3 release 1 (13 Jan 2010)

  • Corrects a bug that could cause a "Stack size too large" VerifyError after String encrypting certain unusual classes.

Version 5.3 release 0 (10 Dec 2009)

  • Introduces the obfuscateFlowUnexclude and stringEncryptionUnexclude statements.
  • Enhances the saveAll statement to allow the specification of different save paths for specific opened files.
  • Enhances the open statement to allow the opening of XML files direct from the file system.
  • Enhanced to automatically prevent the renaming of the public static main(String[]) method in a class that appears in the Main-Class: attribute of a manifest file.
  • Enhanced to update the names appearing in a INDEX.LIST file if necessary to match obfuscated name.
  • Other minor changes and bug fixes.

Version 5.2 release 4 (01 May 2009)

  • Corrects a bug that could cause a StringIndexOutOfBoundsException when opening classes.
Sub-releases:
  • release 4a
    • Corrects a bug that could cause a NoSuchFieldError error in obfuscated bytecode in certain unusual circumstances.
  • release 4b
    • Corrects a bug that could cause a VerifyError "Register <n> contains wrong type" in certain unusual obfuscated bytecode.
  • release 4c
    • Corrects a bug that could cause an assert failure when obfuscating complex generic inner classes.
  • release 4d
    • Corrects a bug that could cause a NullPointerException when processing complex generic classes.

Version 5.2 release 3 (05 Mar 2009)

  • Introduces the ZKM_DELETE_EMPTY_DIRECTORIES configuration option that allows you to tell Zelix KlassMaster™ to not copy empty directories to the obfuscated archive file.
Sub-releases:
  • release 3a
    • Corrects the ZKM_DELETE_EMPTY_DIRECTORIES configuration option so that it works correctly with the Trim function.
    • Other minor changes and bug fixes.

Version 5.2 release 2 (13 Feb 2009)

  • Corrects a "java.io.IOException: invalid manifest format" error that could occur.
  • Introduces the ZKM_TEST_HIERARCHY configuration option that allows you to tell Zelix KlassMaster™ to not test for gaps in the inheritance hierarchy.
  • Other minor changes and bug fixes.
Sub-releases:

Version 5.2 release 1 (22 Jan 2009)

  • Improved handling of errors in the Apache Ant environment.
  • Other minor changes and bug fixes.
Sub-releases:
  • release 1a
    • Corrects a problem in the exclude statement's method name prefix exclusion functionality that could occur when linked field names are excluded from obfuscation.
    • Other minor changes and bug fixes.

Version 5.2 release 0 (29 Oct 2008)

  • Enhances the open statement by allowing the use of a wildcard to specify an archive file.
  • Enhances Incremental Obfuscation functionality by ensuring that any line number mappings in input change logs are copied across to the output change log.
  • Enhances the obfuscate statement's localVariables parameter by introducing the keepVisibleMethodParametersIfNotObfuscated setting. If the localVariables parameter is set to keepVisibleMethodParametersIfNotObfuscated, then the parameter variable names of public and protected methods are retained only if
    1. the name of the method is not obfuscated and
    2. the names of the containing class and package are not obfuscated.
  • Enhances the Stack Trace Translate Tool and the Stack Trace Translate Tool API by allowing more than one change log to be specified.
  • Other minor changes and bug fixes.

Version 5.1 release 5 (19 Aug 2008)

Version 5.1 release 4 (08 Aug 2008)

  • Corrects a "duplicate entry" bug that could occur when two classes with same name where "skipped" using the open statement.

Version 5.1 release 3 (27 Jun 2008)

  • Improves the handling of corrupt JAR file manifests.

Version 5.1 release 2 (05 Jun 2008)

  • Corrects a NullPointerException that could occur when using the obsolete "addCorruptInfo" parameter of the obfuscate statement.

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 parameter variable names of public or protected methods 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 KlassMaster™ 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 Java Reflection API warnings in the Zelix KlassMaster™ 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 Java 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 exclude statements to allow finer control of name obfuscation exclusions.
  • Introduces the ZKM Script trimUnexclude statement which operates on the results of 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 Java 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 Save™ 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 Save™ 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 Save™ 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)

  • 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.
  • Minor changes to the renaming engine:
    • it generates shorter legal identifiers.
    • enhanced method overloading when obfuscating.
    • enhanced handling of complex interface relationships.
  • Runtime String decryption algorithm improved to make it run almost twice as fast.
  • 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)

  • 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.
  • 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.