diff --git a/de4dot.code/deobfuscators/ProxyDelegateFinderBase.cs b/de4dot.code/deobfuscators/ProxyDelegateFinderBase.cs index 93d7aabb..54e87d75 100644 --- a/de4dot.code/deobfuscators/ProxyDelegateFinderBase.cs +++ b/de4dot.code/deobfuscators/ProxyDelegateFinderBase.cs @@ -162,12 +162,25 @@ namespace de4dot.code.deobfuscators { } } + protected virtual bool ProxyCallIsObfuscated { + get { return false; } + } + public void deobfuscate(Blocks blocks) { if (blocks.Method.DeclaringType != null && delegateTypesDict.ContainsKey(blocks.Method.DeclaringType)) return; + var allBlocks = blocks.MethodBlocks.getAllBlocks(); + int loops = ProxyCallIsObfuscated ? 50 : 1; + for (int i = 0; i < loops; i++) { + if (!deobfuscate(blocks, allBlocks)) + break; + } + fixBrokenCalls(blocks.Method, allBlocks); + } + + bool deobfuscate(Blocks blocks, IList allBlocks) { var removeInfos = new Dictionary>(); - var allBlocks = blocks.MethodBlocks.getAllBlocks(); foreach (var block in allBlocks) { var instrs = block.Instructions; for (int i = 0; i < instrs.Count; i++) { @@ -222,7 +235,7 @@ namespace de4dot.code.deobfuscators { block.remove(removeIndexes); } - fixBrokenCalls(blocks.Method, allBlocks); + return removeInfos.Count > 0; } void add(Dictionary> removeInfos, Block block, int index, DelegateInfo di) {