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,34 +371,49 @@ namespace Obfuz.ObfusPasses.SymbolObfus
public readonly List<MemberRef> memberRefs = new List<MemberRef>(); public readonly List<MemberRef> memberRefs = new List<MemberRef>();
} }
private void RenameMethodRef(MemberRef memberRef, Dictionary<MethodDef, RefMethodMetas> 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<MethodDef, RefMethodMetas> refMethodMetasMap) private void BuildRefMethodMetasMap(Dictionary<MethodDef, RefMethodMetas> refMethodMetasMap)
{ {
foreach (ModuleDef mod in _obfuscatedAndNotObfuscatedModules) foreach (ModuleDef mod in _obfuscatedAndNotObfuscatedModules)
{ {
foreach (MemberRef memberRef in WalkMemberRefs(mod)) foreach (IMethod method in WalkAllMethodInstructionOperand<IMethod>(mod))
{ {
if (!memberRef.IsMethodRef) if (method is MemberRef memberRef)
{ {
continue; RenameMethodRef(memberRef, refMethodMetasMap);
} }
else if (method is MethodSpec methodSpec)
IMemberRefParent parent = memberRef.Class;
TypeDef parentTypeDef = MetaUtil.GetMemberRefTypeDefParentOrNull(parent);
if (parentTypeDef == null)
{ {
continue; if (methodSpec.Method is MemberRef memberRef2)
}
foreach (MethodDef method in parentTypeDef.Methods)
{
if (method.Name == memberRef.Name && new SigComparer(default).Equals(method.MethodSig, memberRef.MethodSig))
{ {
if (!refMethodMetasMap.TryGetValue(method, out var refMethodMetas)) RenameMethodRef(memberRef2, refMethodMetasMap);
{
refMethodMetas = new RefMethodMetas();
refMethodMetasMap.Add(method, refMethodMetas);
}
refMethodMetas.memberRefs.Add(memberRef);
break;
} }
} }
} }