Use methods dict
This commit is contained in:
parent
99350b456d
commit
e744e24a51
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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))
|
||||||
|
|
Loading…
Reference in New Issue
Block a user