From b6cc07b54b4e1ab75848057ccf84259cbd087762 Mon Sep 17 00:00:00 2001 From: walon Date: Wed, 21 May 2025 17:29:52 +0800 Subject: [PATCH] fix: fix the bug that didn't rename MethodSpec in instruction operand when rename method in Symbol Obfus pass --- .../ObfusPasses/SymbolObfus/SymbolRename.cs | 64 +++++++++++-------- 1 file changed, 37 insertions(+), 27 deletions(-) diff --git a/com.code-philosophy.obfuz/Editor/ObfusPasses/SymbolObfus/SymbolRename.cs b/com.code-philosophy.obfuz/Editor/ObfusPasses/SymbolObfus/SymbolRename.cs index cda7d4f..ef55dfe 100644 --- a/com.code-philosophy.obfuz/Editor/ObfusPasses/SymbolObfus/SymbolRename.cs +++ b/com.code-philosophy.obfuz/Editor/ObfusPasses/SymbolObfus/SymbolRename.cs @@ -263,7 +263,7 @@ namespace Obfuz.ObfusPasses.SymbolObfus } } - private IEnumerable WalkMemberRefs(ModuleDef mod) + private IEnumerable WalkAllMethodInstructionOperand(ModuleDef mod) { foreach (TypeDef type in mod.GetTypes()) { @@ -275,7 +275,7 @@ namespace Obfuz.ObfusPasses.SymbolObfus } foreach (var instr in method.Body.Instructions) { - if (instr.Operand is MemberRef memberRef) + if (instr.Operand is T memberRef) { yield return memberRef; } @@ -288,13 +288,8 @@ namespace Obfuz.ObfusPasses.SymbolObfus { foreach (ModuleDef mod in _obfuscatedAndNotObfuscatedModules) { - foreach (MemberRef memberRef in WalkMemberRefs(mod)) + foreach (MemberRef memberRef in WalkAllMethodInstructionOperand(mod)) { - if (!memberRef.IsFieldRef) - { - continue; - } - IMemberRefParent parent = memberRef.Class; TypeDef parentTypeDef = MetaUtil.GetMemberRefTypeDefParentOrNull(parent); if (parentTypeDef == null) @@ -376,34 +371,49 @@ namespace Obfuz.ObfusPasses.SymbolObfus public readonly List memberRefs = new List(); } + private void RenameMethodRef(MemberRef memberRef, Dictionary refMethodMetasMap) + { + if (!memberRef.IsMethodRef) + { + return; + } + + IMemberRefParent parent = memberRef.Class; + TypeDef parentTypeDef = MetaUtil.GetMemberRefTypeDefParentOrNull(parent); + if (parentTypeDef == null) + { + return; + } + foreach (MethodDef methodDef in parentTypeDef.Methods) + { + if (methodDef.Name == memberRef.Name && new SigComparer(default).Equals(methodDef.MethodSig, memberRef.MethodSig)) + { + if (!refMethodMetasMap.TryGetValue(methodDef, out var refMethodMetas)) + { + refMethodMetas = new RefMethodMetas(); + refMethodMetasMap.Add(methodDef, refMethodMetas); + } + refMethodMetas.memberRefs.Add(memberRef); + break; + } + } + } + private void BuildRefMethodMetasMap(Dictionary refMethodMetasMap) { foreach (ModuleDef mod in _obfuscatedAndNotObfuscatedModules) { - foreach (MemberRef memberRef in WalkMemberRefs(mod)) + foreach (IMethod method in WalkAllMethodInstructionOperand(mod)) { - if (!memberRef.IsMethodRef) + if (method is MemberRef memberRef) { - continue; + RenameMethodRef(memberRef, refMethodMetasMap); } - - IMemberRefParent parent = memberRef.Class; - TypeDef parentTypeDef = MetaUtil.GetMemberRefTypeDefParentOrNull(parent); - if (parentTypeDef == null) + else if (method is MethodSpec methodSpec) { - continue; - } - foreach (MethodDef method in parentTypeDef.Methods) - { - if (method.Name == memberRef.Name && new SigComparer(default).Equals(method.MethodSig, memberRef.MethodSig)) + if (methodSpec.Method is MemberRef memberRef2) { - if (!refMethodMetasMap.TryGetValue(method, out var refMethodMetas)) - { - refMethodMetas = new RefMethodMetas(); - refMethodMetasMap.Add(method, refMethodMetas); - } - refMethodMetas.memberRefs.Add(memberRef); - break; + RenameMethodRef(memberRef2, refMethodMetasMap); } } }