From 79bf659e657e63a18a359a12a036cd986b25b26c Mon Sep 17 00:00:00 2001 From: walon Date: Wed, 23 Apr 2025 18:58:44 +0800 Subject: [PATCH] =?UTF-8?q?rva=20data=E6=94=AF=E6=8C=81=E7=AE=80=E5=8D=95?= =?UTF-8?q?=E5=8A=A0=E5=AF=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Editor/Emit/RvaDataAllocator.cs | 14 +++++--- .../Virtualization/DefaultDataObfuscator.cs | 4 ++- Runtime/DefaultEncryptor.cs | 34 +++++++++++++++++++ Runtime/EncryptionService.cs | 4 ++- Runtime/IEncryptor.cs | 14 ++++++++ 5 files changed, 64 insertions(+), 6 deletions(-) create mode 100644 Runtime/DefaultEncryptor.cs create mode 100644 Runtime/IEncryptor.cs diff --git a/Editor/Emit/RvaDataAllocator.cs b/Editor/Emit/RvaDataAllocator.cs index 3882c27..78a4cdc 100644 --- a/Editor/Emit/RvaDataAllocator.cs +++ b/Editor/Emit/RvaDataAllocator.cs @@ -31,6 +31,7 @@ namespace Obfuz.Emit private readonly ModuleDef _module; private readonly IRandom _random; + private readonly IEncryptor _encryptor; class RvaField @@ -59,10 +60,11 @@ namespace Obfuz.Emit private readonly Dictionary _dataHolderTypeBySizes = new Dictionary(); - public ModuleRvaDataAllocator(ModuleDef mod, IRandom random) + public ModuleRvaDataAllocator(ModuleDef mod, IRandom random, IEncryptor encryptor) { _module = mod; _random = random; + _encryptor = encryptor; } private (FieldDef, FieldDef) CreateDataHolderRvaField(TypeDef dataHolderType) @@ -259,7 +261,9 @@ namespace Obfuz.Emit { field.FillPadding(); } - field.holderDataField.InitialValue = field.bytes.ToArray(); + byte[] data = field.bytes.ToArray(); + _encryptor.EncryptBytes(data, field.minorSecret); + field.holderDataField.InitialValue = data; } } @@ -274,18 +278,20 @@ namespace Obfuz.Emit { private readonly IRandom _random; + private readonly IEncryptor _encryptor; private readonly Dictionary _modules = new Dictionary(); - public RvaDataAllocator(IRandom random) + public RvaDataAllocator(IRandom random, IEncryptor encryptor) { _random = random; + _encryptor = encryptor; } private ModuleRvaDataAllocator GetModuleRvaDataAllocator(ModuleDef mod) { if (!_modules.TryGetValue(mod, out var allocator)) { - allocator = new ModuleRvaDataAllocator(mod, _random); + allocator = new ModuleRvaDataAllocator(mod, _random, _encryptor); _modules.Add(mod, allocator); } return allocator; diff --git a/Editor/Virtualization/DefaultDataObfuscator.cs b/Editor/Virtualization/DefaultDataObfuscator.cs index f4ac857..f5b168e 100644 --- a/Editor/Virtualization/DefaultDataObfuscator.cs +++ b/Editor/Virtualization/DefaultDataObfuscator.cs @@ -13,12 +13,14 @@ namespace Obfuz.Virtualization private readonly RandomDataNodeCreator _nodeCreator; private readonly RvaDataAllocator _rvaDataAllocator; private readonly ConstFieldAllocator _constFieldAllocator; + private readonly IEncryptor _encryptor; public DefaultDataObfuscator() { _random = new RandomWithKey(new byte[] { 0x1, 0x2, 0x3, 0x4 }, 0x5); + _encryptor = new DefaultEncryptor(new byte[] { 0x1A, 0x2B, 0x3C, 0x4D }); _nodeCreator = new RandomDataNodeCreator(_random); - _rvaDataAllocator = new RvaDataAllocator(_random); + _rvaDataAllocator = new RvaDataAllocator(_random, _encryptor); _constFieldAllocator = new ConstFieldAllocator(_random); } diff --git a/Runtime/DefaultEncryptor.cs b/Runtime/DefaultEncryptor.cs new file mode 100644 index 0000000..c28cf6e --- /dev/null +++ b/Runtime/DefaultEncryptor.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Obfuz +{ + public class DefaultEncryptor : IEncryptor + { + private readonly byte[] _key; + + public DefaultEncryptor(byte[] key) + { + _key = key; + } + + public void EncryptBytes(byte[] data, int minorSecret) + { + for (int i = 0; i < data.Length; i++) + { + data[i] ^= (byte)(_key[i % _key.Length] ^ minorSecret); + } + } + + public void DecryptBytes(byte[] data, int minorSecret) + { + for (int i = 0; i < data.Length; i++) + { + data[i] ^= (byte)(_key[i % _key.Length] ^ minorSecret); + } + } + } +} diff --git a/Runtime/EncryptionService.cs b/Runtime/EncryptionService.cs index 104f786..4d4e4e5 100644 --- a/Runtime/EncryptionService.cs +++ b/Runtime/EncryptionService.cs @@ -8,9 +8,11 @@ namespace Obfuz { public static class EncryptionService { + private static readonly IEncryptor _encryptor = new DefaultEncryptor(new byte[] { 0x1A, 0x2B, 0x3C, 0x4D }); + public static void DecryptBytes(byte[] data, int minorSecret) { - + _encryptor.EncryptBytes(data, minorSecret); } } } diff --git a/Runtime/IEncryptor.cs b/Runtime/IEncryptor.cs new file mode 100644 index 0000000..648a846 --- /dev/null +++ b/Runtime/IEncryptor.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Obfuz +{ + public interface IEncryptor + { + void EncryptBytes(byte[] data, int minorSecret); + void DecryptBytes(byte[] data, int minorSecret); + } +}