- 修复Rename field或property时没有检查CustomAttribute的constructor的declaring type是否匹配的bug
- Rename TypeDef之后开启TypeDefCachebackup
parent
12a290a0c7
commit
6d150ac278
|
@ -13,6 +13,7 @@ namespace Obfuz
|
||||||
private readonly IAssemblyResolver _assemblyPathResolver;
|
private readonly IAssemblyResolver _assemblyPathResolver;
|
||||||
private readonly ModuleContext _modCtx;
|
private readonly ModuleContext _modCtx;
|
||||||
private readonly AssemblyResolver _asmResolver;
|
private readonly AssemblyResolver _asmResolver;
|
||||||
|
private bool _enableTypeDefCache;
|
||||||
|
|
||||||
|
|
||||||
public ModuleContext ModCtx => _modCtx;
|
public ModuleContext ModCtx => _modCtx;
|
||||||
|
@ -21,13 +22,28 @@ namespace Obfuz
|
||||||
|
|
||||||
public AssemblyCache(IAssemblyResolver assemblyResolver)
|
public AssemblyCache(IAssemblyResolver assemblyResolver)
|
||||||
{
|
{
|
||||||
|
_enableTypeDefCache = true;
|
||||||
_assemblyPathResolver = assemblyResolver;
|
_assemblyPathResolver = assemblyResolver;
|
||||||
_modCtx = ModuleDef.CreateModuleContext();
|
_modCtx = ModuleDef.CreateModuleContext();
|
||||||
_asmResolver = (AssemblyResolver)_modCtx.AssemblyResolver;
|
_asmResolver = (AssemblyResolver)_modCtx.AssemblyResolver;
|
||||||
_asmResolver.EnableTypeDefCache = false;
|
_asmResolver.EnableTypeDefCache = _enableTypeDefCache;
|
||||||
_asmResolver.UseGAC = false;
|
_asmResolver.UseGAC = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool EnableTypeDefCache
|
||||||
|
{
|
||||||
|
get => _enableTypeDefCache;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
_enableTypeDefCache = value;
|
||||||
|
_asmResolver.EnableTypeDefCache = value;
|
||||||
|
foreach (var mod in LoadedModules.Values)
|
||||||
|
{
|
||||||
|
mod.EnableTypeDefFindCache = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public ModuleDefMD TryLoadModule(string moduleName)
|
public ModuleDefMD TryLoadModule(string moduleName)
|
||||||
{
|
{
|
||||||
|
@ -67,7 +83,7 @@ namespace Obfuz
|
||||||
{
|
{
|
||||||
//Debug.Log($"do load module:{dllPath}");
|
//Debug.Log($"do load module:{dllPath}");
|
||||||
ModuleDefMD mod = ModuleDefMD.Load(File.ReadAllBytes(dllPath), _modCtx);
|
ModuleDefMD mod = ModuleDefMD.Load(File.ReadAllBytes(dllPath), _modCtx);
|
||||||
mod.EnableTypeDefFindCache = false;
|
mod.EnableTypeDefFindCache = _enableTypeDefCache;
|
||||||
_asmResolver.AddToCache(mod);
|
_asmResolver.AddToCache(mod);
|
||||||
return mod;
|
return mod;
|
||||||
}
|
}
|
||||||
|
|
|
@ -78,6 +78,7 @@ namespace Obfuz
|
||||||
{
|
{
|
||||||
var ctx = new ObfuscatorContext
|
var ctx = new ObfuscatorContext
|
||||||
{
|
{
|
||||||
|
assemblyCache = _assemblyCache,
|
||||||
assemblies = _obfuzAssemblies,
|
assemblies = _obfuzAssemblies,
|
||||||
renamePolicy = _renamePolicy,
|
renamePolicy = _renamePolicy,
|
||||||
nameMaker = _nameMaker,
|
nameMaker = _nameMaker,
|
||||||
|
|
|
@ -19,6 +19,8 @@ namespace Obfuz
|
||||||
|
|
||||||
public class ObfuscatorContext
|
public class ObfuscatorContext
|
||||||
{
|
{
|
||||||
|
public AssemblyCache assemblyCache;
|
||||||
|
|
||||||
public List<ObfuzAssemblyInfo> assemblies;
|
public List<ObfuzAssemblyInfo> assemblies;
|
||||||
|
|
||||||
public IRenamePolicy renamePolicy;
|
public IRenamePolicy renamePolicy;
|
||||||
|
|
|
@ -146,6 +146,7 @@ namespace Obfuz
|
||||||
private void RenameTypes()
|
private void RenameTypes()
|
||||||
{
|
{
|
||||||
Debug.Log("RenameTypes begin");
|
Debug.Log("RenameTypes begin");
|
||||||
|
_ctx.assemblyCache.EnableTypeDefCache = false;
|
||||||
foreach (ObfuzAssemblyInfo ass in _ctx.assemblies)
|
foreach (ObfuzAssemblyInfo ass in _ctx.assemblies)
|
||||||
{
|
{
|
||||||
foreach (TypeDef type in ass.module.GetTypes())
|
foreach (TypeDef type in ass.module.GetTypes())
|
||||||
|
@ -160,6 +161,7 @@ namespace Obfuz
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
_ctx.assemblyCache.EnableTypeDefCache = true;
|
||||||
Debug.Log("Rename Types end");
|
Debug.Log("Rename Types end");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -623,12 +625,16 @@ namespace Obfuz
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void RenameFieldNameInCustomAttributes(ModuleDefMD referenceMeMod, ModuleDefMD mod, string oldFieldOrPropertyName, string newName)
|
private void RenameFieldNameInCustomAttributes(ModuleDefMD referenceMeMod, ModuleDefMD mod, TypeDef declaringType, string oldFieldOrPropertyName, string newName)
|
||||||
{
|
{
|
||||||
List<CustomAttributeInfo> customAttributes = _customAttributeArgumentsWithTypeByMods[referenceMeMod];
|
List<CustomAttributeInfo> customAttributes = _customAttributeArgumentsWithTypeByMods[referenceMeMod];
|
||||||
foreach (CustomAttributeInfo cai in customAttributes)
|
foreach (CustomAttributeInfo cai in customAttributes)
|
||||||
{
|
{
|
||||||
CustomAttribute oldAttr = cai.customAttributes[cai.index];
|
CustomAttribute oldAttr = cai.customAttributes[cai.index];
|
||||||
|
if (MetaUtil.GetTypeDefOrGenericTypeBase(oldAttr.Constructor.DeclaringType) != declaringType)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
bool anyChange = false;
|
bool anyChange = false;
|
||||||
if (cai.namedArguments != null)
|
if (cai.namedArguments != null)
|
||||||
{
|
{
|
||||||
|
@ -703,7 +709,7 @@ namespace Obfuz
|
||||||
Debug.Log($"rename assembly:{ass.name} field:{oldFieldFullName} => {memberRef}");
|
Debug.Log($"rename assembly:{ass.name} field:{oldFieldFullName} => {memberRef}");
|
||||||
}
|
}
|
||||||
|
|
||||||
RenameFieldNameInCustomAttributes(ass.module, (ModuleDefMD)field.DeclaringType.Module, field.Name, newName);
|
RenameFieldNameInCustomAttributes(ass.module, (ModuleDefMD)field.DeclaringType.Module, field.DeclaringType, field.Name, newName);
|
||||||
}
|
}
|
||||||
Debug.Log($"rename field. {field} => {newName}");
|
Debug.Log($"rename field. {field} => {newName}");
|
||||||
field.Name = newName;
|
field.Name = newName;
|
||||||
|
@ -822,12 +828,12 @@ namespace Obfuz
|
||||||
{
|
{
|
||||||
string oldName = property.Name;
|
string oldName = property.Name;
|
||||||
string newName = _nameMaker.GetNewName(property, oldName);
|
string newName = _nameMaker.GetNewName(property, oldName);
|
||||||
property.Name = newName;
|
|
||||||
ModuleDefMD mod = (ModuleDefMD)property.DeclaringType.Module;
|
ModuleDefMD mod = (ModuleDefMD)property.DeclaringType.Module;
|
||||||
foreach (ObfuzAssemblyInfo ass in GetReferenceMeAssemblies(mod))
|
foreach (ObfuzAssemblyInfo ass in GetReferenceMeAssemblies(mod))
|
||||||
{
|
{
|
||||||
RenameFieldNameInCustomAttributes(ass.module, mod, oldName, newName);
|
RenameFieldNameInCustomAttributes(ass.module, mod, property.DeclaringType, oldName, newName);
|
||||||
}
|
}
|
||||||
|
property.Name = newName;
|
||||||
_renameRecordMap.AddRenameRecord(property, oldName, newName);
|
_renameRecordMap.AddRenameRecord(property, oldName, newName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue