Don't call logger.v() unless verbose log level is enabled

This commit is contained in:
de4dot 2012-11-11 11:37:40 +01:00
parent 53dd1e3619
commit c47039c2ef
2 changed files with 78 additions and 45 deletions

View File

@ -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();
}
}

View File

@ -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<MTypeDef>(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();