From c47039c2efca89f03c36745da69e32f27182264f Mon Sep 17 00:00:00 2001 From: de4dot Date: Sun, 11 Nov 2012 11:37:40 +0100 Subject: [PATCH] Don't call logger.v() unless verbose log level is enabled --- de4dot.code/ObfuscatedFile.cs | 32 +++++++----- de4dot.code/renamer/Renamer.cs | 91 ++++++++++++++++++++++------------ 2 files changed, 78 insertions(+), 45 deletions(-) diff --git a/de4dot.code/ObfuscatedFile.cs b/de4dot.code/ObfuscatedFile.cs index 9e8de41d..f2aa62c9 100644 --- a/de4dot.code/ObfuscatedFile.cs +++ b/de4dot.code/ObfuscatedFile.cs @@ -538,23 +538,29 @@ namespace de4dot.code { return; } - Logger.v("Deobfuscating methods"); + bool isVerbose = !Logger.Instance.IgnoresEvent(LoggerEvent.Verbose); + bool isVV = !Logger.Instance.IgnoresEvent(LoggerEvent.VeryVerbose); + if (isVerbose) + Logger.v("Deobfuscating methods"); var methodPrinter = new MethodPrinter(); var cflowDeobfuscator = new BlocksCflowDeobfuscator(deob.BlocksDeobfuscators); foreach (var method in getAllMethods()) { - Logger.v("Deobfuscating {0} ({1:X8})", Utils.removeNewlines(method), method.MDToken.ToUInt32()); - Logger.Instance.indent(); + if (isVerbose) { + Logger.v("Deobfuscating {0} ({1:X8})", Utils.removeNewlines(method), method.MDToken.ToUInt32()); + Logger.Instance.indent(); + } int oldIndentLevel = Logger.Instance.IndentLevel; try { - deobfuscate(method, cflowDeobfuscator, methodPrinter); + deobfuscate(method, cflowDeobfuscator, methodPrinter, isVerbose, isVV); } catch (ApplicationException) { throw; } catch (Exception ex) { if (!canLoadMethodBody(method)) { - Logger.v("Invalid method body. {0:X8}", method.MDToken.ToInt32()); + if (isVerbose) + Logger.v("Invalid method body. {0:X8}", method.MDToken.ToInt32()); method.Body = new CilBody(); } else { @@ -568,7 +574,8 @@ namespace de4dot.code { } removeNoInliningAttribute(method); - Logger.Instance.deIndent(); + if (isVerbose) + Logger.Instance.deIndent(); } } @@ -582,7 +589,7 @@ namespace de4dot.code { } } - void deobfuscate(MethodDef method, BlocksCflowDeobfuscator cflowDeobfuscator, MethodPrinter methodPrinter) { + void deobfuscate(MethodDef method, BlocksCflowDeobfuscator cflowDeobfuscator, MethodPrinter methodPrinter, bool isVerbose, bool isVV) { if (!hasNonEmptyBody(method)) return; @@ -615,17 +622,16 @@ namespace de4dot.code { blocks.getCode(out allInstructions, out allExceptionHandlers); DotNetUtils.restoreBody(method, allInstructions, allExceptionHandlers); - if (numRemovedLocals > 0) + if (isVerbose && numRemovedLocals > 0) Logger.v("Removed {0} unused local(s)", numRemovedLocals); int numRemovedInstructions = oldNumInstructions - method.Body.Instructions.Count; - if (numRemovedInstructions > 0) + if (isVerbose && numRemovedInstructions > 0) Logger.v("Removed {0} dead instruction(s)", numRemovedInstructions); - const LoggerEvent dumpLogLevel = LoggerEvent.VeryVerbose; - if (!Logger.Instance.IgnoresEvent(dumpLogLevel)) { - Logger.log(dumpLogLevel, "Deobfuscated code:"); + if (isVV) { + Logger.log(LoggerEvent.VeryVerbose, "Deobfuscated code:"); Logger.Instance.indent(); - methodPrinter.print(dumpLogLevel, allInstructions, allExceptionHandlers); + methodPrinter.print(LoggerEvent.VeryVerbose, allInstructions, allExceptionHandlers); Logger.Instance.deIndent(); } } diff --git a/de4dot.code/renamer/Renamer.cs b/de4dot.code/renamer/Renamer.cs index 4ac187dd..3e2a5bbe 100644 --- a/de4dot.code/renamer/Renamer.cs +++ b/de4dot.code/renamer/Renamer.cs @@ -44,6 +44,7 @@ namespace de4dot.code.renamer { MemberInfos memberInfos = new MemberInfos(); DerivedFrom isDelegateClass; MergeStateHelper mergeStateHelper; + bool isVerbose; static string[] delegateClasses = new string[] { "System.Delegate", @@ -75,6 +76,7 @@ namespace de4dot.code.renamer { public void rename() { if (modules.Empty) return; + isVerbose = !Logger.Instance.IgnoresEvent(LoggerEvent.Verbose); Logger.n("Renaming all obfuscated symbols"); modules.initialize(); @@ -113,7 +115,8 @@ namespace de4dot.code.renamer { var overrideMethod = overrides[i].MethodDeclaration; if (method.MethodDef.Name != overrideMethod.Name) continue; - Logger.v("Removed useless override from method {0} ({1:X8}), override: {2:X8}", + if (isVerbose) + Logger.v("Removed useless override from method {0} ({1:X8}), override: {2:X8}", Utils.removeNewlines(method.MethodDef), method.MethodDef.MDToken.ToInt32(), overrideMethod.MDToken.ToInt32()); @@ -125,7 +128,8 @@ namespace de4dot.code.renamer { } void renameTypeDefinitions() { - Logger.v("Renaming obfuscated type definitions"); + if (isVerbose) + Logger.v("Renaming obfuscated type definitions"); foreach (var module in modules.TheModules) { if (module.ObfuscatedFile.RemoveNamespaceWithOneType) @@ -163,8 +167,8 @@ namespace de4dot.code.renamer { const int maxClasses = 1; if (list.Count != maxClasses) continue; - var ns = list[0].TypeDef.Namespace; - Logger.v("Removing namespace: {0}", Utils.removeNewlines(ns)); + if (isVerbose) + Logger.v("Removing namespace: {0}", Utils.removeNewlines(list[0].TypeDef.Namespace)); foreach (var type in list) memberInfos.type(type).newNamespace = ""; } @@ -183,7 +187,8 @@ namespace de4dot.code.renamer { var typeDefinition = type.TypeDef; var info = memberInfos.type(type); - Logger.v("Type: {0} ({1:X8})", Utils.removeNewlines(typeDefinition.FullName), typeDefinition.MDToken.ToUInt32()); + if (isVerbose) + Logger.v("Type: {0} ({1:X8})", Utils.removeNewlines(typeDefinition.FullName), typeDefinition.MDToken.ToUInt32()); Logger.Instance.indent(); renameGenericParams(type.GenericParams); @@ -191,13 +196,15 @@ namespace de4dot.code.renamer { if (RenameTypes && info.gotNewName()) { var old = typeDefinition.Name; typeDefinition.Name = new UTF8String(info.newName); - Logger.v("Name: {0} => {1}", Utils.removeNewlines(old), Utils.removeNewlines(typeDefinition.Name)); + if (isVerbose) + Logger.v("Name: {0} => {1}", Utils.removeNewlines(old), Utils.removeNewlines(typeDefinition.Name)); } if (RenameNamespaces && info.newNamespace != null) { var old = typeDefinition.Namespace; typeDefinition.Namespace = new UTF8String(info.newNamespace); - Logger.v("Namespace: {0} => {1}", Utils.removeNewlines(old), Utils.removeNewlines(typeDefinition.Namespace)); + if (isVerbose) + Logger.v("Namespace: {0} => {1}", Utils.removeNewlines(old), Utils.removeNewlines(typeDefinition.Namespace)); } Logger.Instance.deIndent(); @@ -211,12 +218,14 @@ namespace de4dot.code.renamer { if (!info.gotNewName()) continue; param.GenericParam.Name = new UTF8String(info.newName); - Logger.v("GenParam: {0} => {1}", Utils.removeNewlines(info.oldFullName), Utils.removeNewlines(param.GenericParam.FullName)); + if (isVerbose) + Logger.v("GenParam: {0} => {1}", Utils.removeNewlines(info.oldFullName), Utils.removeNewlines(param.GenericParam.FullName)); } } void renameMemberDefinitions() { - Logger.v("Renaming member definitions #2"); + if (isVerbose) + Logger.v("Renaming member definitions #2"); var allTypes = new List(modules.AllTypes); allTypes.Sort((a, b) => a.Index.CompareTo(b.Index)); @@ -230,7 +239,8 @@ namespace de4dot.code.renamer { void renameMembers(MTypeDef type) { var info = memberInfos.type(type); - Logger.v("Type: {0}", Utils.removeNewlines(info.type.TypeDef.FullName)); + if (isVerbose) + Logger.v("Type: {0}", Utils.removeNewlines(info.type.TypeDef.FullName)); Logger.Instance.indent(); renameFields(info); @@ -249,7 +259,8 @@ namespace de4dot.code.renamer { if (!fieldInfo.gotNewName()) continue; fieldDef.FieldDef.Name = new UTF8String(fieldInfo.newName); - Logger.v("Field: {0} ({1:X8}) => {2}", + if (isVerbose) + Logger.v("Field: {0} ({1:X8}) => {2}", Utils.removeNewlines(fieldInfo.oldFullName), fieldDef.FieldDef.MDToken.ToUInt32(), Utils.removeNewlines(fieldDef.FieldDef.FullName)); @@ -264,7 +275,8 @@ namespace de4dot.code.renamer { if (!propInfo.gotNewName()) continue; propDef.PropertyDef.Name = new UTF8String(propInfo.newName); - Logger.v("Property: {0} ({1:X8}) => {2}", + if (isVerbose) + Logger.v("Property: {0} ({1:X8}) => {2}", Utils.removeNewlines(propInfo.oldFullName), propDef.PropertyDef.MDToken.ToUInt32(), Utils.removeNewlines(propDef.PropertyDef.FullName)); @@ -279,7 +291,8 @@ namespace de4dot.code.renamer { if (!eventInfo.gotNewName()) continue; eventDef.EventDef.Name = new UTF8String(eventInfo.newName); - Logger.v("Event: {0} ({1:X8}) => {2}", + if (isVerbose) + Logger.v("Event: {0} ({1:X8}) => {2}", Utils.removeNewlines(eventInfo.oldFullName), eventDef.EventDef.MDToken.ToUInt32(), Utils.removeNewlines(eventDef.EventDef.FullName)); @@ -291,14 +304,16 @@ namespace de4dot.code.renamer { return; foreach (var methodDef in info.type.AllMethodsSorted) { var methodInfo = memberInfos.method(methodDef); - Logger.v("Method {0} ({1:X8})", Utils.removeNewlines(methodInfo.oldFullName), methodDef.MethodDef.MDToken.ToUInt32()); + if (isVerbose) + Logger.v("Method {0} ({1:X8})", Utils.removeNewlines(methodInfo.oldFullName), methodDef.MethodDef.MDToken.ToUInt32()); Logger.Instance.indent(); renameGenericParams(methodDef.GenericParams); if (RenameMethods && methodInfo.gotNewName()) { methodDef.MethodDef.Name = new UTF8String(methodInfo.newName); - Logger.v("Name: {0} => {1}", Utils.removeNewlines(methodInfo.oldFullName), Utils.removeNewlines(methodDef.MethodDef.FullName)); + if (isVerbose) + Logger.v("Name: {0} => {1}", Utils.removeNewlines(methodInfo.oldFullName), Utils.removeNewlines(methodDef.MethodDef.FullName)); } if (RenameMethodArgs) { @@ -308,10 +323,12 @@ namespace de4dot.code.renamer { continue; param.ParameterDefinition.CreateParamDef(); param.ParameterDefinition.Name = paramInfo.newName; - if (param.IsReturnParameter) - Logger.v("RetParam: {0} => {1}", Utils.removeNewlines(paramInfo.oldName), Utils.removeNewlines(paramInfo.newName)); - else - Logger.v("Param ({0}/{1}): {2} => {3}", param.ParameterDefinition.MethodSigIndex + 1, methodDef.MethodDef.MethodSig.GetParamCount(), Utils.removeNewlines(paramInfo.oldName), Utils.removeNewlines(paramInfo.newName)); + if (isVerbose) { + if (param.IsReturnParameter) + Logger.v("RetParam: {0} => {1}", Utils.removeNewlines(paramInfo.oldName), Utils.removeNewlines(paramInfo.newName)); + else + Logger.v("Param ({0}/{1}): {2} => {3}", param.ParameterDefinition.MethodSigIndex + 1, methodDef.MethodDef.MethodSig.GetParamCount(), Utils.removeNewlines(paramInfo.oldName), Utils.removeNewlines(paramInfo.newName)); + } } } @@ -320,9 +337,10 @@ namespace de4dot.code.renamer { } void renameMemberReferences() { - Logger.v("Renaming references to other definitions"); + if (isVerbose) + Logger.v("Renaming references to other definitions"); foreach (var module in modules.TheModules) { - if (modules.TheModules.Count > 1) + if (modules.TheModules.Count > 1 && isVerbose) Logger.v("Renaming references to other definitions ({0})", module.Filename); Logger.Instance.indent(); foreach (var refToDef in module.MethodRefsToRename) @@ -338,9 +356,10 @@ namespace de4dot.code.renamer { } void renameResources() { - Logger.v("Renaming resources"); + if (isVerbose) + Logger.v("Renaming resources"); foreach (var module in modules.TheModules) { - if (modules.TheModules.Count > 1) + if (modules.TheModules.Count > 1 && isVerbose) Logger.v("Renaming resources ({0})", module.Filename); Logger.Instance.indent(); renameResources(module); @@ -387,10 +406,11 @@ namespace de4dot.code.renamer { } void renameTypeReferences() { - Logger.v("Renaming references to type definitions"); + if (isVerbose) + Logger.v("Renaming references to type definitions"); var theModules = modules.TheModules; foreach (var module in theModules) { - if (theModules.Count > 1) + if (theModules.Count > 1 && isVerbose) Logger.v("Renaming references to type definitions ({0})", module.Filename); Logger.Instance.indent(); foreach (var refToDef in module.TypeRefsToRename) { @@ -581,7 +601,8 @@ namespace de4dot.code.renamer { return null; if (propDef.GetMethod != null) return null; - Logger.v("Restoring property getter {0} ({1:X8}), Property: {2} ({3:X8})", + if (isVerbose) + Logger.v("Restoring property getter {0} ({1:X8}), Property: {2} ({3:X8})", Utils.removeNewlines(propMethod), propMethod.MethodDef.MDToken.ToInt32(), Utils.removeNewlines(propDef.PropertyDef), @@ -610,7 +631,8 @@ namespace de4dot.code.renamer { return null; if (propDef.SetMethod != null) return null; - Logger.v("Restoring property setter {0} ({1:X8}), Property: {2} ({3:X8})", + if (isVerbose) + Logger.v("Restoring property setter {0} ({1:X8}), Property: {2} ({3:X8})", Utils.removeNewlines(propMethod), propMethod.MethodDef.MDToken.ToInt32(), Utils.removeNewlines(propDef.PropertyDef), @@ -636,7 +658,8 @@ namespace de4dot.code.renamer { propDef = ownerType.create(newProp); memberInfos.add(propDef); - Logger.v("Restoring property: {0}", Utils.removeNewlines(newProp)); + if (isVerbose) + Logger.v("Restoring property: {0}", Utils.removeNewlines(newProp)); return propDef; } @@ -805,7 +828,8 @@ namespace de4dot.code.renamer { return null; if (eventDef.AddMethod != null) return null; - Logger.v("Restoring event adder {0} ({1:X8}), Event: {2} ({3:X8})", + if (isVerbose) + Logger.v("Restoring event adder {0} ({1:X8}), Event: {2} ({3:X8})", Utils.removeNewlines(eventMethod), eventMethod.MethodDef.MDToken.ToInt32(), Utils.removeNewlines(eventDef.EventDef), @@ -831,7 +855,8 @@ namespace de4dot.code.renamer { return null; if (eventDef.RemoveMethod != null) return null; - Logger.v("Restoring event remover {0} ({1:X8}), Event: {2} ({3:X8})", + if (isVerbose) + Logger.v("Restoring event remover {0} ({1:X8}), Event: {2} ({3:X8})", Utils.removeNewlines(eventMethod), eventMethod.MethodDef.MDToken.ToInt32(), Utils.removeNewlines(eventDef.EventDef), @@ -861,12 +886,14 @@ namespace de4dot.code.renamer { eventDef = ownerType.create(newEvent); memberInfos.add(eventDef); - Logger.v("Restoring event: {0}", Utils.removeNewlines(newEvent)); + if (isVerbose) + Logger.v("Restoring event: {0}", Utils.removeNewlines(newEvent)); return eventDef; } void prepareRenameMemberDefinitions(MethodNameGroups groups) { - Logger.v("Renaming member definitions #1"); + if (isVerbose) + Logger.v("Renaming member definitions #1"); prepareRenameEntryPoints();