From d2b621b5b3d138e3b83144918f12b9c29b0b1e4d Mon Sep 17 00:00:00 2001 From: de4dot Date: Wed, 5 Oct 2011 08:20:32 +0200 Subject: [PATCH] Netmodules are better supported now --- AssemblyData/methodsrewriter/Resolver.cs | 2 +- blocks/DotNetUtils.cs | 2 ++ de4dot.code/AssemblyModule.cs | 2 +- de4dot.code/AssemblyResolver.cs | 16 +++++++++------- de4dot.code/deobfuscators/DeobfuscatorBase.cs | 6 ++++-- de4dot.code/renamer/DefinitionsRenamer.cs | 11 +++++++++-- de4dot.code/renamer/MemberRefFinder.cs | 2 +- 7 files changed, 27 insertions(+), 14 deletions(-) diff --git a/AssemblyData/methodsrewriter/Resolver.cs b/AssemblyData/methodsrewriter/Resolver.cs index 55127913..18be64d1 100644 --- a/AssemblyData/methodsrewriter/Resolver.cs +++ b/AssemblyData/methodsrewriter/Resolver.cs @@ -49,7 +49,7 @@ namespace AssemblyData.methodsrewriter { static MModule getModule(AssemblyNameReference assemblyRef) { foreach (var mm in modules.Values) { var asm = mm.moduleDefinition.Assembly; - if (asm.Name.FullName == assemblyRef.FullName) + if (asm != null && asm.Name.FullName == assemblyRef.FullName) return mm; } return null; diff --git a/blocks/DotNetUtils.cs b/blocks/DotNetUtils.cs index 4d6ba3f2..c0a64426 100644 --- a/blocks/DotNetUtils.cs +++ b/blocks/DotNetUtils.cs @@ -429,6 +429,8 @@ namespace de4dot.blocks { public static IEnumerable findAttributes(AssemblyDefinition asm, TypeReference attr) { var list = new List(); + if (asm == null) + return list; foreach (var cattr in asm.CustomAttributes) { if (MemberReferenceHelper.compareTypes(attr, cattr.AttributeType)) list.Add(cattr); diff --git a/de4dot.code/AssemblyModule.cs b/de4dot.code/AssemblyModule.cs index 8181e5d3..ee030fab 100644 --- a/de4dot.code/AssemblyModule.cs +++ b/de4dot.code/AssemblyModule.cs @@ -45,7 +45,7 @@ namespace de4dot { } public void save(string newFilename) { - module.Assembly.Write(newFilename); + module.Write(newFilename); } void readMethodsFile() { diff --git a/de4dot.code/AssemblyResolver.cs b/de4dot.code/AssemblyResolver.cs index 3f0df00d..31571f00 100644 --- a/de4dot.code/AssemblyResolver.cs +++ b/de4dot.code/AssemblyResolver.cs @@ -41,15 +41,17 @@ namespace de4dot { } public void addModule(ModuleDefinition module) { - var assembly = module.Assembly; - var name = assembly.Name.FullName; - if (!addedAssemblies.ContainsKey(name) && cache.ContainsKey(name)) - throw new ApplicationException(string.Format("Assembly {0} was loaded by other code.", name)); - addedAssemblies[name] = true; - var dir = Path.GetDirectoryName(module.FullyQualifiedName); addSearchDirectory(dir); - RegisterAssembly(assembly); + + var assembly = module.Assembly; + if (assembly != null) { + var name = assembly.Name.FullName; + if (!addedAssemblies.ContainsKey(name) && cache.ContainsKey(name)) + throw new ApplicationException(string.Format("Assembly {0} was loaded by other code.", name)); + addedAssemblies[name] = true; + RegisterAssembly(assembly); + } } } } diff --git a/de4dot.code/deobfuscators/DeobfuscatorBase.cs b/de4dot.code/deobfuscators/DeobfuscatorBase.cs index 7081e382..13386e30 100644 --- a/de4dot.code/deobfuscators/DeobfuscatorBase.cs +++ b/de4dot.code/deobfuscators/DeobfuscatorBase.cs @@ -287,7 +287,8 @@ namespace de4dot.deobfuscators { Log.v("Removing custom attributes"); Log.indent(); deleteCustomAttributes(module.CustomAttributes); - deleteCustomAttributes(module.Assembly.CustomAttributes); + if (module.Assembly != null) + deleteCustomAttributes(module.Assembly.CustomAttributes); Log.deIndent(); } @@ -312,7 +313,8 @@ namespace de4dot.deobfuscators { Log.v("Removing other attributes"); Log.indent(); deleteOtherAttributes(module.CustomAttributes); - deleteOtherAttributes(module.Assembly.CustomAttributes); + if (module.Assembly != null) + deleteOtherAttributes(module.Assembly.CustomAttributes); Log.deIndent(); } diff --git a/de4dot.code/renamer/DefinitionsRenamer.cs b/de4dot.code/renamer/DefinitionsRenamer.cs index 01f57ca8..1bc8c060 100644 --- a/de4dot.code/renamer/DefinitionsRenamer.cs +++ b/de4dot.code/renamer/DefinitionsRenamer.cs @@ -41,12 +41,18 @@ namespace de4dot.renamer { public void add(Module module) { ModuleHash moduleHash; - var key = module.ModuleDefinition.Assembly.ToString(); + var key = getModuleKey(module); if (!assemblyHash.TryGetValue(key, out moduleHash)) assemblyHash[key] = moduleHash = new ModuleHash(); moduleHash.add(module); } + string getModuleKey(Module module) { + if (module.ModuleDefinition.Assembly != null) + return module.ModuleDefinition.Assembly.ToString(); + return Utils.getBaseName(module.ModuleDefinition.FullyQualifiedName); + } + public ModuleHash lookup(string assemblyName) { ModuleHash moduleHash; if (assemblyHash.TryGetValue(assemblyName, out moduleHash)) @@ -60,7 +66,8 @@ namespace de4dot.renamer { Module mainModule = null; public void add(Module module) { - if (ReferenceEquals(module.ModuleDefinition.Assembly.MainModule, module.ModuleDefinition)) { + var asm = module.ModuleDefinition.Assembly; + if (asm != null && ReferenceEquals(asm.MainModule, module.ModuleDefinition)) { if (mainModule != null) throw new UserException(string.Format("Two modules in the same assembly are main modules. If 32-bit vs 64-bit, don't use both assemblies at the same time! \"{0}\" and \"{1}\"", module.ModuleDefinition.FullyQualifiedName, mainModule.ModuleDefinition.FullyQualifiedName)); mainModule = module; diff --git a/de4dot.code/renamer/MemberRefFinder.cs b/de4dot.code/renamer/MemberRefFinder.cs index ddb65a9d..a6c875c0 100644 --- a/de4dot.code/renamer/MemberRefFinder.cs +++ b/de4dot.code/renamer/MemberRefFinder.cs @@ -111,7 +111,7 @@ namespace de4dot { void addModule(ModuleDefinition module) { pushMember(module.EntryPoint); access(() => addCustomAttributes(module.CustomAttributes)); - if (module == module.Assembly.MainModule) { + if (module.Assembly != null && module == module.Assembly.MainModule) { var asm = module.Assembly; access(() => addCustomAttributes(asm.CustomAttributes)); addSecurityDeclarations(asm.SecurityDeclarations);