Obfuscate custom attribute data

Moves all custom attribute data into the attribute's constructor, making automated extraction of attribute values significantly harder. The values are usually stored as metadata, but after the obfuscation they are mixed in with IL code.

BeforeAfter
[TestAttribute("log", Count = 42)]
static void SomeMethod() { ... }

[TestAttribute("license", Count = 10)]
static void OtherMethod() { ... }
[TestAttribute(0)]
static void SomeMethod() { ... }

[TestAttribute(1)]
static void OtherMethod() { ... }

Custom attributes are used in code to mark up data structures that reveal how the program works internally. For example, custom attributes may inadvertantly document a database structure or a file format.

Rummage modifies these custom attributes in such a way that the hacker will only see a meaningless number, yet the program still retrieves and decodes the custom attribute data correctly.