Use methods dict

This commit is contained in:
de4dot 2011-12-31 16:32:57 +01:00
parent 99350b456d
commit e744e24a51
2 changed files with 21 additions and 23 deletions

View File

@ -171,8 +171,8 @@ namespace de4dot.code.deobfuscators {
} }
class MethodCallRemover { class MethodCallRemover {
Dictionary<string, Dictionary<MethodReferenceAndDeclaringTypeKey, bool>> methodNameInfos = new Dictionary<string, Dictionary<MethodReferenceAndDeclaringTypeKey, bool>>(StringComparer.Ordinal); Dictionary<string, MethodDefinitionAndDeclaringTypeDict<bool>> methodNameInfos = new Dictionary<string, MethodDefinitionAndDeclaringTypeDict<bool>>();
Dictionary<MethodReferenceAndDeclaringTypeKey, Dictionary<MethodReferenceAndDeclaringTypeKey, bool>> methodRefInfos = new Dictionary<MethodReferenceAndDeclaringTypeKey, Dictionary<MethodReferenceAndDeclaringTypeKey, bool>>(); MethodDefinitionAndDeclaringTypeDict<MethodDefinitionAndDeclaringTypeDict<bool>> methodRefInfos = new MethodDefinitionAndDeclaringTypeDict<MethodDefinitionAndDeclaringTypeDict<bool>>();
void checkMethod(MethodReference methodToBeRemoved) { void checkMethod(MethodReference methodToBeRemoved) {
if (methodToBeRemoved.Parameters.Count != 0) 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)); 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) if (methodToBeRemoved == null)
return; return;
checkMethod(methodToBeRemoved); checkMethod(methodToBeRemoved);
Dictionary<MethodReferenceAndDeclaringTypeKey, bool> dict; MethodDefinitionAndDeclaringTypeDict<bool> dict;
if (!methodNameInfos.TryGetValue(method, out dict)) if (!methodNameInfos.TryGetValue(method, out dict))
methodNameInfos[method] = dict = new Dictionary<MethodReferenceAndDeclaringTypeKey, bool>(); methodNameInfos[method] = dict = new MethodDefinitionAndDeclaringTypeDict<bool>();
dict[new MethodReferenceAndDeclaringTypeKey(methodToBeRemoved)] = true; dict.add(methodToBeRemoved, true);
} }
public void add(MethodDefinition method, MethodReference methodToBeRemoved) { public void add(MethodDefinition method, MethodDefinition methodToBeRemoved) {
if (method == null || methodToBeRemoved == null) if (method == null || methodToBeRemoved == null)
return; return;
checkMethod(methodToBeRemoved); checkMethod(methodToBeRemoved);
Dictionary<MethodReferenceAndDeclaringTypeKey, bool> dict; var dict = methodRefInfos.find(method);
var methodKey = new MethodReferenceAndDeclaringTypeKey(method); if (dict == null)
if (!methodRefInfos.TryGetValue(methodKey, out dict)) methodRefInfos.add(method, dict = new MethodDefinitionAndDeclaringTypeDict<bool>());
methodRefInfos[methodKey] = dict = new Dictionary<MethodReferenceAndDeclaringTypeKey, bool>(); dict.add(methodToBeRemoved, true);
dict[new MethodReferenceAndDeclaringTypeKey(methodToBeRemoved)] = true;
} }
public void removeAll(Blocks blocks) { public void removeAll(Blocks blocks) {
@ -212,7 +211,7 @@ namespace de4dot.code.deobfuscators {
} }
void removeAll(IList<Block> allBlocks, Blocks blocks, string method) { void removeAll(IList<Block> allBlocks, Blocks blocks, string method) {
Dictionary<MethodReferenceAndDeclaringTypeKey, bool> info; MethodDefinitionAndDeclaringTypeDict<bool> info;
if (!methodNameInfos.TryGetValue(method, out info)) if (!methodNameInfos.TryGetValue(method, out info))
return; return;
@ -220,14 +219,14 @@ namespace de4dot.code.deobfuscators {
} }
void removeAll(IList<Block> allBlocks, Blocks blocks, MethodDefinition method) { void removeAll(IList<Block> allBlocks, Blocks blocks, MethodDefinition method) {
Dictionary<MethodReferenceAndDeclaringTypeKey, bool> info; var info = methodRefInfos.find(method);
if (!methodRefInfos.TryGetValue(new MethodReferenceAndDeclaringTypeKey(method), out info)) if (info == null)
return; return;
removeCalls(allBlocks, blocks, info); removeCalls(allBlocks, blocks, info);
} }
void removeCalls(IList<Block> allBlocks, Blocks blocks, Dictionary<MethodReferenceAndDeclaringTypeKey, bool> info) { void removeCalls(IList<Block> allBlocks, Blocks blocks, MethodDefinitionAndDeclaringTypeDict<bool> info) {
var instrsToDelete = new List<int>(); var instrsToDelete = new List<int>();
foreach (var block in allBlocks) { foreach (var block in allBlocks) {
instrsToDelete.Clear(); instrsToDelete.Clear();
@ -239,8 +238,7 @@ namespace de4dot.code.deobfuscators {
if (destMethod == null) if (destMethod == null)
continue; continue;
var key = new MethodReferenceAndDeclaringTypeKey(destMethod); if (info.find(destMethod)) {
if (info.ContainsKey(key)) {
Log.v("Removed call to {0}", destMethod); Log.v("Removed call to {0}", destMethod);
instrsToDelete.Add(i); 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); methodCallRemover.add(".cctor", methodToBeRemoved);
} }
public void addModuleCctorInitCallToBeRemoved(MethodReference methodToBeRemoved) { public void addModuleCctorInitCallToBeRemoved(MethodDefinition methodToBeRemoved) {
methodCallRemover.add(DotNetUtils.getMethod(DotNetUtils.getModuleType(module), ".cctor"), methodToBeRemoved); methodCallRemover.add(DotNetUtils.getMethod(DotNetUtils.getModuleType(module), ".cctor"), methodToBeRemoved);
} }
public void addCtorInitCallToBeRemoved(MethodReference methodToBeRemoved) { public void addCtorInitCallToBeRemoved(MethodDefinition methodToBeRemoved) {
methodCallRemover.add(".ctor", methodToBeRemoved); methodCallRemover.add(".ctor", methodToBeRemoved);
} }
public void addCallToBeRemoved(MethodDefinition method, MethodReference methodToBeRemoved) { public void addCallToBeRemoved(MethodDefinition method, MethodDefinition methodToBeRemoved) {
methodCallRemover.add(method, methodToBeRemoved); methodCallRemover.add(method, methodToBeRemoved);
} }

View File

@ -493,7 +493,7 @@ namespace de4dot.code.deobfuscators.dotNET_Reactor.v4 {
startedDeobfuscating = true; startedDeobfuscating = true;
} }
void addEntryPointCallToBeRemoved(MethodReference methodToBeRemoved) { void addEntryPointCallToBeRemoved(MethodDefinition methodToBeRemoved) {
var entryPoint = module.EntryPoint; var entryPoint = module.EntryPoint;
addCallToBeRemoved(entryPoint, methodToBeRemoved); addCallToBeRemoved(entryPoint, methodToBeRemoved);
foreach (var info in DotNetUtils.getCalledMethods(module, entryPoint)) foreach (var info in DotNetUtils.getCalledMethods(module, entryPoint))