From e8879cd51fb359f3a2891af21a5d9cf3db61c811 Mon Sep 17 00:00:00 2001 From: de4dot Date: Sun, 17 Nov 2013 18:12:21 +0100 Subject: [PATCH] Print old -> new tokens if -v option is used --- de4dot.code/ObfuscatedFile.cs | 2 +- de4dot.code/PrintNewTokens.cs | 107 +++++++++++++++++++++++++++++++++ de4dot.code/de4dot.code.csproj | 1 + 3 files changed, 109 insertions(+), 1 deletion(-) create mode 100644 de4dot.code/PrintNewTokens.cs diff --git a/de4dot.code/ObfuscatedFile.cs b/de4dot.code/ObfuscatedFile.cs index 35cc83e0..e613f31b 100644 --- a/de4dot.code/ObfuscatedFile.cs +++ b/de4dot.code/ObfuscatedFile.cs @@ -347,7 +347,7 @@ namespace de4dot.code { var mdFlags = GetMetaDataFlags(); if (!options.ControlFlowDeobfuscation) mdFlags |= MetaDataFlags.KeepOldMaxStack; - assemblyModule.Save(options.NewFilename, mdFlags, deob as IModuleWriterListener); + assemblyModule.Save(options.NewFilename, mdFlags, new PrintNewTokens(module, deob as IModuleWriterListener)); } IList GetAllMethods() { diff --git a/de4dot.code/PrintNewTokens.cs b/de4dot.code/PrintNewTokens.cs new file mode 100644 index 00000000..0ff4308a --- /dev/null +++ b/de4dot.code/PrintNewTokens.cs @@ -0,0 +1,107 @@ +/* + Copyright (C) 2011-2013 de4dot@gmail.com + + This file is part of de4dot. + + de4dot is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + de4dot is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with de4dot. If not, see . +*/ + +using dnlib.DotNet; +using dnlib.DotNet.MD; +using dnlib.DotNet.Writer; + +namespace de4dot.code { + class PrintNewTokens : IModuleWriterListener { + readonly ModuleDef module; + readonly IModuleWriterListener otherListener; + + public PrintNewTokens(ModuleDef module, IModuleWriterListener otherListener) { + this.module = module; + this.otherListener = otherListener; + } + + public void OnWriterEvent(ModuleWriterBase writer, ModuleWriterEvent evt) { + if (otherListener != null) + otherListener.OnWriterEvent(writer, evt); + if (evt == ModuleWriterEvent.End) + PrintTokens(writer); + } + + void PrintTokens(ModuleWriterBase writer) { + if (Logger.Instance.IgnoresEvent(LoggerEvent.Verbose)) + return; + + var md = writer.MetaData; + + Logger.v("Old -> new tokens: Assembly: {0} (module: {1})", module.Assembly, module.Location); + Logger.Instance.Indent(); + foreach (var type in module.GetTypes()) { + uint newRid; + + newRid = md.GetRid(type); + if (newRid == 0) + continue; + Logger.v("{0:X8} -> {1:X8} Type: {2}", + type.MDToken.ToUInt32(), + new MDToken(Table.TypeDef, newRid).ToUInt32(), + Utils.RemoveNewlines(type)); + + Logger.Instance.Indent(); + + foreach (var method in type.Methods) { + newRid = md.GetRid(method); + if (newRid == 0) + continue; + Logger.v("{0:X8} -> {1:X8} Method: {2}", + method.MDToken.ToUInt32(), + new MDToken(Table.Method, newRid).ToUInt32(), + Utils.RemoveNewlines(method)); + } + + foreach (var field in type.Fields) { + newRid = md.GetRid(field); + if (newRid == 0) + continue; + Logger.v("{0:X8} -> {1:X8} Field: {2}", + field.MDToken.ToUInt32(), + new MDToken(Table.Field, newRid).ToUInt32(), + Utils.RemoveNewlines(field)); + } + + foreach (var prop in type.Properties) { + newRid = md.GetRid(prop); + if (newRid == 0) + continue; + Logger.v("{0:X8} -> {1:X8} Property: {2}", + prop.MDToken.ToUInt32(), + new MDToken(Table.Property, newRid).ToUInt32(), + Utils.RemoveNewlines(prop)); + } + + foreach (var evt in type.Events) { + newRid = md.GetRid(evt); + if (newRid == 0) + continue; + Logger.v("{0:X8} -> {1:X8} Event: {2}", + evt.MDToken.ToUInt32(), + new MDToken(Table.Event, newRid).ToUInt32(), + Utils.RemoveNewlines(evt)); + } + + Logger.Instance.DeIndent(); + } + Logger.Instance.DeIndent(); + } + } +} diff --git a/de4dot.code/de4dot.code.csproj b/de4dot.code/de4dot.code.csproj index 17114906..9f48a2e0 100644 --- a/de4dot.code/de4dot.code.csproj +++ b/de4dot.code/de4dot.code.csproj @@ -311,6 +311,7 @@ +