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

View File

@ -396,12 +396,7 @@ namespace Obfuz.ObfusPasses.SymbolObfus
} }
private void RenameMethodRefOrMethodSpec(IMethod method, Dictionary<MethodDef, RefMethodMetas> refMethodMetasMap)
private void BuildRefMethodMetasMap(Dictionary<MethodDef, RefMethodMetas> refMethodMetasMap)
{
foreach (ModuleDef mod in _obfuscatedAndNotObfuscatedModules)
{
foreach (IMethod method in WalkAllMethodInstructionOperand<IMethod>(mod))
{ {
if (method is MemberRef memberRef) if (method is MemberRef memberRef)
{ {
@ -416,6 +411,15 @@ namespace Obfuz.ObfusPasses.SymbolObfus
} }
} }
private void BuildRefMethodMetasMap(Dictionary<MethodDef, RefMethodMetas> refMethodMetasMap)
{
foreach (ModuleDef mod in _obfuscatedAndNotObfuscatedModules)
{
foreach (IMethod method in WalkAllMethodInstructionOperand<IMethod>(mod))
{
RenameMethodRefOrMethodSpec(method, refMethodMetasMap);
}
foreach (var type in mod.GetTypes()) foreach (var type in mod.GetTypes())
{ {
foreach (MethodDef method in type.Methods) foreach (MethodDef method in type.Methods)
@ -424,23 +428,23 @@ namespace Obfuz.ObfusPasses.SymbolObfus
{ {
foreach (MethodOverride methodOverride in method.Overrides) foreach (MethodOverride methodOverride in method.Overrides)
{ {
if (methodOverride.MethodDeclaration is MemberRef memberRef) RenameMethodRefOrMethodSpec(methodOverride.MethodDeclaration, refMethodMetasMap);
RenameMethodRefOrMethodSpec(methodOverride.MethodBody, refMethodMetasMap);
}
}
}
}
foreach (var e in _refTypeRefMetasMap)
{ {
RenameMethodRef(memberRef, refMethodMetasMap); TypeDef typeDef = e.Key;
} var hierarchyFields = new List<FieldDef>();
else BuildHierarchyFields(typeDef, hierarchyFields);
RefTypeDefMetas typeDefMetas = e.Value;
foreach (CustomAttribute ca in typeDefMetas.customAttributes)
{ {
Assert.IsTrue(methodOverride.MethodDeclaration is MethodDef); if (ca.Constructor is IMethod method)
}
if (methodOverride.MethodBody is MemberRef memberRef2)
{ {
RenameMethodRef(memberRef2, refMethodMetasMap); RenameMethodRefOrMethodSpec(method, refMethodMetasMap);
}
else
{
Assert.IsTrue(methodOverride.MethodBody is MethodDef);
}
}
} }
} }
} }