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) { 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 + "."; 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) { 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; diff --git a/dnlib b/dnlib index 68457d32..29c5bfd1 160000 --- a/dnlib +++ b/dnlib @@ -1 +1 @@ -Subproject commit 68457d32d7c789e24be211cfded8ec1029ea985b +Subproject commit 29c5bfd1e57ea8041034cce69e8b741613126a52