Add RenamerFlags

This commit is contained in:
de4dot 2012-12-07 15:06:38 +01:00
parent 20309b0225
commit fa4e1fcc6b
5 changed files with 183 additions and 72 deletions

View File

@ -90,6 +90,7 @@ namespace de4dot.code {
public bool KeepObfuscatorTypes { get; set; }
public bool PreserveTokens { get; set; }
public MetaDataFlags MetaDataFlags { get; set; }
public RenamerFlags RenamerFlags { get; set; }
public Options() {
StringDecrypterType = DecrypterType.Default;
@ -254,6 +255,7 @@ namespace de4dot.code {
op.KeepObfuscatorTypes = options.KeepObfuscatorTypes;
op.MetaDataFlags = options.MetaDataFlags;
op.RenamerFlags = options.RenamerFlags;
return op;
}

View File

@ -18,6 +18,7 @@
*/
using dot10.DotNet.Writer;
using de4dot.code.renamer;
namespace de4dot.code.deobfuscators {
public enum OpDecryptString {
@ -29,12 +30,14 @@ namespace de4dot.code.deobfuscators {
public interface IOperations {
bool KeepObfuscatorTypes { get; }
MetaDataFlags MetaDataFlags { get; }
RenamerFlags RenamerFlags { get; }
OpDecryptString DecryptStrings { get; }
}
class Operations : IOperations {
public bool KeepObfuscatorTypes { get; set; }
public MetaDataFlags MetaDataFlags { get; set; }
public RenamerFlags RenamerFlags { get; set; }
public OpDecryptString DecryptStrings { get; set; }
}
}

View File

@ -26,21 +26,152 @@ using de4dot.code.renamer.asmmodules;
using de4dot.blocks;
namespace de4dot.code.renamer {
[Flags]
public enum RenamerFlags {
RenameNamespaces = 1,
RenameTypes = 2,
RenameProperties = 4,
RenameEvents = 8,
RenameFields = 0x10,
RenameMethods = 0x20,
RenameMethodArgs = 0x40,
RenameGenericParams = 0x80,
RestoreProperties = 0x100,
RestorePropertiesFromNames = 0x200,
RestoreEvents = 0x400,
RestoreEventsFromNames = 0x800,
DontCreateNewParamDefs = 0x1000,
DontRenameDelegateFields = 0x2000,
}
public class Renamer {
public bool RenameNamespaces { get; set; }
public bool RenameTypes { get; set; }
public bool RenameProperties { get; set; }
public bool RenameEvents { get; set; }
public bool RenameFields { get; set; }
public bool RenameMethods { get; set; }
public bool RenameMethodArgs { get; set; }
public bool RenameGenericParams { get; set; }
public bool RestoreProperties { get; set; }
public bool RestorePropertiesFromNames { get; set; }
public bool RestoreEvents { get; set; }
public bool RestoreEventsFromNames { get; set; }
public bool DontCreateNewParamDefs { get; set; }
public bool DontRenameDelegateFields { get; set; }
public RenamerFlags RenamerFlags { get; set; }
public bool RenameNamespaces {
get { return (RenamerFlags & RenamerFlags.RenameNamespaces) != 0; }
set {
if (value)
RenamerFlags |= RenamerFlags.RenameNamespaces;
else
RenamerFlags &= ~RenamerFlags.RenameNamespaces;
}
}
public bool RenameTypes {
get { return (RenamerFlags & RenamerFlags.RenameTypes) != 0; }
set {
if (value)
RenamerFlags |= RenamerFlags.RenameTypes;
else
RenamerFlags &= ~RenamerFlags.RenameTypes;
}
}
public bool RenameProperties {
get { return (RenamerFlags & RenamerFlags.RenameProperties) != 0; }
set {
if (value)
RenamerFlags |= RenamerFlags.RenameProperties;
else
RenamerFlags &= ~RenamerFlags.RenameProperties;
}
}
public bool RenameEvents {
get { return (RenamerFlags & RenamerFlags.RenameEvents) != 0; }
set {
if (value)
RenamerFlags |= RenamerFlags.RenameEvents;
else
RenamerFlags &= ~RenamerFlags.RenameEvents;
}
}
public bool RenameFields {
get { return (RenamerFlags & RenamerFlags.RenameFields) != 0; }
set {
if (value)
RenamerFlags |= RenamerFlags.RenameFields;
else
RenamerFlags &= ~RenamerFlags.RenameFields;
}
}
public bool RenameMethods {
get { return (RenamerFlags & RenamerFlags.RenameMethods) != 0; }
set {
if (value)
RenamerFlags |= RenamerFlags.RenameMethods;
else
RenamerFlags &= ~RenamerFlags.RenameMethods;
}
}
public bool RenameMethodArgs {
get { return (RenamerFlags & RenamerFlags.RenameMethodArgs) != 0; }
set {
if (value)
RenamerFlags |= RenamerFlags.RenameMethodArgs;
else
RenamerFlags &= ~RenamerFlags.RenameMethodArgs;
}
}
public bool RenameGenericParams {
get { return (RenamerFlags & RenamerFlags.RenameGenericParams) != 0; }
set {
if (value)
RenamerFlags |= RenamerFlags.RenameGenericParams;
else
RenamerFlags &= ~RenamerFlags.RenameGenericParams;
}
}
public bool RestoreProperties {
get { return (RenamerFlags & RenamerFlags.RestoreProperties) != 0; }
set {
if (value)
RenamerFlags |= RenamerFlags.RestoreProperties;
else
RenamerFlags &= ~RenamerFlags.RestoreProperties;
}
}
public bool RestorePropertiesFromNames {
get { return (RenamerFlags & RenamerFlags.RestorePropertiesFromNames) != 0; }
set {
if (value)
RenamerFlags |= RenamerFlags.RestorePropertiesFromNames;
else
RenamerFlags &= ~RenamerFlags.RestorePropertiesFromNames;
}
}
public bool RestoreEvents {
get { return (RenamerFlags & RenamerFlags.RestoreEvents) != 0; }
set {
if (value)
RenamerFlags |= RenamerFlags.RestoreEvents;
else
RenamerFlags &= ~RenamerFlags.RestoreEvents;
}
}
public bool RestoreEventsFromNames {
get { return (RenamerFlags & RenamerFlags.RestoreEventsFromNames) != 0; }
set {
if (value)
RenamerFlags |= RenamerFlags.RestoreEventsFromNames;
else
RenamerFlags &= ~RenamerFlags.RestoreEventsFromNames;
}
}
public bool DontCreateNewParamDefs {
get { return (RenamerFlags & RenamerFlags.DontCreateNewParamDefs) != 0; }
set {
if (value)
RenamerFlags |= RenamerFlags.DontCreateNewParamDefs;
else
RenamerFlags &= ~RenamerFlags.DontCreateNewParamDefs;
}
}
public bool DontRenameDelegateFields {
get { return (RenamerFlags & RenamerFlags.DontRenameDelegateFields) != 0; }
set {
if (value)
RenamerFlags |= RenamerFlags.DontRenameDelegateFields;
else
RenamerFlags &= ~RenamerFlags.DontRenameDelegateFields;
}
}
Modules modules;
MemberInfos memberInfos = new MemberInfos();
@ -53,19 +184,8 @@ namespace de4dot.code.renamer {
"System.MulticastDelegate",
};
public Renamer(IDeobfuscatorContext deobfuscatorContext, IEnumerable<IObfuscatedFile> files) {
RenameNamespaces = true;
RenameTypes = true;
RenameProperties = true;
RenameEvents = true;
RenameFields = true;
RenameMethods = true;
RenameMethodArgs = true;
RenameGenericParams = true;
RestoreProperties = true;
RestorePropertiesFromNames = true;
RestoreEvents = true;
RestoreEventsFromNames = true;
public Renamer(IDeobfuscatorContext deobfuscatorContext, IEnumerable<IObfuscatedFile> files, RenamerFlags flags) {
RenamerFlags = flags;
modules = new Modules(deobfuscatorContext);
isDelegateClass = new DerivedFrom(delegateClasses);

View File

@ -25,6 +25,7 @@ using dot10.DotNet.Writer;
using de4dot.code;
using de4dot.code.deobfuscators;
using de4dot.code.AssemblyClient;
using de4dot.code.renamer;
namespace de4dot.cui {
class CommandLineParser {
@ -120,28 +121,29 @@ namespace de4dot.cui {
}));
miscOptions.Add(new NoArgOption(null, "dont-rename", "Don't rename classes, methods, etc.", () => {
filesOptions.RenameSymbols = false;
filesOptions.RenamerFlags = 0;
}));
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;
case 't': filesOptions.RenameTypes = false; break;
case 'p': filesOptions.RenameProperties = false; break;
case 'e': filesOptions.RenameEvents = false; break;
case 'f': filesOptions.RenameFields = false; break;
case 'm': filesOptions.RenameMethods = false; break;
case 'a': filesOptions.RenameMethodArgs = false; break;
case 'g': filesOptions.RenameGenericParams = false; break;
case 'd': filesOptions.DontRenameDelegateFields = true; break;
case 'n': filesOptions.RenamerFlags &= ~RenamerFlags.RenameNamespaces; break;
case 't': filesOptions.RenamerFlags &= ~RenamerFlags.RenameTypes; break;
case 'p': filesOptions.RenamerFlags &= ~RenamerFlags.RenameProperties; break;
case 'e': filesOptions.RenamerFlags &= ~RenamerFlags.RenameEvents; break;
case 'f': filesOptions.RenamerFlags &= ~RenamerFlags.RenameFields; break;
case 'm': filesOptions.RenamerFlags &= ~RenamerFlags.RenameMethods; break;
case 'a': filesOptions.RenamerFlags &= ~RenamerFlags.RenameMethodArgs; break;
case 'g': filesOptions.RenamerFlags &= ~RenamerFlags.RenameGenericParams; break;
case 'd': filesOptions.RenamerFlags |= RenamerFlags.DontRenameDelegateFields; break;
default: throw new UserException(string.Format("Unrecognized --keep-names char: '{0}'", c));
}
}
}));
miscOptions.Add(new NoArgOption(null, "dont-create-params", "Don't create method params when renaming", () => {
filesOptions.DontCreateNewParamDefs = true;
filesOptions.RenamerFlags |= RenamerFlags.DontCreateNewParamDefs;
}));
miscOptions.Add(new NoArgOption(null, "dont-restore-props", "Don't restore properties/events", () => {
filesOptions.RestorePropsEvents = false;
filesOptions.RenamerFlags &= ~(RenamerFlags.RestorePropertiesFromNames | RenamerFlags.RestoreEventsFromNames);
}));
miscOptions.Add(new OneArgOption(null, "default-strtyp", "Default string decrypter type", "type", (val) => {
object decrypterType;
@ -223,6 +225,7 @@ namespace de4dot.cui {
ControlFlowDeobfuscation = filesOptions.ControlFlowDeobfuscation,
KeepObfuscatorTypes = filesOptions.KeepObfuscatorTypes,
MetaDataFlags = filesOptions.MetaDataFlags,
RenamerFlags = filesOptions.RenamerFlags,
};
if (defaultStringDecrypterType != null)
newFileOptions.StringDecrypterType = defaultStringDecrypterType.Value;

View File

@ -40,18 +40,8 @@ namespace de4dot.cui {
public IList<SearchDir> SearchDirs { get; set; }
public MetaDataFlags MetaDataFlags { get; set; }
public bool DetectObfuscators { get; set; }
public bool DontCreateNewParamDefs { get; set; }
public bool RenameNamespaces { get; set; }
public bool RenameTypes { get; set; }
public bool RenameProperties { get; set; }
public bool RenameEvents { get; set; }
public bool RenameFields { get; set; }
public bool RenameMethods { get; set; }
public bool RenameMethodArgs { get; set; }
public bool RenameGenericParams { get; set; }
public bool DontRenameDelegateFields { get; set; }
public RenamerFlags RenamerFlags { get; set; }
public bool RenameSymbols { get; set; }
public bool RestorePropsEvents { get; set; }
public bool ControlFlowDeobfuscation { get; set; }
public bool KeepObfuscatorTypes { get; set; }
public bool OneFileAtATime { get; set; }
@ -65,16 +55,19 @@ namespace de4dot.cui {
Files = new List<IObfuscatedFile>();
SearchDirs = new List<SearchDir>();
DefaultStringDecrypterMethods = new List<string>();
RenameNamespaces = true;
RenameTypes = true;
RenameProperties = true;
RenameEvents = true;
RenameFields = true;
RenameMethods = true;
RenameMethodArgs = true;
RenameGenericParams = true;
RenamerFlags = RenamerFlags.RenameNamespaces |
RenamerFlags.RenameTypes |
RenamerFlags.RenameProperties |
RenamerFlags.RenameEvents |
RenamerFlags.RenameFields |
RenamerFlags.RenameMethods |
RenamerFlags.RenameMethodArgs |
RenamerFlags.RenameGenericParams |
RenamerFlags.RestorePropertiesFromNames |
RenamerFlags.RestoreEventsFromNames |
RenamerFlags.RestoreProperties |
RenamerFlags.RestoreEvents;
RenameSymbols = true;
RestorePropsEvents = true;
ControlFlowDeobfuscation = true;
}
}
@ -167,6 +160,7 @@ namespace de4dot.cui {
ControlFlowDeobfuscation = options.ControlFlowDeobfuscation,
KeepObfuscatorTypes = options.KeepObfuscatorTypes,
MetaDataFlags = options.MetaDataFlags,
RenamerFlags = options.RenamerFlags,
CreateDestinationDir = !onlyScan,
});
@ -191,6 +185,7 @@ namespace de4dot.cui {
public bool ControlFlowDeobfuscation { get; set; }
public bool KeepObfuscatorTypes { get; set; }
public MetaDataFlags MetaDataFlags { get; set; }
public RenamerFlags RenamerFlags { get; set; }
public bool CreateDestinationDir { get; set; }
}
@ -318,6 +313,7 @@ namespace de4dot.cui {
ControlFlowDeobfuscation = options.ControlFlowDeobfuscation,
KeepObfuscatorTypes = options.KeepObfuscatorTypes,
MetaDataFlags = options.MetaDataFlags,
RenamerFlags = options.RenamerFlags,
};
if (options.DefaultStringDecrypterType != null)
fileOptions.StringDecrypterType = options.DefaultStringDecrypterType.Value;
@ -391,20 +387,7 @@ namespace de4dot.cui {
void rename(IEnumerable<IObfuscatedFile> theFiles) {
if (!options.RenameSymbols)
return;
var renamer = new Renamer(deobfuscatorContext, theFiles) {
DontCreateNewParamDefs = options.DontCreateNewParamDefs,
RenameNamespaces = options.RenameNamespaces,
RenameTypes = options.RenameTypes,
RenameProperties = options.RenameProperties,
RenameEvents = options.RenameEvents,
RenameFields = options.RenameFields,
RenameMethods = options.RenameMethods,
RenameMethodArgs = options.RenameMethodArgs,
RenameGenericParams = options.RenameGenericParams,
DontRenameDelegateFields = options.DontRenameDelegateFields,
RestorePropertiesFromNames = options.RestorePropsEvents,
RestoreEventsFromNames = options.RestorePropsEvents,
};
var renamer = new Renamer(deobfuscatorContext, theFiles, options.RenamerFlags);
renamer.rename();
}
}