Add ISimpleDeobfuscator::MethodModified() to reset deobfuscated state

This commit is contained in:
de4dot 2013-09-28 19:43:46 +02:00
parent 24b22268e3
commit 01dbcd0632
2 changed files with 17 additions and 1 deletions

View File

@ -752,11 +752,22 @@ namespace de4dot.code {
}
Dictionary<MethodDef, SimpleDeobFlags> simpleDeobfuscatorFlags = new Dictionary<MethodDef, SimpleDeobFlags>();
bool Check(MethodDef method, SimpleDeobFlags flag) {
if (method == null)
return false;
SimpleDeobFlags oldFlags;
simpleDeobfuscatorFlags.TryGetValue(method, out oldFlags);
simpleDeobfuscatorFlags[method] = oldFlags | flag;
return (oldFlags & flag) == flag;
}
bool Clear(MethodDef method, SimpleDeobFlags flag) {
if (method == null)
return false;
SimpleDeobFlags oldFlags;
if (!simpleDeobfuscatorFlags.TryGetValue(method, out oldFlags))
return false;
simpleDeobfuscatorFlags[method] = oldFlags & ~flag;
return true;
}
void Deobfuscate(MethodDef method, string msg, Action<Blocks> handler) {
if (savedMethodBodies != null)
@ -784,12 +795,16 @@ namespace de4dot.code {
Logger.Instance.DeIndent();
}
void ISimpleDeobfuscator.MethodModified(MethodDef method) {
Clear(method, SimpleDeobFlags.HasDeobfuscated);
}
void ISimpleDeobfuscator.Deobfuscate(MethodDef method) {
((ISimpleDeobfuscator)this).Deobfuscate(method, false);
}
void ISimpleDeobfuscator.Deobfuscate(MethodDef method, bool force) {
if (!force && Check(method, SimpleDeobFlags.HasDeobfuscated))
if (method == null || !force && Check(method, SimpleDeobFlags.HasDeobfuscated))
return;
Deobfuscate(method, "Deobfuscating control flow", (blocks) => {

View File

@ -21,6 +21,7 @@ using dnlib.DotNet;
namespace de4dot.code.deobfuscators {
public interface ISimpleDeobfuscator {
void MethodModified(MethodDef method);
void Deobfuscate(MethodDef method);
void Deobfuscate(MethodDef method, bool force);
void DecryptStrings(MethodDef method, IDeobfuscator deob);