RetroGuard Change Log
History of changes to the RetroGuard for Java Obfuscator.
- 13th March 2007
Version 2.3.1 release of RetroGuard (07031300).
- Update to non-commercial licensing.
- 28th February 2007
Version 2.3.0 dual license (commercial / GPL) release of RetroGuard (07022800).
- Support added for Java SE 6, including the new code attribute StackMapTable.
- Unsupported versions of the class file format now gives a warning instead of stopping the obfuscation process.
- Trim bug-fix: methods could be incorrectly trimmed if accessed only through base class references.
- Readme.txt now includes 'Quick Start' documentation.
- 31st March 2006
Version 2.2.0 dual license (commercial / GPL) release of RetroGuard (06033100).
- '.option Repackage' added, enabling safe repackaging of Java classes into top-level packages, further reducing obfuscated jar size.
- '.option Trim' available in both GPL and commercial versions, enabling unused methods, fields, and even whole classes to be trimmed by RetroGuard. This can lead to significant reduction in jar size, particularly in cases where only a few classes are being used from a larger library.
- '.option Generic' added, currently equivalent to '.attribute Signature'.
- Added RGdefault utility which outputs the RetroGuard internal default script.
- Added '.nowarn ' to script format, enabling suppression of checked reflection warnings from the RetroGuard log file.
- Fixed an '.option MapClassString' speed optimization which incorrectly ignored class-string mappings in certain inner classes.
- Improved error-handling when duplicate classfiles are detected in the input jar.
- Documentation updates, including an example showing how to construct an optimal script file.
- 25th August 2005
Version 2.1.2 commercial release of RetroGuard.
Version 2.0.5 GPL release of RetroGuard.
- Fixed an interaction between negation commands (!class / !method / !field) and certain multiple inheritance graphs that caused a non-fatal failure to rename some methods and fields, when renaming should be possible.
- Added display of version number to RetroGuard usage message.
- 19th July 2005
Version 2.1.1 commercial release of RetroGuard.
Version 2.0.4 GPL release of RetroGuard.
- Additional checks to prevent RetroGuard terminating with a warning on certain JDK1.4.2 classfiles.
- 15th June 2005
Version 2.1.0 commercial release of RetroGuard (05061500).
- '.option Trim' added enabling unused methods, fields, and even whole classes to be trimmed by RetroGuard. This can lead to significant reduction in jar size, particularly in cases where only a few classes are being used from a larger library.
- 1st June 2005
Version 2.0.3 dual license (GPL / commercial) release of RetroGuard (05060100).
- 'RGtrace' tool added, helping to interpret obfuscated stack traces.
- '.option LineNumberDebug' added, allowing line number information to be preserved for stack traces without exposing unobfuscated class names within the 'SourceFile' attribute.
- 30th March 2005
Version 2.0.2 dual license (GPL / commercial) release of RetroGuard (05033000).
- Explicit array bounds checking added to Code attribute parser.
- Behavior of script entries '!class', '!method' and '!field' changed. These statements no longer force obfuscation of package level identifiers, which in v2.0.1 could lead to unexpected behavior such as the obfuscation of package level identifiers while classes in those packages were preserved from obfuscation.
- 4th February 2005
Version 2.0.1 dual license (GPL / commercial) release of RetroGuard (05020400).
- Automatic renaming for Class.forName(...) and .class
- Apache Ant tasks added for RetroGuard, RGpatch, and RGconv.
- Improved support for Serialization and for RMI.
- Script grammar additions (backwards compatible with prior scripts):
- '.option' entries 'Application', 'Applet', 'Serializable', 'RMI', 'MapStringClass', 'DigestMD5', 'DigestSHA';
- package-recursive wildcard '**';
- negation commands '!class' and '!method' and '!field';
- 'and_class' modifier to '.method', '!method', '.field', '!field';
- 'extends' modifier to '.class', '!class', '.method', '!method', '.field', '!field';
- access modifiers (for example, '.field;private;!final;!static') for commands '.class', '!class', '.method', '!method', '.field', '!field'.
- Support for JDK1.5/5 Generics (Signature and LocalVariableTypeTable attributes).
- Support for JDK1.5/5 Enumerations.
- Support for JDK1.5/5 Annotations attributes.
- Added 'EnclosingMethod' to the list of classfile attributes which can be
preserved during obfuscation. Script file syntax: .attribute EnclosingMethod
- Added 'Main-Class: RetroGuard' to retroguard.jar manifest.
- Improved default behavior when no script is supplied on the command line.
- Change in default behavior: MD5 and SHA-1 message digests are no longer
generated in the output jar manifest by default, but can be requested with
the '.option DigestMD5' and '.option DigestSHA' script file entries.
- Default output-jar comment removed.
- Descriptor in '.field' command is now checked, so that wildcarding works
as expected. Previously the '.field' descriptor was ignored.
- 10th December 2004
Version 1.1.16 Open Source release of RetroGuard (04121000).
- RetroGuard now compiles under JDK1.5/JDK5.
- Updated classfile version checking to accept MAJOR_VERSION = 0x31 (49) as used in JDK1.5/JDK5 with default compilation option "-source 1.5".
- 22nd November 2004
Version 1.1.15 Open Source release of RetroGuard (04112200).
- Added 'Deprecated' to the list of classfile attributes which can be
preserved during obfuscation. Use script file syntax: .attribute Deprecated
- 26th February 2004
Version 1.1.14 Open Source release of RetroGuard (04022600).
- Fixed long-standing bug in handling of manifest file continuation lines.
Thanks to Grant Gould for reporting this.
- 2nd November 2002
Version 1.1.13 Open Source release of RetroGuard (02110200).
- Addition to major bugfix in v1.1.12 regarding JDK1.4-compiled code:
implemented interfaces as well as the superclass are now traversed to
resolve obfuscated method and field names.
- System.exit(0) in RetroGuard (removed in v1.1.10) has been added back.
For Ant integration (pre-JDK1.4 only), spawn a separate VM for RetroGuard.
- 29th October 2002
Version 1.1.12 Open Source release of RetroGuard (02102700).
- Major fix from v1.1.11 regarding JDK1.4-compiled code: Changes to the
JDK1.4 compiler from prior versions broke RetroGuard's ability to obfuscate
any non-trivial inheritance structure in the code. The symptom was methods
and fields defined in superclasses not being found at runtime in obfuscated
code. The RetroGuard renaming mechanism has been updated to cope with these
JDK1.4 compiler changes. The bug only affected code compiled with JDK1.4
which was only supported recently in RetroGuard v1.1.11, exposing the bug.
- 8th October 2002
Version 1.1.11 Open Source release of RetroGuard (02100800).
- Updated classfile version checking to accept MAJOR_VERSION = 0x30 (48) as
used in JDK1.4 with compilation option "-source 1.4"
- 7th October 2002
Version 1.1.10 Open Source release of RetroGuard (02100700).
- Updated classfile version checking to accept MAJOR_VERSION = 0x2E (46) as
used in JDK1.4
- Classfile integrity checking now provides more detailed error messages.
- Removed error check that invalidly triggered on valid (but unusual)
identifiers like "XX$$71".
- System.exit(0) is no longer called on normal termination, to ease
integration with tools like Ant.
- 18th May 2000
Version 1.1.9 Open Source release of RetroGuard (00051800).
- Added a 'pub_prot_only' keyword to the existing 'public', 'protected'
qualifiers. (Thanks to DTAI Inc. for this suggestion).
| public | (package) | protected | private |
| public | | X | X | X |
| protected | | | | X |
| pub_prot_only | | X | | X |
(X - is obfuscated)
- 27th February 2000
Version 1.1.8 Open Source release of RetroGuard (00022700).
- Fixed a problem with loops in the inheritance graphs. The symptom
of this was fairly benign -- some methods and fields could be left
unobfuscated without reason. This bug was a side-effect of an earlier bug-fix.
(Thanks to Yishai Feldman for providing a test-case clearly showing this).
- 18th November 1999
Version 1.1.7 Open Source release of RetroGuard (99111800).
- Added general wildcards to the script file entries.
- 7th November 1999
Version 1.1.6 Open Source release of RetroGuard (99110700).
- Fixed naming collision bug, where field or method names in the target
name-spaces occur in super-classes outside of the JAR (thanks to Colin
Spensley at Servlets Inc. for reporting this bug).
- 12th September 1999
Version 1.1.5 Open Source release of RetroGuard (99091200).
- Ensured source compilation of RetroGuard under JDK1.2.2; added explicit
warning not to obfuscate classes referred to via '.class' construct (both
thanks to Chad Loder).
- Added separate Unix, Win32-nmake, and Cygwin32 makefiles to the source
distribution.
- Added notes on '.class', RMI, and CAB files to the FAQ-list.
- 1st August 1999
Version 1.1.4 Open Source release of RetroGuard (99080100).
- RetroGuard is officially released to the public domain under the Lesser
GPL.
- 21st March 1999
Version 1.1.3 commercial release of RetroGuard (99032100).
- References to arrays of obfuscated classes are now remapped correctly
in all cases.
- 12th December 1998
Version 1.1.2 commercial release of RetroGuard (98121200).
- RetroGuard now passes all manifest sections. This behavior change
allows JDK1.2 manifest entries, like "Main-Class:", to be preserved.
- 24th November 1998
Version 1.1.1 commercial release of RetroGuard (98112400).
- RetroGuard was being overly strict in enforcing classfile format,
resulting in an incorrect fatal Exception being thrown (very infrequent
under JDK1.1, more common under JDK1.2) - fixed.
- 27th October 1998
Version 1.1 commercial release of RetroGuard (98102700).
- Conserves memory when generating manifest file.
- InnerClasses attribute need not have an inner class name (VMSpec does not specify this).
- All lists are now alpha-sorted in RGgui.
- 1st October 1998
Version 1.1beta2 commercial release of RetroGuard (98100100).
- RGconv utility introduced, allowing original->obfuscated name conversion.
- Minor changes to docs.html.
- 11th August 1998
Version 1.1beta1 commercial release of RetroGuard (98081100).
- Incremental obfuscation has been introduced to RetroGuard. This,
together with the new RGpatch utility, allows obfuscated patch files
to be distributed.
- 27th July 1998
Version 1.0.4 commercial release of RetroGuard (98072700).
- Netscape's VM is inconsistent with the Java VM Specification. This could
cause failures in certain obfuscated applets, when run under Netscape.
RetroGuard's identifier mapping scheme has now been modified to work
around this Netscape VM problem.
- 21st July 1998
Version 1.0.3 commercial release of RetroGuard (98072100).
- Bug-fix: prevent obfuscator from being over-cautious in deciding
whether to change a method/field name or not (this never caused breakages in
code, but very occasionally left names unchanged).
- Bug-fix: rgs script parser failed on reading RMI identifiers.
- 8th July 1998
Version 1.0.2 commercial release of RetroGuard (98070800).
- Bug-fix: regarding inherited retention from retained methods from a class inside the same jar.
- 4th July 1998
Version 1.0.1 commercial release of RetroGuard (98070400).
- Native methods are automatically reserved from obfuscation.
- 15th June 1998
Version 1.0 commercial release of RetroGuard (98061500).
- Method and field lists in RGgui are now sorted.
- Wildcarding over a package now acts on the tree of enclosed inner classes in
addition to top-level classes.
- Logging lists preserved inner class names.
- 7th June 1998
Third Early Access release of RetroGuard (98060700).
- The obfuscated Jar has its manifest file updated with the new class names, and
with fresh SHA-1 and MD5 message digests. Other manifest information, such as
'Java-Bean: True', is preserved from the original Jar's manifest.
- All signature (*.SF) files are deleted from the obfuscated Jar. If the Jar is to
be signed, this must be done after obfuscation.
- Resource files in the Jar (those that are not classes, manifest or signatures)
now have their paths updated to correspond to the obfuscated package names
of the class files, if this is possible. This is done so that classes can retain
access to resources located in their own package/directory.
- A graphical wizard has been included for the straightforward management of
RetroGuard script files. Assuming 'retroguard.jar' is in the classpath, this can be
started using the command 'java RGgui'.
- 25th May 1998
Second Early Access release of RetroGuard (98052500).
- The 'Exceptions' attribute is no longer trimmed from classes. Compilers require
this attribute, and future VMs may also require it during class verification.
- Bug-fix related to a certain class of complex inheritance structures.
- Obfuscated names are now generated so as to minimise identifier length.
- Java language keywords are introduced as obfuscated names (these are legal at
the Java VM level, but illegal at the Java language level). This is to
make impossible compilation of decompiled obfuscated classes.
- Obfuscated names are now heavily overloaded within each method/field namespace.
- Log file tidied, and a name overloading freqency chart included.
- 15th May 1998
Initial Early Access release of RetroGuard (98051500).
|