From ce535949aae68e49d6c6b4fee516c80283c1a0d3 Mon Sep 17 00:00:00 2001 From: walon Date: Mon, 12 May 2025 08:13:01 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E9=87=8D=E6=9E=84=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?=E4=B8=ADsecretKey=E4=B8=BAsecret=EF=BC=8C=E9=87=8D=E6=9E=84glo?= =?UTF-8?q?balRandomSeed=E4=B8=BArandomSeed=E3=80=82=20-=20=E4=BF=9D?= =?UTF-8?q?=E5=AD=98=20secret=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Editor/Obfuscator.cs | 28 +++++++++++++-------- Editor/ObfuscatorBuilder.cs | 32 +++++++++++++++--------- Editor/Settings/EncryptionVMSettings.cs | 8 +++--- Editor/Settings/ObfuzSettings.cs | 7 ++++-- Editor/Settings/ObfuzSettingsProvider.cs | 15 ++++++----- Editor/Unity/ObfuzMenu.cs | 17 +++++++++++-- Runtime/EncryptionService.cs | 8 +++++- 7 files changed, 77 insertions(+), 38 deletions(-) diff --git a/Editor/Obfuscator.cs b/Editor/Obfuscator.cs index 91574ea..33f2c8f 100644 --- a/Editor/Obfuscator.cs +++ b/Editor/Obfuscator.cs @@ -29,9 +29,9 @@ namespace Obfuz private readonly List _obfuscatedAndNotObfuscatedModules = new List(); private readonly Pipeline _pipeline = new Pipeline(); - private readonly byte[] _secretKey; - private readonly int _globalRandomSeed; - private readonly string _encryptionVmGenerationSecretKey; + private readonly byte[] _secret; + private readonly int _randomSeed; + private readonly string _encryptionVmGenerationSecret; private readonly int _encryptionVmOpCodeCount; private readonly string _encryptionVmCodeFile; @@ -39,9 +39,10 @@ namespace Obfuz public Obfuscator(ObfuscatorBuilder builder) { - _secretKey = KeyGenerator.GenerateKey(builder.SecretKey, VirtualMachine.SecretKeyLength); - _globalRandomSeed = builder.GlobalRandomSeed; - _encryptionVmGenerationSecretKey = builder.EncryptionVmGenerationSecretKey; + _secret = KeyGenerator.GenerateKey(builder.Secret, VirtualMachine.SecretKeyLength); + SaveKey(_secret, builder.SecretOutputPath); + _randomSeed = builder.RandomSeed; + _encryptionVmGenerationSecret = builder.EncryptionVmGenerationSecretKey; _encryptionVmOpCodeCount = builder.EncryptionVmOpCodeCount; _encryptionVmCodeFile = builder.EncryptionVmCodeFile; @@ -58,6 +59,13 @@ namespace Obfuz _pipeline.AddPass(new CleanUpInstructionPass()); } + public static void SaveKey(byte[] secret, string secretOutputPath) + { + FileUtil.CreateParentDir(secretOutputPath); + File.WriteAllBytes(secretOutputPath, secret); + Debug.Log($"Save secret key to {secretOutputPath}, secret length:{secret.Length}"); + } + public void Run() { OnPreObfuscation(); @@ -67,7 +75,7 @@ namespace Obfuz private IEncryptor CreateEncryptionVirtualMachine() { - var vmCreator = new VirtualMachineCreator(_encryptionVmGenerationSecretKey); + var vmCreator = new VirtualMachineCreator(_encryptionVmGenerationSecret); var vm = vmCreator.CreateVirtualMachine(_encryptionVmOpCodeCount); var vmGenerator = new VirtualMachineCodeGenerator(vm); @@ -79,7 +87,7 @@ namespace Obfuz { throw new Exception($"EncryptionVm CodeFile:`{_encryptionVmCodeFile}` not match with encryptionVM settings! Please run `Obfuz/GenerateVm` to update it!"); } - var vms = new VirtualMachineSimulator(vm, _secretKey); + var vms = new VirtualMachineSimulator(vm, _secret); var generatedVmTypes = AppDomain.CurrentDomain.GetAssemblies() .Select(assembly => assembly.GetType("Obfuz.EncryptionVM.GeneratedEncryptionVirtualMachine")) @@ -94,7 +102,7 @@ namespace Obfuz throw new Exception($"class Obfuz.EncryptionVM.GeneratedEncryptionVirtualMachine found in multiple assemblies! Please retain only one!"); } - var gvmInstance = (IEncryptor)Activator.CreateInstance(generatedVmTypes[0], new object[] { _secretKey } ); + var gvmInstance = (IEncryptor)Activator.CreateInstance(generatedVmTypes[0], new object[] { _secret } ); int testValue = 11223344; for (int i = 0; i < vm.opCodes.Length; i++) @@ -125,7 +133,7 @@ namespace Obfuz LoadAssemblies(); - var random = new RandomWithKey(_secretKey, _globalRandomSeed); + var random = new RandomWithKey(_secret, _randomSeed); var encryptor = CreateEncryptionVirtualMachine(); var rvaDataAllocator = new RvaDataAllocator(random, encryptor); var constFieldAllocator = new ConstFieldAllocator(encryptor, random, rvaDataAllocator); diff --git a/Editor/ObfuscatorBuilder.cs b/Editor/ObfuscatorBuilder.cs index dc147c2..3793d7b 100644 --- a/Editor/ObfuscatorBuilder.cs +++ b/Editor/ObfuscatorBuilder.cs @@ -15,8 +15,9 @@ namespace Obfuz { public class ObfuscatorBuilder { - private string _secretKey; - private int _globalRandomSeed; + private string _secret; + private string _secretOutputPath; + private int _randomSeed; private string _encryptionVmGenerationSecretKey; private int _encryptionVmOpCodeCount; private string _encryptionVmCodeFile; @@ -28,16 +29,22 @@ namespace Obfuz private string _obfuscatedAssemblyOutputDir; private List _obfuscationPasses = new List(); - public string SecretKey + public string Secret { - get => _secretKey; - set => _secretKey = value; + get => _secret; + set => _secret = value; } - public int GlobalRandomSeed + public string SecretOutputPath { - get => _globalRandomSeed; - set => _globalRandomSeed = value; + get => _secretOutputPath; + set => _secretOutputPath = value; + } + + public int RandomSeed + { + get => _randomSeed; + set => _randomSeed = value; } public string EncryptionVmGenerationSecretKey @@ -104,11 +111,12 @@ namespace Obfuz { var builder = new ObfuscatorBuilder { - _secretKey = settings.secretKey, - _globalRandomSeed = settings.globalRandomSeed, - _encryptionVmGenerationSecretKey = settings.encryptionVMSettings.codeGenerationSecretKey, + _secret = settings.secret, + _secretOutputPath = settings.secretOutputPath, + _randomSeed = settings.randomSeed, + _encryptionVmGenerationSecretKey = settings.encryptionVMSettings.codeGenerationSecret, _encryptionVmOpCodeCount = settings.encryptionVMSettings.encryptionOpCodeCount, - _encryptionVmCodeFile = settings.encryptionVMSettings.CodeOutputPath, + _encryptionVmCodeFile = settings.encryptionVMSettings.codeOutputPath, _toObfuscatedAssemblyNames = settings.toObfuscatedAssemblyNames.ToList(), _notObfuscatedAssemblyNamesReferencingObfuscated = settings.notObfuscatedAssemblyNamesReferencingObfuscated.ToList(), _assemblySearchDirs = settings.extraAssemblySearchDirs.ToList(), diff --git a/Editor/Settings/EncryptionVMSettings.cs b/Editor/Settings/EncryptionVMSettings.cs index c9fc363..c81c37d 100644 --- a/Editor/Settings/EncryptionVMSettings.cs +++ b/Editor/Settings/EncryptionVMSettings.cs @@ -12,14 +12,12 @@ namespace Obfuz.Settings public class EncryptionVMSettings { [Tooltip("secret key for generating encryption virtual machine source code")] - public string codeGenerationSecretKey = "Obfuz"; + public string codeGenerationSecret = "Obfuz"; [Tooltip("encryption OpCode count, should be power of 2 and >= 64")] public int encryptionOpCodeCount = 256; - [Tooltip("encryption virtual machine source code output dir")] - public string codeOutputDir = "Assets/Obfuz"; - - public string CodeOutputPath { get => Path.Combine(codeOutputDir, "GeneratedEncryptionVirtualMachine.cs"); } + [Tooltip("encryption virtual machine source code output path")] + public string codeOutputPath = "Assets/Obfuz/GeneratedEncryptionVirtualMachine.cs"; } } diff --git a/Editor/Settings/ObfuzSettings.cs b/Editor/Settings/ObfuzSettings.cs index 3b0114a..661e8f9 100644 --- a/Editor/Settings/ObfuzSettings.cs +++ b/Editor/Settings/ObfuzSettings.cs @@ -27,10 +27,13 @@ namespace Obfuz.Settings public ObfuscationPassType enabledObfuscationPasses = ObfuscationPassType.All; [Tooltip("secret key")] - public string secretKey = "Code Philosophy"; + public string secret = "Code Philosophy"; + + [Tooltip("secret key save path")] + public string secretOutputPath = $"Assets/Obfuz/secret.bytes"; [Tooltip("global random seed")] - public int globalRandomSeed = 0; + public int randomSeed = 0; [Tooltip("encryption virtual machine settings")] public EncryptionVMSettings encryptionVMSettings; diff --git a/Editor/Settings/ObfuzSettingsProvider.cs b/Editor/Settings/ObfuzSettingsProvider.cs index 39dac82..6e8cbad 100644 --- a/Editor/Settings/ObfuzSettingsProvider.cs +++ b/Editor/Settings/ObfuzSettingsProvider.cs @@ -34,8 +34,9 @@ namespace Obfuz.Settings private SerializedProperty _extraAssemblySearchDirs; private SerializedProperty _enabledObfuscationPasses; - private SerializedProperty _secretKey; - private SerializedProperty _globalRandomSeed; + private SerializedProperty _secret; + private SerializedProperty _secretOutputPath; + private SerializedProperty _randomSeed; private SerializedProperty _encryptionVMSettings; @@ -70,8 +71,9 @@ namespace Obfuz.Settings _extraAssemblySearchDirs = _serializedObject.FindProperty("extraAssemblySearchDirs"); _enabledObfuscationPasses = _serializedObject.FindProperty("enabledObfuscationPasses"); - _secretKey = _serializedObject.FindProperty("secretKey"); - _globalRandomSeed = _serializedObject.FindProperty("globalRandomSeed"); + _secret = _serializedObject.FindProperty("secret"); + _secretOutputPath = _serializedObject.FindProperty("secretOutputPath"); + _randomSeed = _serializedObject.FindProperty("randomSeed"); _encryptionVMSettings = _serializedObject.FindProperty("encryptionVMSettings"); @@ -96,8 +98,9 @@ namespace Obfuz.Settings EditorGUILayout.PropertyField(_extraAssemblySearchDirs); EditorGUILayout.PropertyField(_enabledObfuscationPasses); - EditorGUILayout.PropertyField(_secretKey); - EditorGUILayout.PropertyField(_globalRandomSeed); + EditorGUILayout.PropertyField(_secret); + EditorGUILayout.PropertyField(_secretOutputPath); + EditorGUILayout.PropertyField(_randomSeed); EditorGUILayout.PropertyField(_encryptionVMSettings); diff --git a/Editor/Unity/ObfuzMenu.cs b/Editor/Unity/ObfuzMenu.cs index 2a80be1..19fbe9a 100644 --- a/Editor/Unity/ObfuzMenu.cs +++ b/Editor/Unity/ObfuzMenu.cs @@ -1,7 +1,11 @@ using Obfuz.EncryptionVM; using Obfuz.Settings; +using Obfuz.Utils; +using System.IO; using UnityEditor; using UnityEngine; +using static UnityEditor.ObjectChangeEventStream; +using FileUtil = Obfuz.Utils.FileUtil; namespace Obfuz.Unity { @@ -15,8 +19,17 @@ namespace Obfuz.Unity public static void GenerateEncryptionVM() { EncryptionVMSettings settings = ObfuzSettings.Instance.encryptionVMSettings; - var generator = new VirtualMachineCodeGenerator(settings.codeGenerationSecretKey, settings.encryptionOpCodeCount); - generator.Generate(settings.CodeOutputPath); + var generator = new VirtualMachineCodeGenerator(settings.codeGenerationSecret, settings.encryptionOpCodeCount); + generator.Generate(settings.codeOutputPath); + } + + [MenuItem("Obfuz/SaveSecretFile", priority = 63)] + public static void SaveSecretFile() + { + ObfuzSettings settings = ObfuzSettings.Instance; + + var secretBytes = KeyGenerator.GenerateKey(settings.secret, VirtualMachine.SecretKeyLength); + Obfuscator.SaveKey(secretBytes, settings.secretOutputPath); } [MenuItem("Obfuz/Documents/Quick Start")] diff --git a/Runtime/EncryptionService.cs b/Runtime/EncryptionService.cs index 4a35a34..908ad24 100644 --- a/Runtime/EncryptionService.cs +++ b/Runtime/EncryptionService.cs @@ -8,7 +8,13 @@ namespace Obfuz { public static class EncryptionService { - private static readonly IEncryptor _encryptor = new NullEncryptor(new byte[] { 0x1A, 0x2B, 0x3C, 0x4D }); + private static IEncryptor _encryptor; + + public static IEncryptor Encryptor + { + get => _encryptor; + set { _encryptor = value; } + } public static void EncryptBlock(byte[] data, int ops, int salt) {