Version History
Rummage 3.1
The command line variant of Rummage now has an option (--preserve-public-surface) which instructs Rummage to keep the public surface of an EXE unchanged. This enables obfuscation of executables which are referenced by other assemblies.
Additionally, redundant castclass nodes and unreachable nodes are now removed in all circumstances; previously they would remain in some circumstances. Inlining performance on very large assemblies has been improved significantly.
Version 3.1.1099 (5158)
17 October 2013
- Improved the reflection analysis to increase the number of members obfuscated in VB.NET WinForms projects.
Version 3.1.1016 (4804)
11 August 2013
- Fixed a bug resulting in the message "Found a node with a null Stack".
- Fixed a bug resulting in an error message about a key already existing in a dictionary.
Version 3.1.1005 (4744)
5 August 2013
- Fixed a bug which introduced an unwanted reference to .NET 4.0 to .NET 2.0 assemblies.
Version 3.1.997 (4679)
24 July 2013
- Fixed a bug which caused the string encryption feature to alter the public surface of DLLs.
Version 3.1.992 (4646)
11 July 2013
- Fixed a bug occurring when all targets of the switch instruction are calls to empty methods which get inlined.
- Large methods which cannot be removed are no longer inlined even if called only once, fixing a problem whereby assemblies became unreasonably large in some cases.
Version 3.1.988 (4640)
1 July 2013
- Protected members can be part of the public surface, but were not treated as such.
- Fixed a corner case whereby Rummage would serialize the instruction graph in an order which PEVerify couldn't verify in a single pass.
- Fixed a bug whereby Rummage eliminated the branch instruction branching to self (i.e. an empty infinite loop), altering program behaviour.
- Fixed a corner case related to incorrectly treating an instruction which is simultaneously a try block entry point and the target of a branch as having only one incoming control flow path.
- Fixed a bug whereby assembly analysis would result in an internal error upon encountering a field, property or event in generic classes in certain scenarios.
- Fixed incorrect handling of multi-dimensional arrays of rank 1 (which are distinct from one-dimensional arrays).
- Fixed a rare corner case resulting in a castclass being inserted incorrectly.
- Fixed a bug whereby inlining of methods with different security levels would trigger a runtime validation error.
- Fixed an unhandled exception not caught by the global error handler/reporter.
Rummage 3.0
Rummage now supports DLL obfuscation. Reflection safety analysis has been further expanded, increasing the number of members safely obfuscated by as much as 5x in some cases. Support for WPF projects has been improved.
We've also added a feature to the obfuscation results window which will help you see which classes in your project are treated by Rummage as unsafe, and are responsible for preventing obfuscation.
Version 3.0.959 (4553)
28 May 2013
- Optimized the biggest bottlenecks in the Rummage algorithms. Obfuscating on Maximum settings can now be up to 3x as fast (1.5-2.5 typical).
- Fixed a relatively common bug whereby obfuscation failed with a message about a null stack.
- Fixed a bug causing a crash when a string has a broken UTF-16 surrogate pair.
- Fixed a bug whereby methods invoked from the module constructor were not analysed correctly.
- Fixed a bug related to ldtoken of a method reference during inlining.
Version 3.0.938 (4433)
16 April 2013
- Added the [RummageAssumeTypeSafe] attribute.
- Minor interface improvements in the obfuscation results view.
- Bugfix related to delegates in non-generic types derived from a generic one.
- Bugfix related to arrays of rank other than 1.
- Bugfix for assemblies with no method bodies at all (such as interop assemblies)
- Bugfix for type safety analysis involving ret or throw.
Version 3.0.867 (4155)
21 January 2013
- Fixed a number of issues which would make Rummage break certain programs.
- Minor interface improvements and .NET 4.5 compatibility fixes.
- A clearer message in Evaluation mode in case a binary protected in evaluation mode is released by mistake.
Rummage 2.2
The algorithm responsible for detecting the use of reflection and skipping certain obfuscations is now smarter in how it handles typeof, enabling obfuscation in a number of known-safe cases.
Version 2.2.750 (3964)
16 October 2012
- Fixed an internal error in the "Optimize/obfuscate IL" algorithm which occurred in a certain rare corner-case.
Rummage 2.1
Obfuscated assemblies are now compatible with tools like signtool.exe. A free tool is now included with Rummage: RummageTypeRenamer, which can be used to rename specific types within a binary.
Version 2.1.729 (3909)
3 October 2012
- Unnesting used to fail in several scenarios involving generic base types and generic methods.
- Unnesting used to erroneously rename types that were otherwise marked unrenameable.
- Merging of disjointly-used locals now supports merging pinned types.
- Obfuscation map now records information required to identify the original binary it relates to.
Rummage 2.0
Introduces support for PDB files. If the input binary comes with a PDB, Rummage will create a PDB for the obfuscated output. Elimination of redundant local variables has been significantly improved.
Version 2.0.640 (3707)
31 May 2012
- Rummage used to occasionally modify COM interfaces incorrectly.
- Better support for specific P/Invoke scenarios.
- Handle pinned and pointer types correctly when obfuscating IL.
- Do not modify types used by InstallUtil.exe.
- Certain Rummage-generated members were named a, b, c, ... instead of using the plausible-looking name generator.
- Cosmetic fixes.
Rummage 1.2
Adds a command-line option to prevent accidental use of evaluation mode on build machines. Introduces obfuscation map which records what Rummage did to an executable.
Version 1.2.548 (3249)
30 Sep 2011
- Changed how Rummage handles changes to the assembly name, fixing an issue for projects which use certain string references.
Version 1.2.536 (3143)
24 Aug 2011
- Fixed a corner-case where a store node was removed even though a load node was still reachable from it by looping back into the same try block.
- Slight improvement in Optimize IL for methods with complex control flow.
- Filter clause boundary was off by 1 in some cases.
Version 1.2.522 (3089)
15 Aug 2011
- Bugfix for remove unused types/members, whereby a type was removed despite being used in a certain scenario.
Version 1.2.515 (3058)
10 Aug 2011
- Program stack analysis was subtly wrong in a certain scenario.
- Input assembly is now read with a share read permission.
Version 1.2.501 (3034)
5 Aug 2011
- Fixed a case where Rummage incorrectly decided not to obfuscate a type, thinking it is declared in a separate assembly.
- Fixed a bug triggered by certain nested filter clauses.
- Handling of prefixed instructions was incorrect in one rare corner-case.
- Better support for the output assembly having a different executable file name.
Version 1.2.487 (2944)
4 Jul 2011
- Support a leave instruction targeting the middle of a block.
- Fixed bug in the inlining algorithm triggered by certain filter clauses in Visual Basic programs.
- Cosmetic changes to error reporting.
Version 1.2.471 (2867)
24 May 2011
- Improved handling of assemblies which have already been obfuscated.
- Cosmetic changes.
Rummage 1.1
First official release of Rummage.
Version 1.1.445 (2781)
15 Mar 2011