- 修复 RvaDataAllocator::GetDataHolderType 创建TypeDefUser未disableTypeDefFindCache的bug

- 使用 DisableTypeDefFindCacheScope 重构创建TypeDef类型自动disable和enable TypeDefFindCache
1.x
walon 2025-06-12 15:07:13 +08:00
parent a61f31e289
commit 6226c3a867
5 changed files with 68 additions and 30 deletions

View File

@ -96,12 +96,13 @@ namespace Obfuz.Data
{ {
if (_holderTypeDef == null || _holderTypeDef.Fields.Count >= maxFieldCount) if (_holderTypeDef == null || _holderTypeDef.Fields.Count >= maxFieldCount)
{ {
_module.EnableTypeDefFindCache = false; using (var scope = new DisableTypeDefFindCacheScope(_module))
{
ITypeDefOrRef objectTypeRef = _module.Import(typeof(object)); ITypeDefOrRef objectTypeRef = _module.Import(typeof(object));
_holderTypeDef = new TypeDefUser($"{ConstValues.ObfuzInternalSymbolNamePrefix}ConstFieldHolder${_holderTypeDefs.Count}", objectTypeRef); _holderTypeDef = new TypeDefUser($"{ConstValues.ObfuzInternalSymbolNamePrefix}ConstFieldHolder${_holderTypeDefs.Count}", objectTypeRef);
_module.Types.Add(_holderTypeDef); _module.Types.Add(_holderTypeDef);
_holderTypeDefs.Add(_holderTypeDef); _holderTypeDefs.Add(_holderTypeDef);
_module.EnableTypeDefFindCache = true; }
} }
var field = new FieldDefUser($"{ConstValues.ObfuzInternalSymbolNamePrefix}RVA_Value{_holderTypeDef.Fields.Count}", new FieldSig(GetTypeSigOfValue(value)), FieldAttributes.Static | FieldAttributes.Public | FieldAttributes.InitOnly); var field = new FieldDefUser($"{ConstValues.ObfuzInternalSymbolNamePrefix}RVA_Value{_holderTypeDef.Fields.Count}", new FieldSig(GetTypeSigOfValue(value)), FieldAttributes.Static | FieldAttributes.Public | FieldAttributes.InitOnly);

View File

@ -88,16 +88,12 @@ namespace Obfuz.Data
{ {
if (_rvaTypeDef == null) if (_rvaTypeDef == null)
{ {
_module.EnableTypeDefFindCache = false; using (var scope = new DisableTypeDefFindCacheScope(_module))
//_rvaTypeDef = _module.Find("$ObfuzRVA$", true); {
//if (_rvaTypeDef != null)
//{
// throw new Exception($"can't obfuscate a obfuscated assembly");
//}
ITypeDefOrRef objectTypeRef = _module.Import(typeof(object)); ITypeDefOrRef objectTypeRef = _module.Import(typeof(object));
_rvaTypeDef = new TypeDefUser("$Obfuz$RVA$", objectTypeRef); _rvaTypeDef = new TypeDefUser("$Obfuz$RVA$", objectTypeRef);
_module.Types.Add(_rvaTypeDef); _module.Types.Add(_rvaTypeDef);
_module.EnableTypeDefFindCache = true; }
} }
@ -114,6 +110,9 @@ namespace Obfuz.Data
size = (size + 15) & ~15; // align to 6 bytes size = (size + 15) & ~15; // align to 6 bytes
if (_dataHolderTypeBySizes.TryGetValue(size, out var type)) if (_dataHolderTypeBySizes.TryGetValue(size, out var type))
return type; return type;
using (var scope = new DisableTypeDefFindCacheScope(_module))
{
var dataHolderType = new TypeDefUser($"$ObfuzRVA$DataHolder{size}", _module.Import(typeof(ValueType))); var dataHolderType = new TypeDefUser($"$ObfuzRVA$DataHolder{size}", _module.Import(typeof(ValueType)));
dataHolderType.Attributes = TypeAttributes.Public | TypeAttributes.Sealed; dataHolderType.Attributes = TypeAttributes.Public | TypeAttributes.Sealed;
dataHolderType.Layout = TypeAttributes.ExplicitLayout; dataHolderType.Layout = TypeAttributes.ExplicitLayout;
@ -123,6 +122,7 @@ namespace Obfuz.Data
_module.Types.Add(dataHolderType); _module.Types.Add(dataHolderType);
return dataHolderType; return dataHolderType;
} }
}
private static int AlignTo(int size, int alignment) private static int AlignTo(int size, int alignment)
{ {

View File

@ -106,14 +106,15 @@ namespace Obfuz.ObfusPasses.CallObfus
} }
private TypeDef CreateProxyTypeDef() private TypeDef CreateProxyTypeDef()
{
using (var scope = new DisableTypeDefFindCacheScope(_module))
{ {
var typeDef = new TypeDefUser($"{ConstValues.ObfuzInternalSymbolNamePrefix}ProxyCall", _module.CorLibTypes.Object.ToTypeDefOrRef()); var typeDef = new TypeDefUser($"{ConstValues.ObfuzInternalSymbolNamePrefix}ProxyCall", _module.CorLibTypes.Object.ToTypeDefOrRef());
typeDef.Attributes = TypeAttributes.NotPublic | TypeAttributes.Sealed; typeDef.Attributes = TypeAttributes.NotPublic | TypeAttributes.Sealed;
_module.EnableTypeDefFindCache = false;
_module.Types.Add(typeDef); _module.Types.Add(typeDef);
_module.EnableTypeDefFindCache = true;
return typeDef; return typeDef;
} }
}
private readonly HashSet<string> _uniqueMethodNames = new HashSet<string>(); private readonly HashSet<string> _uniqueMethodNames = new HashSet<string>();

View File

@ -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;
}
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 89640cb831c78f8429c861fb49bae0e7
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: