From 3ee44663fb91cd3c9b4dc5198993d4f590a24818 Mon Sep 17 00:00:00 2001 From: walon Date: Wed, 7 May 2025 10:14:55 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=20RvaDataAllocator=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0=EF=BC=8C=E5=8A=A0=E8=A7=A3=E5=AF=86=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=20long=20ops=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Editor/Emit/RvaDataAllocator.cs | 43 +++++++++++++++++++-------------- 1 file changed, 25 insertions(+), 18 deletions(-) diff --git a/Editor/Emit/RvaDataAllocator.cs b/Editor/Emit/RvaDataAllocator.cs index 14434fa..00fdf2a 100644 --- a/Editor/Emit/RvaDataAllocator.cs +++ b/Editor/Emit/RvaDataAllocator.cs @@ -38,11 +38,20 @@ namespace Obfuz.Emit { public FieldDef holderDataField; public FieldDef runtimeValueField; + public long encryptionOps; public uint size; public List bytes; - public int minorSecret; + public int salt; - public void FillPadding() + public void FillPaddingToSize(int newSize) + { + for (int i = bytes.Count; i < newSize; i++) + { + bytes.Add(0xAB); + } + } + + public void FillPaddingToEnd() { // fill with random value for (int i = bytes.Count; i < size; i++) @@ -121,7 +130,8 @@ namespace Obfuz.Emit runtimeValueField = runtimeValueField, size = dataHolderType.ClassSize, bytes = new List((int)dataHolderType.ClassSize), - minorSecret = _random.NextInt(), + encryptionOps = _random.NextLong(), + salt = _random.NextInt(), }; _rvaFields.Add(newRvaField); return newRvaField; @@ -143,17 +153,11 @@ namespace Obfuz.Emit int expectedSize = offset + preservedSize; if (expectedSize <= _currentField.size) { - // insert random padding - for (int i = _currentField.bytes.Count; i < offset; i++) - { - //_currentField.bytes.Add((byte)_random.NextInt(0, 256)); - // TODO replace with random value - _currentField.bytes.Add(0xAB); - } + _currentField.FillPaddingToSize(offset); return _currentField; } - _currentField.FillPadding(); + _currentField.FillPaddingToEnd(); } _currentField = CreateRvaField(maxRvaDataSize); return _currentField; @@ -216,18 +220,18 @@ namespace Obfuz.Emit return; } ModuleDef mod = _rvaTypeDef.Module; - var cctor = new MethodDefUser(".cctor", + var cctorMethod = new MethodDefUser(".cctor", MethodSig.CreateStatic(_module.CorLibTypes.Void), MethodImplAttributes.IL | MethodImplAttributes.Managed, MethodAttributes.Static | MethodAttributes.HideBySig | MethodAttributes.SpecialName | MethodAttributes.RTSpecialName | MethodAttributes.Private); - cctor.DeclaringType = _rvaTypeDef; + cctorMethod.DeclaringType = _rvaTypeDef; //_rvaTypeDef.Methods.Add(cctor); var body = new CilBody(); - cctor.Body = body; + cctorMethod.Body = body; var ins = body.Instructions; IMethod initializeArrayMethod = mod.Import(typeof(System.Runtime.CompilerServices.RuntimeHelpers).GetMethod("InitializeArray", new[] { typeof(Array), typeof(RuntimeFieldHandle) })); - IMethod decryptArrayMethod = mod.Import(typeof(EncryptionService).GetMethod("DecryptBytes", new[] { typeof(byte[]), typeof(int) })); + IMethod decryptArrayMethod = mod.Import(typeof(EncryptionService).GetMethod("DecryptBlock", new[] { typeof(byte[]), typeof(long), typeof(int) })); Assert.IsNotNull(initializeArrayMethod); foreach (var field in _rvaFields) @@ -245,7 +249,10 @@ namespace Obfuz.Emit ins.Add(Instruction.Create(OpCodes.Stsfld, field.runtimeValueField)); ins.Add(Instruction.Create(OpCodes.Ldtoken, field.holderDataField)); ins.Add(Instruction.Create(OpCodes.Call, initializeArrayMethod)); - ins.Add(Instruction.Create(OpCodes.Ldc_I4, field.minorSecret)); + + // EncryptionService.DecryptBlock(array, field.encryptionOps, field.salt); + ins.Add(Instruction.Create(OpCodes.Ldc_I8, field.encryptionOps)); + ins.Add(Instruction.Create(OpCodes.Ldc_I4, field.salt)); ins.Add(Instruction.Create(OpCodes.Call, decryptArrayMethod)); } @@ -259,10 +266,10 @@ namespace Obfuz.Emit Assert.IsTrue(field.bytes.Count <= field.size); if (field.bytes.Count < field.size) { - field.FillPadding(); + field.FillPaddingToEnd(); } byte[] data = field.bytes.ToArray(); - _encryptor.EncryptBytes(data, field.minorSecret); + _encryptor.EncryptBlock(data, field.encryptionOps, field.salt); field.holderDataField.InitialValue = data; } }