diff --git a/NETReactorSlayer.Core/Helper/EncryptedResource.cs b/NETReactorSlayer.Core/Helper/EncryptedResource.cs index fb39653..4cfda63 100644 --- a/NETReactorSlayer.Core/Helper/EncryptedResource.cs +++ b/NETReactorSlayer.Core/Helper/EncryptedResource.cs @@ -88,9 +88,10 @@ private IDecrypter GetDecrypter() if (DecrypterV4.CouldBeResourceDecrypter(DecrypterMethod, localTypes, AdditionalTypes)) return new DecrypterV4(DecrypterMethod); - return DecrypterV2.CouldBeResourceDecrypter(localTypes, AdditionalTypes) - ? new DecrypterV2(DecrypterMethod) - : null; + if (DecrypterV2.CouldBeResourceDecrypter(localTypes, AdditionalTypes)) + return new DecrypterV2(DecrypterMethod); + + return null; } public static bool IsKnownDecrypter(MethodDef method, IList additionalTypes, bool checkResource) @@ -427,12 +428,30 @@ private bool FindStartEnd(IList instrs, out int startIndex, out int var i = 0; while (i + 8 < instrs.Count) { + int newEndIndex = -1; + if (instrs[i].OpCode.Code.Equals(Code.Conv_R_Un) && instrs[i + 1].OpCode.Code.Equals(Code.Conv_R8) && instrs[i + 2].OpCode.Code.Equals(Code.Conv_U4) && instrs[i + 3].OpCode.Code.Equals(Code.Add)) { - var newEndIndex = i + 3; + newEndIndex = i + 3; + } + + if (newEndIndex < 0) + { + if (instrs[i].OpCode.Code.Equals(Code.Add) && + instrs[i + 1].OpCode.Code.Equals(Code.Stloc_S) && + instrs[i + 2].OpCode.Code.Equals(Code.Ldloc_S) && + instrs[i + 3].OpCode.Code.Equals(Code.Ldloc_S) && + instrs[i + 4].OpCode.Code.Equals(Code.Ldc_I4_1)) + { + newEndIndex = i; + } + } + + if (newEndIndex >= 0) + { var newStartIndex = -1; for (var x = newEndIndex; x > 0; x--) if (instrs[x].OpCode.FlowControl != FlowControl.Next) @@ -851,12 +870,30 @@ private bool FindStartEnd(IList instrs, out int startIndex, out int var i = 0; while (i + 8 < instrs.Count) { + int newEndIndex = -1; + if (instrs[i].OpCode.Code.Equals(Code.Conv_R_Un) && instrs[i + 1].OpCode.Code.Equals(Code.Conv_R8) && instrs[i + 2].OpCode.Code.Equals(Code.Conv_U4) && instrs[i + 3].OpCode.Code.Equals(Code.Add)) { - var newEndIndex = i + 3; + newEndIndex = i + 3; + } + + if (newEndIndex < 0) + { + if (instrs[i].OpCode.Code.Equals(Code.Add) && + instrs[i + 1].OpCode.Code.Equals(Code.Stloc_S) && + instrs[i + 2].OpCode.Code.Equals(Code.Ldloc_S) && + instrs[i + 3].OpCode.Code.Equals(Code.Ldloc_S) && + instrs[i + 4].OpCode.Code.Equals(Code.Ldc_I4_1)) + { + newEndIndex = i; + } + } + + if (newEndIndex >= 0) + { var newStartIndex = -1; for (var x = newEndIndex; x > 0; x--) if (instrs[x].OpCode.FlowControl != FlowControl.Next) diff --git a/NETReactorSlayer.Core/Stages/Cleaner.cs b/NETReactorSlayer.Core/Stages/Cleaner.cs index cfea88e..bcea17f 100644 --- a/NETReactorSlayer.Core/Stages/Cleaner.cs +++ b/NETReactorSlayer.Core/Stages/Cleaner.cs @@ -13,6 +13,7 @@ You should have received a copy of the GNU General Public License along with NETReactorSlayer. If not, see . */ +using System; using System.Collections.Generic; using System.Linq; using de4dot.blocks; @@ -97,7 +98,11 @@ private void RemoveObfuscatorTypes() if (Context.Options.KeepObfuscatorTypes) return; foreach (var method in MethodsToRemove) - try { method.DeclaringType.Remove(method); } catch { } + try + { + method.DeclaringType.Remove(method); + } + catch { } foreach (var typeDef in TypesToRemove.Select(type => type.ResolveTypeDef())) try