From 246a49f8bac5a76eb0e60b6abb0c108ba8d0c741 Mon Sep 17 00:00:00 2001 From: walon Date: Wed, 6 Aug 2025 15:21:23 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8DWatermarkPass=E6=9F=90?= =?UTF-8?q?=E4=BA=9B=E6=83=85=E5=86=B5=E4=B8=8B=E5=AF=BC=E8=87=B4=E6=A0=88?= =?UTF-8?q?=E4=B8=8D=E5=B9=B3=E8=A1=A1=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ObfusPasses/WalterMark/WatermarkPass.cs | 37 +++++++++++++------ 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/Editor/ObfusPasses/WalterMark/WatermarkPass.cs b/Editor/ObfusPasses/WalterMark/WatermarkPass.cs index a72f63d..f86b512 100644 --- a/Editor/ObfusPasses/WalterMark/WatermarkPass.cs +++ b/Editor/ObfusPasses/WalterMark/WatermarkPass.cs @@ -122,6 +122,20 @@ namespace Obfuz.ObfusPasses.Watermark return watermarkInfo; } + private int GetRandomInsertPosition(List instructions, IRandom random) + { + var insertPositions = instructions + .Select((inst, index) => new { Instruction = inst, Index = index }) + .Where(x => x.Instruction.OpCode.FlowControl == FlowControl.Next) + .Select(x => x.Index) + .ToList(); + if (insertPositions.Count == 0) + { + return 0; // No valid position to insert + } + return insertPositions[random.NextInt(insertPositions.Count)] + 1; + } + private void AddFieldAccessToSignatureHolder(ModuleDef module, EncryptionScopeInfo encryptionScope, WatermarkInfo watermarkInfo) { var insertTargetMethods = module.Types @@ -141,18 +155,18 @@ namespace Obfuz.ObfusPasses.Watermark { // Randomly select a method to insert the access var targetMethod = insertTargetMethods[random.NextInt(insertTargetMethods.Count)]; - int insertIndex = random.NextInt(1, targetMethod.Body.Instructions.Count - 3); - var insts = (List)targetMethod.Body.Instructions; - + int insertIndex = GetRandomInsertPosition(insts, random); + Instruction nop = Instruction.Create(OpCodes.Nop); insts.InsertRange(insertIndex, new[] { - Instruction.CreateLdcI4(random.NextInt(1, 10000000)), - Instruction.Create(OpCodes.Brtrue, insts[insertIndex]), - Instruction.CreateLdcI4(random.NextInt(fieldDef.InitialValue.Length)), - Instruction.Create(OpCodes.Newarr, module.CorLibTypes.Byte), - Instruction.Create(OpCodes.Ldtoken, fieldDef), - Instruction.Create(OpCodes.Call, importer.InitializedArray), + Instruction.CreateLdcI4(random.NextInt(1, 10000000)), + Instruction.Create(OpCodes.Brtrue, nop), + Instruction.CreateLdcI4(random.NextInt(fieldDef.InitialValue.Length)), + Instruction.Create(OpCodes.Newarr, module.CorLibTypes.Byte), + Instruction.Create(OpCodes.Ldtoken, fieldDef), + Instruction.Create(OpCodes.Call, importer.InitializedArray), + nop, }); //Debug.Log($"Inserted watermark access for field '{fieldDef.Name}' in method '{targetMethod.FullName}' at index {insertIndex}."); } @@ -189,8 +203,7 @@ namespace Obfuz.ObfusPasses.Watermark // Randomly select a method to insert the IL sequence var targetMethod = insertTargetMethods[random.NextInt(insertTargetMethods.Count)]; var insts = (List)targetMethod.Body.Instructions; - int insertIndex = random.NextInt(1, insts.Count - 3); - + int insertIndex = GetRandomInsertPosition(insts, random); var insertInstructions = new List() { Instruction.CreateLdcI4(random.NextInt(1, 10000000)), @@ -204,7 +217,7 @@ namespace Obfuz.ObfusPasses.Watermark insertInstructions.Add(Instruction.Create(GetRandomBinOpCode(random))); } } - insertInstructions.Add(Instruction.Create(OpCodes.Brfalse, insertInstructions[0])); + insertInstructions.Add(Instruction.Create(OpCodes.Pop)); insts.InsertRange(insertIndex, insertInstructions); intIndex += ldcCount;