重命名 CustomAttribute Argument中的type和value
parent
fdfe7800b4
commit
8d917bd213
|
@ -1,7 +1,9 @@
|
||||||
using dnlib.DotNet;
|
using dnlib.DotNet;
|
||||||
using Obfuz.Rename;
|
using Obfuz.Rename;
|
||||||
|
using System;
|
||||||
using System.Collections;
|
using System.Collections;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Data.OleDb;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
using UnityEditor.SceneManagement;
|
using UnityEditor.SceneManagement;
|
||||||
|
@ -35,18 +37,23 @@ namespace Obfuz
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private bool MayRenameType(ElementType type)
|
||||||
|
{
|
||||||
|
return type == ElementType.Class || type == ElementType.ValueType || type == ElementType.Object || type == ElementType.SZArray;
|
||||||
|
}
|
||||||
|
|
||||||
private void CollectCArgumentWithTypeOf(IHasCustomAttribute meta, List<CustomAttributeInfo> customAttributes)
|
private void CollectCArgumentWithTypeOf(IHasCustomAttribute meta, List<CustomAttributeInfo> customAttributes)
|
||||||
{
|
{
|
||||||
int index = 0;
|
int index = 0;
|
||||||
foreach (CustomAttribute ca in meta.CustomAttributes)
|
foreach (CustomAttribute ca in meta.CustomAttributes)
|
||||||
{
|
{
|
||||||
List<CAArgument> arguments = null;
|
List<CAArgument> arguments = null;
|
||||||
if (ca.ConstructorArguments.Any(a => a.Type.ElementType == ElementType.Class))
|
if (ca.ConstructorArguments.Any(a => MayRenameType(a.Type.ElementType)))
|
||||||
{
|
{
|
||||||
arguments = ca.ConstructorArguments.ToList();
|
arguments = ca.ConstructorArguments.ToList();
|
||||||
}
|
}
|
||||||
List<CANamedArgument> namedArguments = null;
|
List<CANamedArgument> namedArguments = null;
|
||||||
if (ca.NamedArguments.Any(a => a.ArgumentType.ElementType == ElementType.Class))
|
if (ca.NamedArguments.Any(a => MayRenameType(a.Type.ElementType)))
|
||||||
{
|
{
|
||||||
namedArguments = ca.NamedArguments.ToList();
|
namedArguments = ca.NamedArguments.ToList();
|
||||||
}
|
}
|
||||||
|
@ -366,6 +373,69 @@ namespace Obfuz
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private object RenameTypeSigOfValue(object oldValue, ModuleDefMD mod, string oldFullName)
|
||||||
|
{
|
||||||
|
if (oldValue == null)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if (oldValue.GetType().IsPrimitive)
|
||||||
|
{
|
||||||
|
return oldValue;
|
||||||
|
}
|
||||||
|
if (oldValue is string || oldValue is UTF8String)
|
||||||
|
{
|
||||||
|
return oldValue;
|
||||||
|
}
|
||||||
|
if (oldValue is TypeSig typeSig)
|
||||||
|
{
|
||||||
|
return RenameTypeSig(typeSig, mod, oldFullName);
|
||||||
|
}
|
||||||
|
if (oldValue is CAArgument caValue)
|
||||||
|
{
|
||||||
|
TypeSig newType = RenameTypeSig(caValue.Type, mod, oldFullName);
|
||||||
|
object newValue = RenameTypeSigOfValue(caValue.Value, mod, oldFullName);
|
||||||
|
if (newType != caValue.Type || newValue != caValue.Value)
|
||||||
|
{
|
||||||
|
return new CAArgument(newType, newValue);
|
||||||
|
}
|
||||||
|
return oldValue;
|
||||||
|
}
|
||||||
|
if (oldValue is List<CAArgument> oldArr)
|
||||||
|
{
|
||||||
|
bool anyChange = false;
|
||||||
|
var newArr = new List<CAArgument>();
|
||||||
|
foreach (CAArgument oldArg in oldArr)
|
||||||
|
{
|
||||||
|
if (TryRenameArgument(mod, oldFullName, oldArg, out var newArg))
|
||||||
|
{
|
||||||
|
anyChange = true;
|
||||||
|
newArr.Add(newArg);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
newArr.Add(oldArg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return anyChange ? newArr : oldArr;
|
||||||
|
}
|
||||||
|
throw new NotSupportedException($"type:{oldValue.GetType()} value:{oldValue}");
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool TryRenameArgument(ModuleDefMD mod, string oldFullName, CAArgument oldArg, out CAArgument newArg)
|
||||||
|
{
|
||||||
|
TypeSig newType = RenameTypeSig(oldArg.Type, mod, oldFullName);
|
||||||
|
object newValue = RenameTypeSigOfValue(oldArg.Value, mod, oldFullName);
|
||||||
|
if (newType != oldArg.Type || oldArg.Value != newValue)
|
||||||
|
{
|
||||||
|
newArg = new CAArgument(newType, newValue);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
newArg = default;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
private void RenameTypeRefInCustomAttribute(ModuleDefMD referenceMeMod, ModuleDefMD mod, TypeDef typeDef, string oldFullName)
|
private void RenameTypeRefInCustomAttribute(ModuleDefMD referenceMeMod, ModuleDefMD mod, TypeDef typeDef, string oldFullName)
|
||||||
{
|
{
|
||||||
List<CustomAttributeInfo> customAttributes = _customAttributeArgumentsWithTypeByMods[referenceMeMod];
|
List<CustomAttributeInfo> customAttributes = _customAttributeArgumentsWithTypeByMods[referenceMeMod];
|
||||||
|
@ -378,14 +448,10 @@ namespace Obfuz
|
||||||
for (int i = 0; i < cai.arguments.Count; i++)
|
for (int i = 0; i < cai.arguments.Count; i++)
|
||||||
{
|
{
|
||||||
CAArgument oldArg = cai.arguments[i];
|
CAArgument oldArg = cai.arguments[i];
|
||||||
if (oldArg.Type.ElementType == ElementType.Class)
|
if (TryRenameArgument(mod, oldFullName, oldArg, out CAArgument newArg))
|
||||||
{
|
{
|
||||||
TypeSig newValue = RenameTypeSig((TypeSig)oldArg.Value, mod, oldFullName);
|
anyChange = true;
|
||||||
if (newValue != oldArg.Value)
|
cai.arguments[cai.index] = newArg;
|
||||||
{
|
|
||||||
anyChange = true;
|
|
||||||
cai.arguments[i] = new CAArgument(oldArg.Type, newValue);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -394,14 +460,10 @@ namespace Obfuz
|
||||||
for (int i = 0; i < cai.namedArguments.Count; i++)
|
for (int i = 0; i < cai.namedArguments.Count; i++)
|
||||||
{
|
{
|
||||||
CANamedArgument oldArg = cai.namedArguments[i];
|
CANamedArgument oldArg = cai.namedArguments[i];
|
||||||
if (oldArg.ArgumentType.ElementType == ElementType.Class)
|
if (TryRenameArgument(mod, oldFullName, oldArg.Argument, out var newArg))
|
||||||
{
|
{
|
||||||
TypeSig newValue = RenameTypeSig((TypeSig)oldArg.Value, mod, oldFullName);
|
anyChange = true;
|
||||||
if (newValue != oldArg.Value)
|
oldArg.Argument = newArg;
|
||||||
{
|
|
||||||
anyChange = true;
|
|
||||||
oldArg.Argument = new CAArgument(oldArg.Type, newValue);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue