- 修复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 ModuleContext _modCtx;
|
||||
private readonly AssemblyResolver _asmResolver;
|
||||
private bool _enableTypeDefCache;
|
||||
|
||||
|
||||
public ModuleContext ModCtx => _modCtx;
|
||||
|
@ -21,13 +22,28 @@ namespace Obfuz
|
|||
|
||||
public AssemblyCache(IAssemblyResolver assemblyResolver)
|
||||
{
|
||||
_enableTypeDefCache = true;
|
||||
_assemblyPathResolver = assemblyResolver;
|
||||
_modCtx = ModuleDef.CreateModuleContext();
|
||||
_asmResolver = (AssemblyResolver)_modCtx.AssemblyResolver;
|
||||
_asmResolver.EnableTypeDefCache = false;
|
||||
_asmResolver.EnableTypeDefCache = _enableTypeDefCache;
|
||||
_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)
|
||||
{
|
||||
|
@ -67,7 +83,7 @@ namespace Obfuz
|
|||
{
|
||||
//Debug.Log($"do load module:{dllPath}");
|
||||
ModuleDefMD mod = ModuleDefMD.Load(File.ReadAllBytes(dllPath), _modCtx);
|
||||
mod.EnableTypeDefFindCache = false;
|
||||
mod.EnableTypeDefFindCache = _enableTypeDefCache;
|
||||
_asmResolver.AddToCache(mod);
|
||||
return mod;
|
||||
}
|
||||
|
|
|
@ -78,6 +78,7 @@ namespace Obfuz
|
|||
{
|
||||
var ctx = new ObfuscatorContext
|
||||
{
|
||||
assemblyCache = _assemblyCache,
|
||||
assemblies = _obfuzAssemblies,
|
||||
renamePolicy = _renamePolicy,
|
||||
nameMaker = _nameMaker,
|
||||
|
|
|
@ -19,6 +19,8 @@ namespace Obfuz
|
|||
|
||||
public class ObfuscatorContext
|
||||
{
|
||||
public AssemblyCache assemblyCache;
|
||||
|
||||
public List<ObfuzAssemblyInfo> assemblies;
|
||||
|
||||
public IRenamePolicy renamePolicy;
|
||||
|
|
|
@ -146,6 +146,7 @@ namespace Obfuz
|
|||
private void RenameTypes()
|
||||
{
|
||||
Debug.Log("RenameTypes begin");
|
||||
_ctx.assemblyCache.EnableTypeDefCache = false;
|
||||
foreach (ObfuzAssemblyInfo ass in _ctx.assemblies)
|
||||
{
|
||||
foreach (TypeDef type in ass.module.GetTypes())
|
||||
|
@ -160,6 +161,7 @@ namespace Obfuz
|
|||
}
|
||||
}
|
||||
}
|
||||
_ctx.assemblyCache.EnableTypeDefCache = true;
|
||||
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];
|
||||
foreach (CustomAttributeInfo cai in customAttributes)
|
||||
{
|
||||
CustomAttribute oldAttr = cai.customAttributes[cai.index];
|
||||
if (MetaUtil.GetTypeDefOrGenericTypeBase(oldAttr.Constructor.DeclaringType) != declaringType)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
bool anyChange = false;
|
||||
if (cai.namedArguments != null)
|
||||
{
|
||||
|
@ -703,7 +709,7 @@ namespace Obfuz
|
|||
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}");
|
||||
field.Name = newName;
|
||||
|
@ -822,12 +828,12 @@ namespace Obfuz
|
|||
{
|
||||
string oldName = property.Name;
|
||||
string newName = _nameMaker.GetNewName(property, oldName);
|
||||
property.Name = newName;
|
||||
ModuleDefMD mod = (ModuleDefMD)property.DeclaringType.Module;
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue