From 81696bc1ce762f7f40c7b4279c64a90065df05d6 Mon Sep 17 00:00:00 2001 From: js6pak Date: Mon, 15 Feb 2021 13:48:05 +0100 Subject: [PATCH] Match method signatures in reobfuscation --- .../Reactor.OxygenFilter.MSBuild.csproj | 2 +- Reactor.OxygenFilter.MSBuild/Reobfuscate.cs | 3 ++- Reactor.OxygenFilter/Extensions.cs | 25 ++++++++++++++++--- 3 files changed, 25 insertions(+), 5 deletions(-) diff --git a/Reactor.OxygenFilter.MSBuild/Reactor.OxygenFilter.MSBuild.csproj b/Reactor.OxygenFilter.MSBuild/Reactor.OxygenFilter.MSBuild.csproj index c9c9705..b606e5e 100644 --- a/Reactor.OxygenFilter.MSBuild/Reactor.OxygenFilter.MSBuild.csproj +++ b/Reactor.OxygenFilter.MSBuild/Reactor.OxygenFilter.MSBuild.csproj @@ -4,7 +4,7 @@ latest true - 0.2.5 + 0.2.6 git https://github.com/NuclearPowered/Reactor.OxygenFilter LGPL-3.0-or-later diff --git a/Reactor.OxygenFilter.MSBuild/Reobfuscate.cs b/Reactor.OxygenFilter.MSBuild/Reobfuscate.cs index cb09524..e15fb8a 100644 --- a/Reactor.OxygenFilter.MSBuild/Reobfuscate.cs +++ b/Reactor.OxygenFilter.MSBuild/Reobfuscate.cs @@ -229,7 +229,8 @@ namespace Reactor.OxygenFilter.MSBuild } // get same method from obfuscated assembly - MethodReference definition = typeDefinition.GetMethods().Single(x => x.Name == obfuscated); + var signature = deobfuscatedCall.GetSignature(t => GetObfuscated(t) ?? t.FullName); + MethodReference definition = typeDefinition.GetMethods().Single(x => x.Name == obfuscated && x.GetSignature() == signature); // obfuscate generics if (deobfuscatedCallReference is GenericInstanceMethod generic) diff --git a/Reactor.OxygenFilter/Extensions.cs b/Reactor.OxygenFilter/Extensions.cs index 33dfcca..284366c 100644 --- a/Reactor.OxygenFilter/Extensions.cs +++ b/Reactor.OxygenFilter/Extensions.cs @@ -1,3 +1,4 @@ +using System; using System.Linq; using System.Text; using Mono.Cecil; @@ -11,11 +12,29 @@ namespace Reactor.OxygenFilter return text.Length == 11 && text.All(char.IsUpper); } - public static string GetSignature(this MethodDefinition methodDefinition) + public static string GetSignature(this MethodDefinition methodDefinition, Func map = null) { + map ??= provider => provider.FullName; + + string MapIfResolved(TypeReference typeReference) + { + TypeDefinition resolved = null; + + try + { + resolved = typeReference.Resolve(); + } + catch + { + // ignored + } + + return resolved != null ? map(resolved) : typeReference.FullName; + } + var sb = new StringBuilder(); - sb.Append(methodDefinition.ReturnType.FullName); + sb.Append(MapIfResolved(methodDefinition.ReturnType)); sb.Append(" "); sb.Append("("); @@ -31,7 +50,7 @@ namespace Reactor.OxygenFilter if (parameterType is SentinelType) sb.Append("...,"); - sb.Append(parameterType.FullName); + sb.Append(MapIfResolved(parameterType)); } }