diff --git a/de4dot.code/deobfuscators/DeobfuscatorBase.cs b/de4dot.code/deobfuscators/DeobfuscatorBase.cs index 3c4d73a4..ecd59b68 100644 --- a/de4dot.code/deobfuscators/DeobfuscatorBase.cs +++ b/de4dot.code/deobfuscators/DeobfuscatorBase.cs @@ -489,6 +489,10 @@ namespace de4dot.deobfuscators { } protected void removeProxyDelegates(ProxyDelegateFinderBase proxyDelegateFinder) { + if (proxyDelegateFinder.Errors != 0) { + Log.v("Not removing proxy delegates and creator type since errors were detected."); + return; + } addTypesToBeRemoved(proxyDelegateFinder.DelegateTypes, "Proxy delegate type"); if (proxyDelegateFinder.RemovedDelegateCreatorCalls > 0) addTypesToBeRemoved(proxyDelegateFinder.DelegateCreatorTypes, "Proxy delegate creator type"); diff --git a/de4dot.code/deobfuscators/ProxyDelegateFinderBase.cs b/de4dot.code/deobfuscators/ProxyDelegateFinderBase.cs index 78d9d604..15f94977 100644 --- a/de4dot.code/deobfuscators/ProxyDelegateFinderBase.cs +++ b/de4dot.code/deobfuscators/ProxyDelegateFinderBase.cs @@ -30,6 +30,11 @@ namespace de4dot.deobfuscators { Dictionary delegateTypesDict = new Dictionary(); Dictionary fieldToDelegateInfo = new Dictionary(); Dictionary proxyMethodToField = new Dictionary(); + int errors = 0; + + public int Errors { + get { return errors; } + } class DelegateInfo { public MethodReference methodRef; // Method we should call @@ -182,6 +187,7 @@ namespace de4dot.deobfuscators { add(removeInfos, callInfo.Block, callInfo.Index, di); } else { + errors++; Log.w("Could not fix proxy call. Method: {0} ({1:X8}), Proxy type: {2} ({3:X8})", blocks.Method, blocks.Method.MetadataToken.ToInt32(), di.field.DeclaringType, di.field.DeclaringType.MetadataToken.ToInt32());