diff --git a/de4dot.code/renamer/Renamer.cs b/de4dot.code/renamer/Renamer.cs index 753138a2..3884d4fc 100644 --- a/de4dot.code/renamer/Renamer.cs +++ b/de4dot.code/renamer/Renamer.cs @@ -40,6 +40,7 @@ namespace de4dot.code.renamer { public bool RestoreEvents { get; set; } public bool RestoreEventsFromNames { get; set; } public bool DontCreateNewParamDefs { get; set; } + public bool DontRenameDelegateFields { get; set; } Modules modules; MemberInfos memberInfos = new MemberInfos(); @@ -255,10 +256,13 @@ namespace de4dot.code.renamer { void renameFields(TypeInfo info) { if (!RenameFields) return; + bool isDelegateType = isDelegateClass.check(info.type); foreach (var fieldDef in info.type.AllFieldsSorted) { var fieldInfo = memberInfos.field(fieldDef); if (!fieldInfo.gotNewName()) continue; + if (isDelegateType && DontRenameDelegateFields) + continue; fieldDef.FieldDef.Name = new UTF8String(fieldInfo.newName); if (isVerbose) Logger.v("Field: {0} ({1:X8}) => {2}", diff --git a/de4dot.cui/CommandLineParser.cs b/de4dot.cui/CommandLineParser.cs index 7f25bf44..8c874b0e 100644 --- a/de4dot.cui/CommandLineParser.cs +++ b/de4dot.cui/CommandLineParser.cs @@ -121,7 +121,7 @@ namespace de4dot.cui { miscOptions.Add(new NoArgOption(null, "dont-rename", "Don't rename classes, methods, etc.", () => { filesOptions.RenameSymbols = false; })); - miscOptions.Add(new OneArgOption(null, "keep-names", "Don't rename n(amespaces), t(ypes), p(rops), e(vents), f(ields), m(ethods), a(rgs), g(enericparams). Can be combined, eg. efm", "flags", (val) => { + miscOptions.Add(new OneArgOption(null, "keep-names", "Don't rename n(amespaces), t(ypes), p(rops), e(vents), f(ields), m(ethods), a(rgs), g(enericparams), d(elegate fields). Can be combined, eg. efm", "flags", (val) => { foreach (var c in val) { switch (c) { case 'n': filesOptions.RenameNamespaces = false; break; @@ -132,6 +132,7 @@ namespace de4dot.cui { case 'm': filesOptions.RenameMethods = false; break; case 'a': filesOptions.RenameMethodArgs = false; break; case 'g': filesOptions.RenameGenericParams = false; break; + case 'd': filesOptions.DontRenameDelegateFields = true; break; default: throw new UserException(string.Format("Unrecognized --keep-names char: '{0}'", c)); } } diff --git a/de4dot.cui/FilesDeobfuscator.cs b/de4dot.cui/FilesDeobfuscator.cs index 47c650ec..0ffc28e9 100644 --- a/de4dot.cui/FilesDeobfuscator.cs +++ b/de4dot.cui/FilesDeobfuscator.cs @@ -49,6 +49,7 @@ namespace de4dot.cui { public bool RenameMethods { get; set; } public bool RenameMethodArgs { get; set; } public bool RenameGenericParams { get; set; } + public bool DontRenameDelegateFields { get; set; } public bool RenameSymbols { get; set; } public bool RestorePropsEvents { get; set; } public bool ControlFlowDeobfuscation { get; set; } @@ -400,6 +401,7 @@ namespace de4dot.cui { RenameMethods = options.RenameMethods, RenameMethodArgs = options.RenameMethodArgs, RenameGenericParams = options.RenameGenericParams, + DontRenameDelegateFields = options.DontRenameDelegateFields, RestorePropertiesFromNames = options.RestorePropsEvents, RestoreEventsFromNames = options.RestorePropsEvents, };