diff --git a/de4dot.code/deobfuscators/dotNET_Reactor/v4/Deobfuscator.cs b/de4dot.code/deobfuscators/dotNET_Reactor/v4/Deobfuscator.cs index f454281e..b433435c 100644 --- a/de4dot.code/deobfuscators/dotNET_Reactor/v4/Deobfuscator.cs +++ b/de4dot.code/deobfuscators/dotNET_Reactor/v4/Deobfuscator.cs @@ -573,7 +573,7 @@ public override void DeobfuscateBegin() { if (options.DecryptResources) { resourceResolver.Initialize(DeobfuscatedFile, this); DecryptResources(); - if (options.InlineMethods) { + if (options.InlineMethods && !resourceResolver.HasExternalMethodReferences) { AddTypeToBeRemoved(resourceResolver.Type, "Resource decrypter type"); removeResourceResolver = true; } diff --git a/de4dot.code/deobfuscators/dotNET_Reactor/v4/ResourceResolver.cs b/de4dot.code/deobfuscators/dotNET_Reactor/v4/ResourceResolver.cs index 9b06bbb2..b53b72c4 100644 --- a/de4dot.code/deobfuscators/dotNET_Reactor/v4/ResourceResolver.cs +++ b/de4dot.code/deobfuscators/dotNET_Reactor/v4/ResourceResolver.cs @@ -148,6 +148,28 @@ MethodDef FindInitMethod(ISimpleDeobfuscator simpleDeobfuscator) { return null; } + public bool HasExternalMethodReferences { + get { + if (Type == null) + return false; + + foreach (var type in module.GetTypes()) { + if (type == Type) + continue; + foreach (var method in type.Methods) { + if (!method.HasBody) + continue; + foreach (var calledMethod in DotNetUtils.GetCalledMethods(module, method)) { + if (calledMethod.DeclaringType == Type && calledMethod != initMethod) + return true; + } + } + } + + return false; + } + } + public EmbeddedResource MergeResources() { if (encryptedResource.Resource == null) return null;