fix: fix the bug that didn't rename MethodSpec in instruction operand when rename method in Symbol Obfus pass
parent
bd370e545a
commit
b6cc07b54b
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue