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

View File

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