From 9acec7a033d84a0089a8cb120f6e526c0bbf0fc8 Mon Sep 17 00:00:00 2001 From: de4dot Date: Wed, 25 Sep 2013 02:17:24 +0200 Subject: [PATCH 1/5] Make sure decl type exists --- de4dot.code/renamer/Renamer.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/de4dot.code/renamer/Renamer.cs b/de4dot.code/renamer/Renamer.cs index d5bd9634..915efe59 100644 --- a/de4dot.code/renamer/Renamer.cs +++ b/de4dot.code/renamer/Renamer.cs @@ -1232,6 +1232,8 @@ namespace de4dot.code.renamer { } } var overrideMethod = method.MethodDef.Overrides[0].MethodDeclaration; + if (overrideMethod.DeclaringType == null) + return ""; var name = overrideMethod.DeclaringType.FullName.Replace('/', '.'); name = removeGenericsArityRegex.Replace(name, ""); return name + "."; From 085c62015d4b819ecb7ba52943c6627eecc88d92 Mon Sep 17 00:00:00 2001 From: de4dot Date: Thu, 26 Sep 2013 16:31:38 +0200 Subject: [PATCH 2/5] Add updated dnlib submodule --- dnlib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dnlib b/dnlib index fda808af..29c5bfd1 160000 --- a/dnlib +++ b/dnlib @@ -1 +1 @@ -Subproject commit fda808afae435fe1259074dd129e0ba97b0091c1 +Subproject commit 29c5bfd1e57ea8041034cce69e8b741613126a52 From 50ff551898b18d9fb196c71b2c52ca6854a01be0 Mon Sep 17 00:00:00 2001 From: de4dot Date: Thu, 26 Sep 2013 16:32:45 +0200 Subject: [PATCH 3/5] Use new ModuleDef method to clear TypeDef cache --- de4dot.code/renamer/asmmodules/Module.cs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/de4dot.code/renamer/asmmodules/Module.cs b/de4dot.code/renamer/asmmodules/Module.cs index d4d1f255..9b20f423 100644 --- a/de4dot.code/renamer/asmmodules/Module.cs +++ b/de4dot.code/renamer/asmmodules/Module.cs @@ -227,9 +227,7 @@ namespace de4dot.code.renamer.asmmodules { } types = newTypes; - bool old = ModuleDefMD.EnableTypeDefFindCache; - ModuleDefMD.EnableTypeDefFindCache = false; - ModuleDefMD.EnableTypeDefFindCache = old; + ModuleDefMD.ResetTypeDefFindCache(); } static ITypeDefOrRef GetNonGenericTypeRef(ITypeDefOrRef typeRef) { From d0bee2811126c0e5dff4f620a818611cf90e65e8 Mon Sep 17 00:00:00 2001 From: de4dot Date: Thu, 26 Sep 2013 16:36:52 +0200 Subject: [PATCH 4/5] Disable TypeDef cache when removing types etc --- de4dot.code/deobfuscators/DeobfuscatorBase.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/de4dot.code/deobfuscators/DeobfuscatorBase.cs b/de4dot.code/deobfuscators/DeobfuscatorBase.cs index e8c2b5a7..bfbf8de8 100644 --- a/de4dot.code/deobfuscators/DeobfuscatorBase.cs +++ b/de4dot.code/deobfuscators/DeobfuscatorBase.cs @@ -181,6 +181,10 @@ namespace de4dot.code.deobfuscators { } public virtual void DeobfuscateEnd() { + // Make sure the TypeDefCache isn't enabled while we modify types or remove stuff + bool cacheState = module.EnableTypeDefFindCache; + module.EnableTypeDefFindCache = false; + if (CanRemoveTypes) { RemoveTypesWithInvalidBaseTypes(); @@ -195,6 +199,8 @@ namespace de4dot.code.deobfuscators { RestoreBaseType(); FixMDHeaderVersion(); + + module.EnableTypeDefFindCache = cacheState; } static bool IsTypeWithInvalidBaseType(TypeDef moduleType, TypeDef type) { From 158fb63bbaa8183adc6db22d00e6827e100067ef Mon Sep 17 00:00:00 2001 From: de4dot Date: Thu, 26 Sep 2013 19:29:02 +0200 Subject: [PATCH 5/5] If asm is not SN signed, only use its name, not version, PKT etc --- de4dot.code/renamer/asmmodules/Modules.cs | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/de4dot.code/renamer/asmmodules/Modules.cs b/de4dot.code/renamer/asmmodules/Modules.cs index b4477a32..83e4ec2a 100644 --- a/de4dot.code/renamer/asmmodules/Modules.cs +++ b/de4dot.code/renamer/asmmodules/Modules.cs @@ -61,18 +61,26 @@ namespace de4dot.code.renamer.asmmodules { moduleHash.Add(module); } - string GetModuleKey(Module module) { + static string GetModuleKey(Module module) { if (module.ModuleDefMD.Assembly != null) - return module.ModuleDefMD.Assembly.ToString(); + return GetAssemblyName(module.ModuleDefMD.Assembly); return Utils.GetBaseName(module.ModuleDefMD.Location); } - public ModuleHash Lookup(string assemblyName) { + public ModuleHash Lookup(IAssembly asm) { ModuleHash moduleHash; - if (assemblyHash.TryGetValue(assemblyName, out moduleHash)) + if (assemblyHash.TryGetValue(GetAssemblyName(asm), out moduleHash)) return moduleHash; return null; } + + static string GetAssemblyName(IAssembly asm) { + if (asm == null) + return string.Empty; + if (PublicKeyBase.IsNullOrEmpty2(asm.PublicKeyOrToken)) + return asm.Name; + return asm.FullName; + } } class ModuleHash { @@ -402,7 +410,7 @@ namespace de4dot.code.renamer.asmmodules { var asm = type.Module.Assembly; if (asm == null) return null; - var moduleHash = assemblyHash.Lookup(asm.FullName); + var moduleHash = assemblyHash.Lookup(asm); if (moduleHash == null) return null; var module = moduleHash.Lookup(scope.ScopeName); @@ -415,7 +423,7 @@ namespace de4dot.code.renamer.asmmodules { } IEnumerable FindModules(AssemblyRef assemblyRef) { - var moduleHash = assemblyHash.Lookup(assemblyRef.FullName); + var moduleHash = assemblyHash.Lookup(assemblyRef); if (moduleHash != null) return moduleHash.Modules; return null;