diff --git a/Editor/Data/ConstFieldAllocator.cs b/Editor/Data/ConstFieldAllocator.cs index a8e4ada..7e9ccbc 100644 --- a/Editor/Data/ConstFieldAllocator.cs +++ b/Editor/Data/ConstFieldAllocator.cs @@ -96,12 +96,13 @@ namespace Obfuz.Data { if (_holderTypeDef == null || _holderTypeDef.Fields.Count >= maxFieldCount) { - _module.EnableTypeDefFindCache = false; - ITypeDefOrRef objectTypeRef = _module.Import(typeof(object)); - _holderTypeDef = new TypeDefUser($"{ConstValues.ObfuzInternalSymbolNamePrefix}ConstFieldHolder${_holderTypeDefs.Count}", objectTypeRef); - _module.Types.Add(_holderTypeDef); - _holderTypeDefs.Add(_holderTypeDef); - _module.EnableTypeDefFindCache = true; + using (var scope = new DisableTypeDefFindCacheScope(_module)) + { + ITypeDefOrRef objectTypeRef = _module.Import(typeof(object)); + _holderTypeDef = new TypeDefUser($"{ConstValues.ObfuzInternalSymbolNamePrefix}ConstFieldHolder${_holderTypeDefs.Count}", objectTypeRef); + _module.Types.Add(_holderTypeDef); + _holderTypeDefs.Add(_holderTypeDef); + } } var field = new FieldDefUser($"{ConstValues.ObfuzInternalSymbolNamePrefix}RVA_Value{_holderTypeDef.Fields.Count}", new FieldSig(GetTypeSigOfValue(value)), FieldAttributes.Static | FieldAttributes.Public | FieldAttributes.InitOnly); diff --git a/Editor/Data/RvaDataAllocator.cs b/Editor/Data/RvaDataAllocator.cs index 8516f25..e3b9710 100644 --- a/Editor/Data/RvaDataAllocator.cs +++ b/Editor/Data/RvaDataAllocator.cs @@ -88,16 +88,12 @@ namespace Obfuz.Data { if (_rvaTypeDef == null) { - _module.EnableTypeDefFindCache = false; - //_rvaTypeDef = _module.Find("$ObfuzRVA$", true); - //if (_rvaTypeDef != null) - //{ - // throw new Exception($"can't obfuscate a obfuscated assembly"); - //} - ITypeDefOrRef objectTypeRef = _module.Import(typeof(object)); - _rvaTypeDef = new TypeDefUser("$Obfuz$RVA$", objectTypeRef); - _module.Types.Add(_rvaTypeDef); - _module.EnableTypeDefFindCache = true; + using (var scope = new DisableTypeDefFindCacheScope(_module)) + { + ITypeDefOrRef objectTypeRef = _module.Import(typeof(object)); + _rvaTypeDef = new TypeDefUser("$Obfuz$RVA$", objectTypeRef); + _module.Types.Add(_rvaTypeDef); + } } @@ -114,14 +110,18 @@ namespace Obfuz.Data size = (size + 15) & ~15; // align to 6 bytes if (_dataHolderTypeBySizes.TryGetValue(size, out var type)) return type; - var dataHolderType = new TypeDefUser($"$ObfuzRVA$DataHolder{size}", _module.Import(typeof(ValueType))); - dataHolderType.Attributes = TypeAttributes.Public | TypeAttributes.Sealed; - dataHolderType.Layout = TypeAttributes.ExplicitLayout; - dataHolderType.PackingSize = 1; - dataHolderType.ClassSize = (uint)size; - _dataHolderTypeBySizes.Add(size, dataHolderType); - _module.Types.Add(dataHolderType); - return dataHolderType; + + using (var scope = new DisableTypeDefFindCacheScope(_module)) + { + var dataHolderType = new TypeDefUser($"$ObfuzRVA$DataHolder{size}", _module.Import(typeof(ValueType))); + dataHolderType.Attributes = TypeAttributes.Public | TypeAttributes.Sealed; + dataHolderType.Layout = TypeAttributes.ExplicitLayout; + dataHolderType.PackingSize = 1; + dataHolderType.ClassSize = (uint)size; + _dataHolderTypeBySizes.Add(size, dataHolderType); + _module.Types.Add(dataHolderType); + return dataHolderType; + } } private static int AlignTo(int size, int alignment) diff --git a/Editor/ObfusPasses/CallObfus/CallProxyAllocator.cs b/Editor/ObfusPasses/CallObfus/CallProxyAllocator.cs index f17871f..5cd0c75 100644 --- a/Editor/ObfusPasses/CallObfus/CallProxyAllocator.cs +++ b/Editor/ObfusPasses/CallObfus/CallProxyAllocator.cs @@ -107,12 +107,13 @@ namespace Obfuz.ObfusPasses.CallObfus private TypeDef CreateProxyTypeDef() { - var typeDef = new TypeDefUser($"{ConstValues.ObfuzInternalSymbolNamePrefix}ProxyCall", _module.CorLibTypes.Object.ToTypeDefOrRef()); - typeDef.Attributes = TypeAttributes.NotPublic | TypeAttributes.Sealed; - _module.EnableTypeDefFindCache = false; - _module.Types.Add(typeDef); - _module.EnableTypeDefFindCache = true; - return typeDef; + using (var scope = new DisableTypeDefFindCacheScope(_module)) + { + var typeDef = new TypeDefUser($"{ConstValues.ObfuzInternalSymbolNamePrefix}ProxyCall", _module.CorLibTypes.Object.ToTypeDefOrRef()); + typeDef.Attributes = TypeAttributes.NotPublic | TypeAttributes.Sealed; + _module.Types.Add(typeDef); + return typeDef; + } } private readonly HashSet _uniqueMethodNames = new HashSet(); diff --git a/Editor/Utils/DisableTypeDefFindCacheScope.cs b/Editor/Utils/DisableTypeDefFindCacheScope.cs new file mode 100644 index 0000000..4a01aa6 --- /dev/null +++ b/Editor/Utils/DisableTypeDefFindCacheScope.cs @@ -0,0 +1,25 @@ +using dnlib.DotNet; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Obfuz.Utils +{ + public class DisableTypeDefFindCacheScope : IDisposable + { + private readonly ModuleDef _module; + + public DisableTypeDefFindCacheScope(ModuleDef module) + { + _module = module; + _module.EnableTypeDefFindCache = false; + } + + public void Dispose() + { + _module.EnableTypeDefFindCache = true; + } + } +} diff --git a/Editor/Utils/DisableTypeDefFindCacheScope.cs.meta b/Editor/Utils/DisableTypeDefFindCacheScope.cs.meta new file mode 100644 index 0000000..349b119 --- /dev/null +++ b/Editor/Utils/DisableTypeDefFindCacheScope.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 89640cb831c78f8429c861fb49bae0e7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: