diff --git a/de4dot.code/ObfuscatedFile.cs b/de4dot.code/ObfuscatedFile.cs index c4cfa2bf..74ca82c5 100644 --- a/de4dot.code/ObfuscatedFile.cs +++ b/de4dot.code/ObfuscatedFile.cs @@ -752,11 +752,22 @@ namespace de4dot.code { } Dictionary simpleDeobfuscatorFlags = new Dictionary(); 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 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) => { diff --git a/de4dot.code/deobfuscators/ISimpleDeobfuscator.cs b/de4dot.code/deobfuscators/ISimpleDeobfuscator.cs index 3ec0f4f5..b549aea2 100644 --- a/de4dot.code/deobfuscators/ISimpleDeobfuscator.cs +++ b/de4dot.code/deobfuscators/ISimpleDeobfuscator.cs @@ -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);