RenameMethod时检查CustomAttribute

before-split
walon 2025-05-25 08:20:33 +08:00
parent 882047eb6c
commit e0da3da2bc
2 changed files with 37 additions and 27 deletions

View File

@ -1,4 +1,5 @@
using dnlib.DotNet;
using NUnit.Framework;
using Obfuz.Utils;
using System;
using System.Collections.Generic;
@ -407,6 +408,10 @@ namespace Obfuz.ObfusPasses.SymbolObfus
typeNode.SetAttribute("fullName", record?.signature ?? type.FullName);
typeNode.SetAttribute("newFullName", record != null && record.status == RenameStatus.Renamed ? record.newName : "");
typeNode.SetAttribute("status", record != null ? record.status.ToString() : RenameStatus.NotRenamed.ToString());
if (record != null && record.status == RenameStatus.Renamed)
{
Assert.IsFalse(string.IsNullOrWhiteSpace(record.newName), "New name for type cannot be null or empty when status is Renamed.");
}
foreach (FieldDef field in type.Fields)
{
@ -622,6 +627,7 @@ namespace Obfuz.ObfusPasses.SymbolObfus
if (_typeRenames.TryGetValue(type, out var record) && record.renameMappingData != null)
{
var rmt = (RenameMappingType)record.renameMappingData;
Assert.IsFalse(string.IsNullOrWhiteSpace(rmt.newFullName));
(newNamespace, newName) = MetaUtil.SplitNamespaceAndName(rmt.newFullName);
return true;
}

View File

@ -396,6 +396,20 @@ namespace Obfuz.ObfusPasses.SymbolObfus
}
private void RenameMethodRefOrMethodSpec(IMethod method, Dictionary<MethodDef, RefMethodMetas> refMethodMetasMap)
{
if (method is MemberRef memberRef)
{
RenameMethodRef(memberRef, refMethodMetasMap);
}
else if (method is MethodSpec methodSpec)
{
if (methodSpec.Method is MemberRef memberRef2)
{
RenameMethodRef(memberRef2, refMethodMetasMap);
}
}
}
private void BuildRefMethodMetasMap(Dictionary<MethodDef, RefMethodMetas> refMethodMetasMap)
{
@ -403,17 +417,7 @@ namespace Obfuz.ObfusPasses.SymbolObfus
{
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);
}
}
RenameMethodRefOrMethodSpec(method, refMethodMetasMap);
}
foreach (var type in mod.GetTypes())
@ -424,26 +428,26 @@ namespace Obfuz.ObfusPasses.SymbolObfus
{
foreach (MethodOverride methodOverride in method.Overrides)
{
if (methodOverride.MethodDeclaration is MemberRef memberRef)
{
RenameMethodRef(memberRef, refMethodMetasMap);
}
else
{
Assert.IsTrue(methodOverride.MethodDeclaration is MethodDef);
}
if (methodOverride.MethodBody is MemberRef memberRef2)
{
RenameMethodRef(memberRef2, refMethodMetasMap);
}
else
{
Assert.IsTrue(methodOverride.MethodBody is MethodDef);
}
RenameMethodRefOrMethodSpec(methodOverride.MethodDeclaration, refMethodMetasMap);
RenameMethodRefOrMethodSpec(methodOverride.MethodBody, refMethodMetasMap);
}
}
}
}
foreach (var e in _refTypeRefMetasMap)
{
TypeDef typeDef = e.Key;
var hierarchyFields = new List<FieldDef>();
BuildHierarchyFields(typeDef, hierarchyFields);
RefTypeDefMetas typeDefMetas = e.Value;
foreach (CustomAttribute ca in typeDefMetas.customAttributes)
{
if (ca.Constructor is IMethod method)
{
RenameMethodRefOrMethodSpec(method, refMethodMetasMap);
}
}
}
}
}