From 3c6cc385a44ab2aaea6f0253ec73c19e520d1ca2 Mon Sep 17 00:00:00 2001 From: walon Date: Sat, 10 May 2025 18:25:43 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ConfigurableObfuscationPolicy.cs | 39 ++++++++++++------- .../CallObfus/IObfuscationPolicy.cs | 9 +++++ Editor/ObfusPasses/CallObfus/IObfuscator.cs | 6 +++ .../CallObfus/ObfuscationPolicyBase.cs | 13 ------- .../ObfusPasses/CallObfus/ObfuscatorBase.cs | 12 ------ .../ConstEncrypt/EncryptPolicyBase.cs | 16 -------- .../ConstEncrypt/IConstEncryptor.cs | 11 ++++++ .../ConstEncrypt/IEncryptPolicy.cs | 12 ++++++ ...xprObfuscationPass.cs => ExprObfusPass.cs} | 2 +- .../MemEncrypt/ConfigEncryptionPolicy.cs | 2 +- .../MemEncrypt/DefaultMemoryEncryptor.cs | 2 +- .../MemEncrypt/EncryptionPolicyBase.cs | 9 ----- ...IEncryptionPolicy.cs => IEncryptPolicy.cs} | 7 +++- .../{IMemoryEncryptor.cs => IMemEncryptor.cs} | 8 +++- ...oryEncryptionPass.cs => MemEncryptPass.cs} | 6 +-- .../MemEncrypt/MemoryEncryptorBase.cs | 12 ------ Editor/Obfuscator.cs | 3 ++ Editor/ObfuscatorBuilder.cs | 5 +-- 18 files changed, 87 insertions(+), 87 deletions(-) delete mode 100644 Editor/ObfusPasses/CallObfus/ObfuscationPolicyBase.cs delete mode 100644 Editor/ObfusPasses/CallObfus/ObfuscatorBase.cs delete mode 100644 Editor/ObfusPasses/ConstEncrypt/EncryptPolicyBase.cs rename Editor/ObfusPasses/ExprObfus/{ExprObfuscationPass.cs => ExprObfusPass.cs} (91%) delete mode 100644 Editor/ObfusPasses/MemEncrypt/EncryptionPolicyBase.cs rename Editor/ObfusPasses/MemEncrypt/{IEncryptionPolicy.cs => IEncryptPolicy.cs} (58%) rename Editor/ObfusPasses/MemEncrypt/{IMemoryEncryptor.cs => IMemEncryptor.cs} (61%) rename Editor/ObfusPasses/MemEncrypt/{MemoryEncryptionPass.cs => MemEncryptPass.cs} (91%) delete mode 100644 Editor/ObfusPasses/MemEncrypt/MemoryEncryptorBase.cs diff --git a/Editor/ObfusPasses/CallObfus/ConfigurableObfuscationPolicy.cs b/Editor/ObfusPasses/CallObfus/ConfigurableObfuscationPolicy.cs index 3a0d5ca..f336721 100644 --- a/Editor/ObfusPasses/CallObfus/ConfigurableObfuscationPolicy.cs +++ b/Editor/ObfusPasses/CallObfus/ConfigurableObfuscationPolicy.cs @@ -258,6 +258,28 @@ namespace Obfuz.ObfusPasses.CallObfus }; } + + private bool IsSpecialNotObfuscatedMethod(TypeDef typeDef, IMethod method) + { + if (typeDef.IsDelegate || typeDef.IsEnum) + return true; + + string methodName = method.Name; + + // doesn't proxy call if the method is a constructor + if (methodName == ".ctor") + { + return true; + } + // special handle + // don't proxy call for List.Enumerator GetEnumerator() + if (methodName == "GetEnumerator") + { + return true; + } + return false; + } + private bool ComputeIsInWhiteList(IMethod calledMethod) { ITypeDefOrRef declaringType = calledMethod.DeclaringType; @@ -283,25 +305,14 @@ namespace Obfuz.ObfusPasses.CallObfus TypeDef typeDef = declaringType.ResolveTypeDef(); - if (typeDef.IsDelegate || typeDef.IsEnum) + if (IsSpecialNotObfuscatedMethod(typeDef, calledMethod)) + { return true; + } string assName = typeDef.Module.Assembly.Name; string typeFullName = typeDef.FullName; string methodName = calledMethod.Name; - - // doesn't proxy call if the method is a constructor - if (methodName == ".ctor") - { - return true; - } - // special handle - // don't proxy call for List.Enumerator GetEnumerator() - if (methodName == "GetEnumerator") - { - return true; - } - foreach (var ass in _whiteListAssemblies) { if (!ass.nameMatcher.IsMatch(assName)) diff --git a/Editor/ObfusPasses/CallObfus/IObfuscationPolicy.cs b/Editor/ObfusPasses/CallObfus/IObfuscationPolicy.cs index 5900c58..43c505f 100644 --- a/Editor/ObfusPasses/CallObfus/IObfuscationPolicy.cs +++ b/Editor/ObfusPasses/CallObfus/IObfuscationPolicy.cs @@ -22,4 +22,13 @@ namespace Obfuz.ObfusPasses.CallObfus bool NeedObfuscateCalledMethod(MethodDef callerMethod, IMethod calledMethod, bool callVir, bool currentInLoop); } + + public abstract class ObfuscationPolicyBase : IObfuscationPolicy + { + public abstract bool NeedObfuscateCallInMethod(MethodDef method); + + public abstract ObfuscationCachePolicy GetMethodObfuscationCachePolicy(MethodDef method); + + public abstract bool NeedObfuscateCalledMethod(MethodDef callerMethod, IMethod calledMethod, bool callVir, bool currentInLoop); + } } diff --git a/Editor/ObfusPasses/CallObfus/IObfuscator.cs b/Editor/ObfusPasses/CallObfus/IObfuscator.cs index bc0f183..4135b0d 100644 --- a/Editor/ObfusPasses/CallObfus/IObfuscator.cs +++ b/Editor/ObfusPasses/CallObfus/IObfuscator.cs @@ -14,4 +14,10 @@ namespace Obfuz.ObfusPasses.CallObfus void Done(); } + + public abstract class ObfuscatorBase : IObfuscator + { + public abstract void Obfuscate(MethodDef callingMethod, IMethod calledMethod, bool callVir, bool needCacheCall, List obfuscatedInstructions); + public abstract void Done(); + } } diff --git a/Editor/ObfusPasses/CallObfus/ObfuscationPolicyBase.cs b/Editor/ObfusPasses/CallObfus/ObfuscationPolicyBase.cs deleted file mode 100644 index e421a4f..0000000 --- a/Editor/ObfusPasses/CallObfus/ObfuscationPolicyBase.cs +++ /dev/null @@ -1,13 +0,0 @@ -using dnlib.DotNet; - -namespace Obfuz.ObfusPasses.CallObfus -{ - public abstract class ObfuscationPolicyBase : IObfuscationPolicy - { - public abstract bool NeedObfuscateCallInMethod(MethodDef method); - - public abstract ObfuscationCachePolicy GetMethodObfuscationCachePolicy(MethodDef method); - - public abstract bool NeedObfuscateCalledMethod(MethodDef callerMethod, IMethod calledMethod, bool callVir, bool currentInLoop); - } -} diff --git a/Editor/ObfusPasses/CallObfus/ObfuscatorBase.cs b/Editor/ObfusPasses/CallObfus/ObfuscatorBase.cs deleted file mode 100644 index 9a0e5ee..0000000 --- a/Editor/ObfusPasses/CallObfus/ObfuscatorBase.cs +++ /dev/null @@ -1,12 +0,0 @@ -using dnlib.DotNet.Emit; -using dnlib.DotNet; -using System.Collections.Generic; - -namespace Obfuz.ObfusPasses.CallObfus -{ - public abstract class ObfuscatorBase : IObfuscator - { - public abstract void Obfuscate(MethodDef callingMethod, IMethod calledMethod, bool callVir, bool needCacheCall, List obfuscatedInstructions); - public abstract void Done(); - } -} diff --git a/Editor/ObfusPasses/ConstEncrypt/EncryptPolicyBase.cs b/Editor/ObfusPasses/ConstEncrypt/EncryptPolicyBase.cs deleted file mode 100644 index 2596caa..0000000 --- a/Editor/ObfusPasses/ConstEncrypt/EncryptPolicyBase.cs +++ /dev/null @@ -1,16 +0,0 @@ -using dnlib.DotNet; - -namespace Obfuz.ObfusPasses.ConstEncrypt -{ - public abstract class EncryptPolicyBase : IEncryptPolicy - { - public abstract bool NeedObfuscateMethod(MethodDef method); - public abstract ConstCachePolicy GetMethodConstCachePolicy(MethodDef method); - public abstract bool NeedObfuscateDouble(MethodDef method, bool currentInLoop, double value); - public abstract bool NeedObfuscateFloat(MethodDef method, bool currentInLoop, float value); - public abstract bool NeedObfuscateInt(MethodDef method, bool currentInLoop, int value); - public abstract bool NeedObfuscateLong(MethodDef method, bool currentInLoop, long value); - public abstract bool NeedObfuscateString(MethodDef method, bool currentInLoop, string value); - public abstract bool NeedObfuscateArray(MethodDef method, bool currentInLoop, byte[] array); - } -} diff --git a/Editor/ObfusPasses/ConstEncrypt/IConstEncryptor.cs b/Editor/ObfusPasses/ConstEncrypt/IConstEncryptor.cs index f4f6817..31f6869 100644 --- a/Editor/ObfusPasses/ConstEncrypt/IConstEncryptor.cs +++ b/Editor/ObfusPasses/ConstEncrypt/IConstEncryptor.cs @@ -21,4 +21,15 @@ namespace Obfuz.ObfusPasses.ConstEncrypt void Done(); } + + public abstract class ConstEncryptorBase : IConstEncryptor + { + public abstract void ObfuscateBytes(MethodDef method, bool needCacheValue, byte[] value, List obfuscatedInstructions); + public abstract void ObfuscateDouble(MethodDef method, bool needCacheValue, double value, List obfuscatedInstructions); + public abstract void ObfuscateFloat(MethodDef method, bool needCacheValue, float value, List obfuscatedInstructions); + public abstract void ObfuscateInt(MethodDef method, bool needCacheValue, int value, List obfuscatedInstructions); + public abstract void ObfuscateLong(MethodDef method, bool needCacheValue, long value, List obfuscatedInstructions); + public abstract void ObfuscateString(MethodDef method, bool needCacheValue, string value, List obfuscatedInstructions); + public abstract void Done(); + } } diff --git a/Editor/ObfusPasses/ConstEncrypt/IEncryptPolicy.cs b/Editor/ObfusPasses/ConstEncrypt/IEncryptPolicy.cs index 374f099..1db7f0e 100644 --- a/Editor/ObfusPasses/ConstEncrypt/IEncryptPolicy.cs +++ b/Editor/ObfusPasses/ConstEncrypt/IEncryptPolicy.cs @@ -33,4 +33,16 @@ namespace Obfuz.ObfusPasses.ConstEncrypt bool NeedObfuscateArray(MethodDef method, bool currentInLoop, byte[] array); } + + public abstract class EncryptPolicyBase : IEncryptPolicy + { + public abstract bool NeedObfuscateMethod(MethodDef method); + public abstract ConstCachePolicy GetMethodConstCachePolicy(MethodDef method); + public abstract bool NeedObfuscateDouble(MethodDef method, bool currentInLoop, double value); + public abstract bool NeedObfuscateFloat(MethodDef method, bool currentInLoop, float value); + public abstract bool NeedObfuscateInt(MethodDef method, bool currentInLoop, int value); + public abstract bool NeedObfuscateLong(MethodDef method, bool currentInLoop, long value); + public abstract bool NeedObfuscateString(MethodDef method, bool currentInLoop, string value); + public abstract bool NeedObfuscateArray(MethodDef method, bool currentInLoop, byte[] array); + } } diff --git a/Editor/ObfusPasses/ExprObfus/ExprObfuscationPass.cs b/Editor/ObfusPasses/ExprObfus/ExprObfusPass.cs similarity index 91% rename from Editor/ObfusPasses/ExprObfus/ExprObfuscationPass.cs rename to Editor/ObfusPasses/ExprObfus/ExprObfusPass.cs index da05b38..0f56054 100644 --- a/Editor/ObfusPasses/ExprObfus/ExprObfuscationPass.cs +++ b/Editor/ObfusPasses/ExprObfus/ExprObfusPass.cs @@ -8,7 +8,7 @@ using System.Threading.Tasks; namespace Obfuz.ObfusPasses.ExprObfus { - public class ExprObfuscationPass : InstructionObfuscationPassBase + public class ExprObfusPass : InstructionObfuscationPassBase { diff --git a/Editor/ObfusPasses/MemEncrypt/ConfigEncryptionPolicy.cs b/Editor/ObfusPasses/MemEncrypt/ConfigEncryptionPolicy.cs index db1165a..0d4d55e 100644 --- a/Editor/ObfusPasses/MemEncrypt/ConfigEncryptionPolicy.cs +++ b/Editor/ObfusPasses/MemEncrypt/ConfigEncryptionPolicy.cs @@ -2,7 +2,7 @@ namespace Obfuz.ObfusPasses.MemEncrypt { - public class ConfigEncryptionPolicy : EncryptionPolicyBase + public class ConfigEncryptionPolicy : EncryptPolicyBase { private bool IsSupportedFieldType(TypeSig type) diff --git a/Editor/ObfusPasses/MemEncrypt/DefaultMemoryEncryptor.cs b/Editor/ObfusPasses/MemEncrypt/DefaultMemoryEncryptor.cs index c8782af..ae3f1ca 100644 --- a/Editor/ObfusPasses/MemEncrypt/DefaultMemoryEncryptor.cs +++ b/Editor/ObfusPasses/MemEncrypt/DefaultMemoryEncryptor.cs @@ -8,7 +8,7 @@ using UnityEngine.Assertions; namespace Obfuz.ObfusPasses.MemEncrypt { - public class DefaultMemoryEncryptor : MemoryEncryptorBase + public class DefaultMemoryEncryptor : MemEncryptorBase { private class ModuleDefaultMemoryEncryptor diff --git a/Editor/ObfusPasses/MemEncrypt/EncryptionPolicyBase.cs b/Editor/ObfusPasses/MemEncrypt/EncryptionPolicyBase.cs deleted file mode 100644 index 44190fd..0000000 --- a/Editor/ObfusPasses/MemEncrypt/EncryptionPolicyBase.cs +++ /dev/null @@ -1,9 +0,0 @@ -using dnlib.DotNet; - -namespace Obfuz.ObfusPasses.MemEncrypt -{ - public abstract class EncryptionPolicyBase : IEncryptionPolicy - { - public abstract bool NeedEncrypt(FieldDef field); - } -} diff --git a/Editor/ObfusPasses/MemEncrypt/IEncryptionPolicy.cs b/Editor/ObfusPasses/MemEncrypt/IEncryptPolicy.cs similarity index 58% rename from Editor/ObfusPasses/MemEncrypt/IEncryptionPolicy.cs rename to Editor/ObfusPasses/MemEncrypt/IEncryptPolicy.cs index 2cfe950..d47b342 100644 --- a/Editor/ObfusPasses/MemEncrypt/IEncryptionPolicy.cs +++ b/Editor/ObfusPasses/MemEncrypt/IEncryptPolicy.cs @@ -7,8 +7,13 @@ using System.Threading.Tasks; namespace Obfuz.ObfusPasses.MemEncrypt { - public interface IEncryptionPolicy + public interface IEncryptPolicy { bool NeedEncrypt(FieldDef field); } + + public abstract class EncryptPolicyBase : IEncryptPolicy + { + public abstract bool NeedEncrypt(FieldDef field); + } } diff --git a/Editor/ObfusPasses/MemEncrypt/IMemoryEncryptor.cs b/Editor/ObfusPasses/MemEncrypt/IMemEncryptor.cs similarity index 61% rename from Editor/ObfusPasses/MemEncrypt/IMemoryEncryptor.cs rename to Editor/ObfusPasses/MemEncrypt/IMemEncryptor.cs index a5b51de..258be56 100644 --- a/Editor/ObfusPasses/MemEncrypt/IMemoryEncryptor.cs +++ b/Editor/ObfusPasses/MemEncrypt/IMemEncryptor.cs @@ -14,10 +14,16 @@ namespace Obfuz.ObfusPasses.MemEncrypt public Instruction currentInstruction; } - public interface IMemoryEncryptor + public interface IMemEncryptor { void Encrypt(FieldDef field, List outputInstructions, MemoryEncryptionContext ctx); void Decrypt(FieldDef field, List outputInstructions, MemoryEncryptionContext ctx); } + + public abstract class MemEncryptorBase : IMemEncryptor + { + public abstract void Encrypt(FieldDef field, List outputInstructions, MemoryEncryptionContext ctx); + public abstract void Decrypt(FieldDef field, List outputInstructions, MemoryEncryptionContext ctx); + } } diff --git a/Editor/ObfusPasses/MemEncrypt/MemoryEncryptionPass.cs b/Editor/ObfusPasses/MemEncrypt/MemEncryptPass.cs similarity index 91% rename from Editor/ObfusPasses/MemEncrypt/MemoryEncryptionPass.cs rename to Editor/ObfusPasses/MemEncrypt/MemEncryptPass.cs index a645357..80e56b7 100644 --- a/Editor/ObfusPasses/MemEncrypt/MemoryEncryptionPass.cs +++ b/Editor/ObfusPasses/MemEncrypt/MemEncryptPass.cs @@ -9,10 +9,10 @@ using UnityEngine; namespace Obfuz.ObfusPasses.MemEncrypt { - public class MemoryEncryptionPass : InstructionObfuscationPassBase + public class MemEncryptPass : InstructionObfuscationPassBase { - private readonly IEncryptionPolicy _encryptionPolicy = new ConfigEncryptionPolicy(); - private readonly IMemoryEncryptor _memoryEncryptor = new DefaultMemoryEncryptor(); + private readonly IEncryptPolicy _encryptionPolicy = new ConfigEncryptionPolicy(); + private readonly IMemEncryptor _memoryEncryptor = new DefaultMemoryEncryptor(); public override void Start(ObfuscationPassContext ctx) { diff --git a/Editor/ObfusPasses/MemEncrypt/MemoryEncryptorBase.cs b/Editor/ObfusPasses/MemEncrypt/MemoryEncryptorBase.cs deleted file mode 100644 index 786b55f..0000000 --- a/Editor/ObfusPasses/MemEncrypt/MemoryEncryptorBase.cs +++ /dev/null @@ -1,12 +0,0 @@ -using dnlib.DotNet; -using dnlib.DotNet.Emit; -using System.Collections.Generic; - -namespace Obfuz.ObfusPasses.MemEncrypt -{ - public abstract class MemoryEncryptorBase : IMemoryEncryptor - { - public abstract void Encrypt(FieldDef field, List outputInstructions, MemoryEncryptionContext ctx); - public abstract void Decrypt(FieldDef field, List outputInstructions, MemoryEncryptionContext ctx); - } -} diff --git a/Editor/Obfuscator.cs b/Editor/Obfuscator.cs index 8e6cfc7..c715cb4 100644 --- a/Editor/Obfuscator.cs +++ b/Editor/Obfuscator.cs @@ -3,6 +3,7 @@ using dnlib.Protection; using Obfuz.Data; using Obfuz.Emit; using Obfuz.ObfusPasses; +using Obfuz.ObfusPasses.CleanUp; using Obfuz.Utils; using System; using System.Collections.Generic; @@ -11,6 +12,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using UnityEngine; +using static UnityEditor.ObjectChangeEventStream; namespace Obfuz { @@ -46,6 +48,7 @@ namespace Obfuz { _pipeline.AddPass(pass); } + _pipeline.AddPass(new CleanUpInstructionPass()); } public void Run() diff --git a/Editor/ObfuscatorBuilder.cs b/Editor/ObfuscatorBuilder.cs index 091fc84..5b5dc4c 100644 --- a/Editor/ObfuscatorBuilder.cs +++ b/Editor/ObfuscatorBuilder.cs @@ -77,7 +77,7 @@ namespace Obfuz ObfuscationPassType obfuscationPasses = settings.enabledObfuscationPasses; if (obfuscationPasses.HasFlag(ObfuscationPassType.MemoryEncryption)) { - builder.AddPass(new MemoryEncryptionPass()); + builder.AddPass(new MemEncryptPass()); } if (obfuscationPasses.HasFlag(ObfuscationPassType.CallProxy)) { @@ -89,13 +89,12 @@ namespace Obfuz } if (obfuscationPasses.HasFlag(ObfuscationPassType.ExprObfuscation)) { - builder.AddPass(new ExprObfuscationPass()); + builder.AddPass(new ExprObfusPass()); } if (obfuscationPasses.HasFlag(ObfuscationPassType.SymbolObfuscation)) { builder.AddPass(new SymbolObfusPass(settings.symbolObfusSettings)); } - builder.AddPass(new CleanUpInstructionPass()); return builder; } }