From e744e24a51215d5370633504586f2bfc42da3a6b Mon Sep 17 00:00:00 2001 From: de4dot Date: Sat, 31 Dec 2011 16:32:57 +0100 Subject: [PATCH] Use methods dict --- de4dot.code/deobfuscators/DeobfuscatorBase.cs | 42 +++++++++---------- .../dotNET_Reactor/v4/Deobfuscator.cs | 2 +- 2 files changed, 21 insertions(+), 23 deletions(-) diff --git a/de4dot.code/deobfuscators/DeobfuscatorBase.cs b/de4dot.code/deobfuscators/DeobfuscatorBase.cs index 027ff502..87e07832 100644 --- a/de4dot.code/deobfuscators/DeobfuscatorBase.cs +++ b/de4dot.code/deobfuscators/DeobfuscatorBase.cs @@ -171,8 +171,8 @@ namespace de4dot.code.deobfuscators { } class MethodCallRemover { - Dictionary> methodNameInfos = new Dictionary>(StringComparer.Ordinal); - Dictionary> methodRefInfos = new Dictionary>(); + Dictionary> methodNameInfos = new Dictionary>(); + MethodDefinitionAndDeclaringTypeDict> methodRefInfos = new MethodDefinitionAndDeclaringTypeDict>(); void checkMethod(MethodReference methodToBeRemoved) { if (methodToBeRemoved.Parameters.Count != 0) @@ -181,27 +181,26 @@ namespace de4dot.code.deobfuscators { throw new ApplicationException(string.Format("Method has a return value: {0}", methodToBeRemoved)); } - public void add(string method, MethodReference methodToBeRemoved) { + public void add(string method, MethodDefinition methodToBeRemoved) { if (methodToBeRemoved == null) return; checkMethod(methodToBeRemoved); - Dictionary dict; + MethodDefinitionAndDeclaringTypeDict dict; if (!methodNameInfos.TryGetValue(method, out dict)) - methodNameInfos[method] = dict = new Dictionary(); - dict[new MethodReferenceAndDeclaringTypeKey(methodToBeRemoved)] = true; + methodNameInfos[method] = dict = new MethodDefinitionAndDeclaringTypeDict(); + dict.add(methodToBeRemoved, true); } - public void add(MethodDefinition method, MethodReference methodToBeRemoved) { + public void add(MethodDefinition method, MethodDefinition methodToBeRemoved) { if (method == null || methodToBeRemoved == null) return; checkMethod(methodToBeRemoved); - Dictionary dict; - var methodKey = new MethodReferenceAndDeclaringTypeKey(method); - if (!methodRefInfos.TryGetValue(methodKey, out dict)) - methodRefInfos[methodKey] = dict = new Dictionary(); - dict[new MethodReferenceAndDeclaringTypeKey(methodToBeRemoved)] = true; + var dict = methodRefInfos.find(method); + if (dict == null) + methodRefInfos.add(method, dict = new MethodDefinitionAndDeclaringTypeDict()); + dict.add(methodToBeRemoved, true); } public void removeAll(Blocks blocks) { @@ -212,7 +211,7 @@ namespace de4dot.code.deobfuscators { } void removeAll(IList allBlocks, Blocks blocks, string method) { - Dictionary info; + MethodDefinitionAndDeclaringTypeDict info; if (!methodNameInfos.TryGetValue(method, out info)) return; @@ -220,14 +219,14 @@ namespace de4dot.code.deobfuscators { } void removeAll(IList allBlocks, Blocks blocks, MethodDefinition method) { - Dictionary info; - if (!methodRefInfos.TryGetValue(new MethodReferenceAndDeclaringTypeKey(method), out info)) + var info = methodRefInfos.find(method); + if (info == null) return; removeCalls(allBlocks, blocks, info); } - void removeCalls(IList allBlocks, Blocks blocks, Dictionary info) { + void removeCalls(IList allBlocks, Blocks blocks, MethodDefinitionAndDeclaringTypeDict info) { var instrsToDelete = new List(); foreach (var block in allBlocks) { instrsToDelete.Clear(); @@ -239,8 +238,7 @@ namespace de4dot.code.deobfuscators { if (destMethod == null) continue; - var key = new MethodReferenceAndDeclaringTypeKey(destMethod); - if (info.ContainsKey(key)) { + if (info.find(destMethod)) { Log.v("Removed call to {0}", destMethod); instrsToDelete.Add(i); } @@ -250,19 +248,19 @@ namespace de4dot.code.deobfuscators { } } - public void addCctorInitCallToBeRemoved(MethodReference methodToBeRemoved) { + public void addCctorInitCallToBeRemoved(MethodDefinition methodToBeRemoved) { methodCallRemover.add(".cctor", methodToBeRemoved); } - public void addModuleCctorInitCallToBeRemoved(MethodReference methodToBeRemoved) { + public void addModuleCctorInitCallToBeRemoved(MethodDefinition methodToBeRemoved) { methodCallRemover.add(DotNetUtils.getMethod(DotNetUtils.getModuleType(module), ".cctor"), methodToBeRemoved); } - public void addCtorInitCallToBeRemoved(MethodReference methodToBeRemoved) { + public void addCtorInitCallToBeRemoved(MethodDefinition methodToBeRemoved) { methodCallRemover.add(".ctor", methodToBeRemoved); } - public void addCallToBeRemoved(MethodDefinition method, MethodReference methodToBeRemoved) { + public void addCallToBeRemoved(MethodDefinition method, MethodDefinition methodToBeRemoved) { methodCallRemover.add(method, methodToBeRemoved); } diff --git a/de4dot.code/deobfuscators/dotNET_Reactor/v4/Deobfuscator.cs b/de4dot.code/deobfuscators/dotNET_Reactor/v4/Deobfuscator.cs index 251526fc..3672d514 100644 --- a/de4dot.code/deobfuscators/dotNET_Reactor/v4/Deobfuscator.cs +++ b/de4dot.code/deobfuscators/dotNET_Reactor/v4/Deobfuscator.cs @@ -493,7 +493,7 @@ namespace de4dot.code.deobfuscators.dotNET_Reactor.v4 { startedDeobfuscating = true; } - void addEntryPointCallToBeRemoved(MethodReference methodToBeRemoved) { + void addEntryPointCallToBeRemoved(MethodDefinition methodToBeRemoved) { var entryPoint = module.EntryPoint; addCallToBeRemoved(entryPoint, methodToBeRemoved); foreach (var info in DotNetUtils.getCalledMethods(module, entryPoint))