fix: fix the bug that didn't rename MethodSpec in instruction operand when rename method in Symbol Obfus pass

before-split
walon 2025-05-21 17:29:52 +08:00
parent bd370e545a
commit b6cc07b54b
1 changed files with 37 additions and 27 deletions

View File

@ -263,7 +263,7 @@ namespace Obfuz.ObfusPasses.SymbolObfus
} }
} }
private IEnumerable<MemberRef> WalkMemberRefs(ModuleDef mod) private IEnumerable<T> WalkAllMethodInstructionOperand<T>(ModuleDef mod)
{ {
foreach (TypeDef type in mod.GetTypes()) foreach (TypeDef type in mod.GetTypes())
{ {
@ -275,7 +275,7 @@ namespace Obfuz.ObfusPasses.SymbolObfus
} }
foreach (var instr in method.Body.Instructions) foreach (var instr in method.Body.Instructions)
{ {
if (instr.Operand is MemberRef memberRef) if (instr.Operand is T memberRef)
{ {
yield return memberRef; yield return memberRef;
} }
@ -288,13 +288,8 @@ namespace Obfuz.ObfusPasses.SymbolObfus
{ {
foreach (ModuleDef mod in _obfuscatedAndNotObfuscatedModules) foreach (ModuleDef mod in _obfuscatedAndNotObfuscatedModules)
{ {
foreach (MemberRef memberRef in WalkMemberRefs(mod)) foreach (MemberRef memberRef in WalkAllMethodInstructionOperand<MemberRef>(mod))
{ {
if (!memberRef.IsFieldRef)
{
continue;
}
IMemberRefParent parent = memberRef.Class; IMemberRefParent parent = memberRef.Class;
TypeDef parentTypeDef = MetaUtil.GetMemberRefTypeDefParentOrNull(parent); TypeDef parentTypeDef = MetaUtil.GetMemberRefTypeDefParentOrNull(parent);
if (parentTypeDef == null) if (parentTypeDef == null)
@ -376,37 +371,52 @@ namespace Obfuz.ObfusPasses.SymbolObfus
public readonly List<MemberRef> memberRefs = new List<MemberRef>(); public readonly List<MemberRef> memberRefs = new List<MemberRef>();
} }
private void BuildRefMethodMetasMap(Dictionary<MethodDef, RefMethodMetas> refMethodMetasMap) private void RenameMethodRef(MemberRef memberRef, Dictionary<MethodDef, RefMethodMetas> refMethodMetasMap)
{
foreach (ModuleDef mod in _obfuscatedAndNotObfuscatedModules)
{
foreach (MemberRef memberRef in WalkMemberRefs(mod))
{ {
if (!memberRef.IsMethodRef) if (!memberRef.IsMethodRef)
{ {
continue; return;
} }
IMemberRefParent parent = memberRef.Class; IMemberRefParent parent = memberRef.Class;
TypeDef parentTypeDef = MetaUtil.GetMemberRefTypeDefParentOrNull(parent); TypeDef parentTypeDef = MetaUtil.GetMemberRefTypeDefParentOrNull(parent);
if (parentTypeDef == null) if (parentTypeDef == null)
{ {
continue; return;
} }
foreach (MethodDef method in parentTypeDef.Methods) foreach (MethodDef methodDef in parentTypeDef.Methods)
{ {
if (method.Name == memberRef.Name && new SigComparer(default).Equals(method.MethodSig, memberRef.MethodSig)) if (methodDef.Name == memberRef.Name && new SigComparer(default).Equals(methodDef.MethodSig, memberRef.MethodSig))
{ {
if (!refMethodMetasMap.TryGetValue(method, out var refMethodMetas)) if (!refMethodMetasMap.TryGetValue(methodDef, out var refMethodMetas))
{ {
refMethodMetas = new RefMethodMetas(); refMethodMetas = new RefMethodMetas();
refMethodMetasMap.Add(method, refMethodMetas); refMethodMetasMap.Add(methodDef, refMethodMetas);
} }
refMethodMetas.memberRefs.Add(memberRef); refMethodMetas.memberRefs.Add(memberRef);
break; break;
} }
} }
} }
private void BuildRefMethodMetasMap(Dictionary<MethodDef, RefMethodMetas> refMethodMetasMap)
{
foreach (ModuleDef mod in _obfuscatedAndNotObfuscatedModules)
{
foreach (IMethod method in WalkAllMethodInstructionOperand<IMethod>(mod))
{
if (method is MemberRef memberRef)
{
RenameMethodRef(memberRef, refMethodMetasMap);
}
else if (method is MethodSpec methodSpec)
{
if (methodSpec.Method is MemberRef memberRef2)
{
RenameMethodRef(memberRef2, refMethodMetasMap);
}
}
}
} }
} }