- 修复 RvaDataAllocator::GetDataHolderType 创建TypeDefUser未disableTypeDefFindCache的bug
- 使用 DisableTypeDefFindCacheScope 重构创建TypeDef类型自动disable和enable TypeDefFindCache1.x
parent
a61f31e289
commit
6226c3a867
|
@ -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);
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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>();
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
fileFormatVersion: 2
|
||||
guid: 89640cb831c78f8429c861fb49bae0e7
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
Loading…
Reference in New Issue