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

View File

@ -106,14 +106,15 @@ namespace Obfuz.ObfusPasses.CallObfus
}
private TypeDef CreateProxyTypeDef()
{
using (var scope = new DisableTypeDefFindCacheScope(_module))
{
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;
}
}
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: