支持动态和静态secret
parent
a171592172
commit
0efdd5b213
|
@ -18,10 +18,12 @@ namespace Obfuz.Data
|
||||||
public class ModuleConstFieldAllocator : IGroupByModuleEntity
|
public class ModuleConstFieldAllocator : IGroupByModuleEntity
|
||||||
{
|
{
|
||||||
private ModuleDef _module;
|
private ModuleDef _module;
|
||||||
private readonly RandomCreator _randomCreator;
|
private readonly EncryptionScopeProvider _encryptionScopeProvider;
|
||||||
private readonly IEncryptor _encryptor;
|
|
||||||
private readonly RvaDataAllocator _rvaDataAllocator;
|
private readonly RvaDataAllocator _rvaDataAllocator;
|
||||||
private readonly GroupByModuleEntityManager _moduleEntityManager;
|
private readonly GroupByModuleEntityManager _moduleEntityManager;
|
||||||
|
private EncryptionScopeInfo _encryptionScope;
|
||||||
|
private RandomCreator _randomCreator;
|
||||||
|
private IEncryptor _encryptor;
|
||||||
|
|
||||||
private TypeDef _holderTypeDef;
|
private TypeDef _holderTypeDef;
|
||||||
|
|
||||||
|
@ -60,10 +62,9 @@ namespace Obfuz.Data
|
||||||
private bool _done;
|
private bool _done;
|
||||||
|
|
||||||
|
|
||||||
public ModuleConstFieldAllocator(IEncryptor encryptor, RandomCreator randomCreator, RvaDataAllocator rvaDataAllocator, GroupByModuleEntityManager moduleEntityManager)
|
public ModuleConstFieldAllocator(EncryptionScopeProvider encryptionScopeProvider, RvaDataAllocator rvaDataAllocator, GroupByModuleEntityManager moduleEntityManager)
|
||||||
{
|
{
|
||||||
_encryptor = encryptor;
|
_encryptionScopeProvider = encryptionScopeProvider;
|
||||||
_randomCreator = randomCreator;
|
|
||||||
_rvaDataAllocator = rvaDataAllocator;
|
_rvaDataAllocator = rvaDataAllocator;
|
||||||
_moduleEntityManager = moduleEntityManager;
|
_moduleEntityManager = moduleEntityManager;
|
||||||
}
|
}
|
||||||
|
@ -71,6 +72,9 @@ namespace Obfuz.Data
|
||||||
public void Init(ModuleDef mod)
|
public void Init(ModuleDef mod)
|
||||||
{
|
{
|
||||||
_module = mod;
|
_module = mod;
|
||||||
|
_encryptionScope = _encryptionScopeProvider.GetScope(mod);
|
||||||
|
_randomCreator = _encryptionScope.localRandomCreator;
|
||||||
|
_encryptor = _encryptionScope.encryptor;
|
||||||
}
|
}
|
||||||
|
|
||||||
const int maxFieldCount = 1000;
|
const int maxFieldCount = 1000;
|
||||||
|
@ -283,22 +287,20 @@ namespace Obfuz.Data
|
||||||
|
|
||||||
public class ConstFieldAllocator
|
public class ConstFieldAllocator
|
||||||
{
|
{
|
||||||
private readonly IEncryptor _encryptor;
|
private readonly EncryptionScopeProvider _encryptionScopeProvider;
|
||||||
private readonly RandomCreator _randomCreator;
|
|
||||||
private readonly RvaDataAllocator _rvaDataAllocator;
|
private readonly RvaDataAllocator _rvaDataAllocator;
|
||||||
private readonly GroupByModuleEntityManager _moduleEntityManager;
|
private readonly GroupByModuleEntityManager _moduleEntityManager;
|
||||||
|
|
||||||
public ConstFieldAllocator(IEncryptor encryptor, RandomCreator randomCreator, RvaDataAllocator rvaDataAllocator, GroupByModuleEntityManager moduleEntityManager)
|
public ConstFieldAllocator(EncryptionScopeProvider encryptionScopeProvider, RvaDataAllocator rvaDataAllocator, GroupByModuleEntityManager moduleEntityManager)
|
||||||
{
|
{
|
||||||
_encryptor = encryptor;
|
_encryptionScopeProvider = encryptionScopeProvider;
|
||||||
_randomCreator = randomCreator;
|
|
||||||
_rvaDataAllocator = rvaDataAllocator;
|
_rvaDataAllocator = rvaDataAllocator;
|
||||||
_moduleEntityManager = moduleEntityManager;
|
_moduleEntityManager = moduleEntityManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
private ModuleConstFieldAllocator GetModuleAllocator(ModuleDef mod)
|
private ModuleConstFieldAllocator GetModuleAllocator(ModuleDef mod)
|
||||||
{
|
{
|
||||||
return _moduleEntityManager.GetEntity<ModuleConstFieldAllocator>(mod, () => new ModuleConstFieldAllocator(_encryptor, _randomCreator, _rvaDataAllocator, _moduleEntityManager));
|
return _moduleEntityManager.GetEntity<ModuleConstFieldAllocator>(mod, () => new ModuleConstFieldAllocator(_encryptionScopeProvider, _rvaDataAllocator, _moduleEntityManager));
|
||||||
}
|
}
|
||||||
|
|
||||||
public FieldDef Allocate(ModuleDef mod, int value)
|
public FieldDef Allocate(ModuleDef mod, int value)
|
||||||
|
|
|
@ -31,10 +31,12 @@ namespace Obfuz.Data
|
||||||
const int maxRvaDataSize = 0x1000;
|
const int maxRvaDataSize = 0x1000;
|
||||||
|
|
||||||
private ModuleDef _module;
|
private ModuleDef _module;
|
||||||
private readonly IRandom _random;
|
private readonly EncryptionScopeProvider _encryptionScopeProvider;
|
||||||
private readonly IEncryptor _encryptor;
|
|
||||||
private readonly GroupByModuleEntityManager _moduleEntityManager;
|
private readonly GroupByModuleEntityManager _moduleEntityManager;
|
||||||
|
|
||||||
|
private EncryptionScopeInfo _encryptionScope;
|
||||||
|
private IRandom _random;
|
||||||
|
|
||||||
class RvaField
|
class RvaField
|
||||||
{
|
{
|
||||||
public FieldDef holderDataField;
|
public FieldDef holderDataField;
|
||||||
|
@ -71,16 +73,17 @@ namespace Obfuz.Data
|
||||||
private readonly Dictionary<int, TypeDef> _dataHolderTypeBySizes = new Dictionary<int, TypeDef>();
|
private readonly Dictionary<int, TypeDef> _dataHolderTypeBySizes = new Dictionary<int, TypeDef>();
|
||||||
private bool _done;
|
private bool _done;
|
||||||
|
|
||||||
public ModuleRvaDataAllocator(IRandom random, IEncryptor encryptor, GroupByModuleEntityManager moduleEntityManager)
|
public ModuleRvaDataAllocator(EncryptionScopeProvider encryptionScopeProvider, GroupByModuleEntityManager moduleEntityManager)
|
||||||
{
|
{
|
||||||
_random = random;
|
_encryptionScopeProvider = encryptionScopeProvider;
|
||||||
_encryptor = encryptor;
|
|
||||||
_moduleEntityManager = moduleEntityManager;
|
_moduleEntityManager = moduleEntityManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void Init(ModuleDef mod)
|
public override void Init(ModuleDef mod)
|
||||||
{
|
{
|
||||||
_module = mod;
|
_module = mod;
|
||||||
|
_encryptionScope = _encryptionScopeProvider.GetScope(mod);
|
||||||
|
_random = _encryptionScope.localRandomCreator(HashUtil.ComputeHash(mod.Name));
|
||||||
}
|
}
|
||||||
|
|
||||||
private (FieldDef, FieldDef) CreateDataHolderRvaField(TypeDef dataHolderType)
|
private (FieldDef, FieldDef) CreateDataHolderRvaField(TypeDef dataHolderType)
|
||||||
|
@ -277,7 +280,7 @@ namespace Obfuz.Data
|
||||||
field.FillPaddingToEnd();
|
field.FillPaddingToEnd();
|
||||||
}
|
}
|
||||||
byte[] data = field.bytes.ToArray();
|
byte[] data = field.bytes.ToArray();
|
||||||
_encryptor.EncryptBlock(data, field.encryptionOps, field.salt);
|
_encryptionScope.encryptor.EncryptBlock(data, field.encryptionOps, field.salt);
|
||||||
field.holderDataField.InitialValue = data;
|
field.holderDataField.InitialValue = data;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -296,21 +299,18 @@ namespace Obfuz.Data
|
||||||
|
|
||||||
public class RvaDataAllocator
|
public class RvaDataAllocator
|
||||||
{
|
{
|
||||||
|
private readonly EncryptionScopeProvider _encryptionScopeProvider;
|
||||||
private readonly IRandom _random;
|
|
||||||
private readonly IEncryptor _encryptor;
|
|
||||||
private readonly GroupByModuleEntityManager _moduleEntityManager;
|
private readonly GroupByModuleEntityManager _moduleEntityManager;
|
||||||
|
|
||||||
public RvaDataAllocator(IRandom random, IEncryptor encryptor, GroupByModuleEntityManager moduleEntityManager)
|
public RvaDataAllocator(EncryptionScopeProvider encryptionScopeProvider, GroupByModuleEntityManager moduleEntityManager)
|
||||||
{
|
{
|
||||||
_random = random;
|
_encryptionScopeProvider = encryptionScopeProvider;
|
||||||
_encryptor = encryptor;
|
|
||||||
_moduleEntityManager = moduleEntityManager;
|
_moduleEntityManager = moduleEntityManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
private ModuleRvaDataAllocator GetModuleRvaDataAllocator(ModuleDef mod)
|
private ModuleRvaDataAllocator GetModuleRvaDataAllocator(ModuleDef mod)
|
||||||
{
|
{
|
||||||
return _moduleEntityManager.GetEntity<ModuleRvaDataAllocator>(mod, () => new ModuleRvaDataAllocator(_random, _encryptor, _moduleEntityManager));
|
return _moduleEntityManager.GetEntity<ModuleRvaDataAllocator>(mod, () => new ModuleRvaDataAllocator(_encryptionScopeProvider, _moduleEntityManager));
|
||||||
}
|
}
|
||||||
|
|
||||||
public RvaData Allocate(ModuleDef mod, int value)
|
public RvaData Allocate(ModuleDef mod, int value)
|
||||||
|
|
|
@ -17,7 +17,6 @@ namespace Obfuz.ObfusPasses.CallObfus
|
||||||
{
|
{
|
||||||
private readonly List<string> _configFiles;
|
private readonly List<string> _configFiles;
|
||||||
private readonly int _obfuscationLevel;
|
private readonly int _obfuscationLevel;
|
||||||
private IEncryptor _encryptor;
|
|
||||||
private IObfuscator _dynamicProxyObfuscator;
|
private IObfuscator _dynamicProxyObfuscator;
|
||||||
private IObfuscationPolicy _dynamicProxyPolicy;
|
private IObfuscationPolicy _dynamicProxyPolicy;
|
||||||
|
|
||||||
|
@ -37,8 +36,7 @@ namespace Obfuz.ObfusPasses.CallObfus
|
||||||
public override void Start()
|
public override void Start()
|
||||||
{
|
{
|
||||||
var ctx = ObfuscationPassContext.Current;
|
var ctx = ObfuscationPassContext.Current;
|
||||||
_encryptor = ctx.encryptor;
|
_dynamicProxyObfuscator = new DefaultCallProxyObfuscator(ctx.encryptionScopeProvider, ctx.constFieldAllocator, ctx.moduleEntityManager, _obfuscationLevel);
|
||||||
_dynamicProxyObfuscator = new DefaultCallProxyObfuscator(ctx.localRandomCreator, _encryptor, ctx.constFieldAllocator, ctx.moduleEntityManager, _obfuscationLevel);
|
|
||||||
_dynamicProxyPolicy = new ConfigurableObfuscationPolicy(ctx.toObfuscatedAssemblyNames, _configFiles);
|
_dynamicProxyPolicy = new ConfigurableObfuscationPolicy(ctx.toObfuscatedAssemblyNames, _configFiles);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -34,9 +34,10 @@ namespace Obfuz.ObfusPasses.CallObfus
|
||||||
class ModuleCallProxyAllocator : IGroupByModuleEntity
|
class ModuleCallProxyAllocator : IGroupByModuleEntity
|
||||||
{
|
{
|
||||||
private ModuleDef _module;
|
private ModuleDef _module;
|
||||||
private readonly RandomCreator _randomCreator;
|
private readonly EncryptionScopeProvider _encryptionScopeProvider;
|
||||||
private readonly IEncryptor _encryptor;
|
|
||||||
private readonly int _encryptionLevel;
|
private readonly int _encryptionLevel;
|
||||||
|
|
||||||
|
private EncryptionScopeInfo _encryptionScope;
|
||||||
private bool _done;
|
private bool _done;
|
||||||
|
|
||||||
class MethodKey : IEquatable<MethodKey>
|
class MethodKey : IEquatable<MethodKey>
|
||||||
|
@ -95,16 +96,16 @@ namespace Obfuz.ObfusPasses.CallObfus
|
||||||
|
|
||||||
private TypeDef _proxyTypeDef;
|
private TypeDef _proxyTypeDef;
|
||||||
|
|
||||||
public ModuleCallProxyAllocator(RandomCreator randomCreator, IEncryptor encryptor, int encryptionLevel)
|
public ModuleCallProxyAllocator(EncryptionScopeProvider encryptionScopeProvider, int encryptionLevel)
|
||||||
{
|
{
|
||||||
_randomCreator = randomCreator;
|
_encryptionScopeProvider = encryptionScopeProvider;
|
||||||
_encryptor = encryptor;
|
|
||||||
_encryptionLevel = encryptionLevel;
|
_encryptionLevel = encryptionLevel;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Init(ModuleDef mod)
|
public void Init(ModuleDef mod)
|
||||||
{
|
{
|
||||||
_module = mod;
|
_module = mod;
|
||||||
|
_encryptionScope = _encryptionScopeProvider.GetScope(mod);
|
||||||
}
|
}
|
||||||
|
|
||||||
private TypeDef CreateProxyTypeDef()
|
private TypeDef CreateProxyTypeDef()
|
||||||
|
@ -160,7 +161,7 @@ namespace Obfuz.ObfusPasses.CallObfus
|
||||||
|
|
||||||
private int GenerateEncryptOps(IRandom random)
|
private int GenerateEncryptOps(IRandom random)
|
||||||
{
|
{
|
||||||
return EncryptionUtil.GenerateEncryptionOpCodes(random, _encryptor, _encryptionLevel);
|
return EncryptionUtil.GenerateEncryptionOpCodes(random, _encryptionScope.encryptor, _encryptionLevel);
|
||||||
}
|
}
|
||||||
|
|
||||||
private DispatchMethodInfo GetDispatchMethod(IMethod method)
|
private DispatchMethodInfo GetDispatchMethod(IMethod method)
|
||||||
|
@ -185,7 +186,7 @@ namespace Obfuz.ObfusPasses.CallObfus
|
||||||
private IRandom CreateRandomForMethod(IMethod method, bool callVir)
|
private IRandom CreateRandomForMethod(IMethod method, bool callVir)
|
||||||
{
|
{
|
||||||
int seed = MethodEqualityComparer.CompareDeclaringTypes.GetHashCode(method);
|
int seed = MethodEqualityComparer.CompareDeclaringTypes.GetHashCode(method);
|
||||||
return _randomCreator(seed);
|
return _encryptionScope.localRandomCreator(seed);
|
||||||
}
|
}
|
||||||
|
|
||||||
public ProxyCallMethodData Allocate(IMethod method, bool callVir)
|
public ProxyCallMethodData Allocate(IMethod method, bool callVir)
|
||||||
|
@ -203,7 +204,7 @@ namespace Obfuz.ObfusPasses.CallObfus
|
||||||
IRandom localRandom = CreateRandomForMethod(method, callVir);
|
IRandom localRandom = CreateRandomForMethod(method, callVir);
|
||||||
int encryptOps = GenerateEncryptOps(localRandom);
|
int encryptOps = GenerateEncryptOps(localRandom);
|
||||||
int salt = GenerateSalt(localRandom);
|
int salt = GenerateSalt(localRandom);
|
||||||
int encryptedIndex = _encryptor.Encrypt(index, encryptOps, salt);
|
int encryptedIndex = _encryptionScope.encryptor.Encrypt(index, encryptOps, salt);
|
||||||
proxyInfo = new MethodProxyInfo()
|
proxyInfo = new MethodProxyInfo()
|
||||||
{
|
{
|
||||||
proxyMethod = methodDispatcher.methodDef,
|
proxyMethod = methodDispatcher.methodDef,
|
||||||
|
@ -259,22 +260,20 @@ namespace Obfuz.ObfusPasses.CallObfus
|
||||||
|
|
||||||
public class CallProxyAllocator
|
public class CallProxyAllocator
|
||||||
{
|
{
|
||||||
private readonly RandomCreator _randomCreator;
|
private readonly EncryptionScopeProvider _encryptionScopeProvider;
|
||||||
private readonly IEncryptor _encryptor;
|
|
||||||
private GroupByModuleEntityManager _moduleEntityManager;
|
private GroupByModuleEntityManager _moduleEntityManager;
|
||||||
private readonly int _encryptionLevel;
|
private readonly int _encryptionLevel;
|
||||||
|
|
||||||
public CallProxyAllocator(RandomCreator randomCreator, IEncryptor encryptor, GroupByModuleEntityManager moduleEntityManager, int encryptionLevel)
|
public CallProxyAllocator(EncryptionScopeProvider encryptionScopeProvider, GroupByModuleEntityManager moduleEntityManager, int encryptionLevel)
|
||||||
{
|
{
|
||||||
_randomCreator = randomCreator;
|
_encryptionScopeProvider = encryptionScopeProvider;
|
||||||
_encryptor = encryptor;
|
|
||||||
_moduleEntityManager = moduleEntityManager;
|
_moduleEntityManager = moduleEntityManager;
|
||||||
_encryptionLevel = encryptionLevel;
|
_encryptionLevel = encryptionLevel;
|
||||||
}
|
}
|
||||||
|
|
||||||
private ModuleCallProxyAllocator GetModuleAllocator(ModuleDef mod)
|
private ModuleCallProxyAllocator GetModuleAllocator(ModuleDef mod)
|
||||||
{
|
{
|
||||||
return _moduleEntityManager.GetEntity<ModuleCallProxyAllocator>(mod, () => new ModuleCallProxyAllocator(_randomCreator, _encryptor, _encryptionLevel));
|
return _moduleEntityManager.GetEntity<ModuleCallProxyAllocator>(mod, () => new ModuleCallProxyAllocator(_encryptionScopeProvider, _encryptionLevel));
|
||||||
}
|
}
|
||||||
|
|
||||||
public ProxyCallMethodData Allocate(ModuleDef mod, IMethod method, bool callVir)
|
public ProxyCallMethodData Allocate(ModuleDef mod, IMethod method, bool callVir)
|
||||||
|
|
|
@ -10,17 +10,17 @@ namespace Obfuz.ObfusPasses.CallObfus
|
||||||
{
|
{
|
||||||
public class DefaultCallProxyObfuscator : ObfuscatorBase
|
public class DefaultCallProxyObfuscator : ObfuscatorBase
|
||||||
{
|
{
|
||||||
private readonly IEncryptor _encryptor;
|
private readonly EncryptionScopeProvider _encryptionScopeProvider;
|
||||||
private readonly ConstFieldAllocator _constFieldAllocator;
|
private readonly ConstFieldAllocator _constFieldAllocator;
|
||||||
private readonly CallProxyAllocator _proxyCallAllocator;
|
private readonly CallProxyAllocator _proxyCallAllocator;
|
||||||
private readonly GroupByModuleEntityManager _moduleEntityManager;
|
private readonly GroupByModuleEntityManager _moduleEntityManager;
|
||||||
|
|
||||||
public DefaultCallProxyObfuscator(RandomCreator randomCreator, IEncryptor encryptor, ConstFieldAllocator constFieldAllocator, GroupByModuleEntityManager moduleEntityManager, int encryptionLevel)
|
public DefaultCallProxyObfuscator(EncryptionScopeProvider encryptionScopeProvider, ConstFieldAllocator constFieldAllocator, GroupByModuleEntityManager moduleEntityManager, int encryptionLevel)
|
||||||
{
|
{
|
||||||
_encryptor = encryptor;
|
_encryptionScopeProvider = encryptionScopeProvider;
|
||||||
_constFieldAllocator = constFieldAllocator;
|
_constFieldAllocator = constFieldAllocator;
|
||||||
_moduleEntityManager = moduleEntityManager;
|
_moduleEntityManager = moduleEntityManager;
|
||||||
_proxyCallAllocator = new CallProxyAllocator(randomCreator, _encryptor, moduleEntityManager, encryptionLevel);
|
_proxyCallAllocator = new CallProxyAllocator(encryptionScopeProvider, moduleEntityManager, encryptionLevel);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void Done()
|
public override void Done()
|
||||||
|
|
|
@ -31,7 +31,7 @@ namespace Obfuz.ObfusPasses.ConstEncrypt
|
||||||
{
|
{
|
||||||
var ctx = ObfuscationPassContext.Current;
|
var ctx = ObfuscationPassContext.Current;
|
||||||
_dataObfuscatorPolicy = new ConfigurableEncryptPolicy(ctx.toObfuscatedAssemblyNames, _configFiles);
|
_dataObfuscatorPolicy = new ConfigurableEncryptPolicy(ctx.toObfuscatedAssemblyNames, _configFiles);
|
||||||
_dataObfuscator = new DefaultConstEncryptor(ctx.localRandomCreator, ctx.encryptor, ctx.rvaDataAllocator, ctx.constFieldAllocator, ctx.moduleEntityManager, _encryptionLevel);
|
_dataObfuscator = new DefaultConstEncryptor(ctx.encryptionScopeProvider, ctx.rvaDataAllocator, ctx.constFieldAllocator, ctx.moduleEntityManager, _encryptionLevel);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void Stop()
|
public override void Stop()
|
||||||
|
|
|
@ -12,31 +12,29 @@ namespace Obfuz.ObfusPasses.ConstEncrypt
|
||||||
{
|
{
|
||||||
public class DefaultConstEncryptor : IConstEncryptor
|
public class DefaultConstEncryptor : IConstEncryptor
|
||||||
{
|
{
|
||||||
private readonly RandomCreator _randomCreator;
|
private readonly EncryptionScopeProvider _encryptionScopeProvider;
|
||||||
private readonly RvaDataAllocator _rvaDataAllocator;
|
private readonly RvaDataAllocator _rvaDataAllocator;
|
||||||
private readonly ConstFieldAllocator _constFieldAllocator;
|
private readonly ConstFieldAllocator _constFieldAllocator;
|
||||||
private readonly IEncryptor _encryptor;
|
|
||||||
private readonly GroupByModuleEntityManager _moduleEntityManager;
|
private readonly GroupByModuleEntityManager _moduleEntityManager;
|
||||||
private readonly int _encryptionLevel;
|
private readonly int _encryptionLevel;
|
||||||
|
|
||||||
public DefaultConstEncryptor(RandomCreator randomCreator, IEncryptor encryptor, RvaDataAllocator rvaDataAllocator, ConstFieldAllocator constFieldAllocator, GroupByModuleEntityManager moduleEntityManager, int encryptionLevel)
|
public DefaultConstEncryptor(EncryptionScopeProvider encryptionScopeProvider, RvaDataAllocator rvaDataAllocator, ConstFieldAllocator constFieldAllocator, GroupByModuleEntityManager moduleEntityManager, int encryptionLevel)
|
||||||
{
|
{
|
||||||
_randomCreator = randomCreator;
|
_encryptionScopeProvider = encryptionScopeProvider;
|
||||||
_encryptor = encryptor;
|
|
||||||
_rvaDataAllocator = rvaDataAllocator;
|
_rvaDataAllocator = rvaDataAllocator;
|
||||||
_constFieldAllocator = constFieldAllocator;
|
_constFieldAllocator = constFieldAllocator;
|
||||||
_moduleEntityManager = moduleEntityManager;
|
_moduleEntityManager = moduleEntityManager;
|
||||||
_encryptionLevel = encryptionLevel;
|
_encryptionLevel = encryptionLevel;
|
||||||
}
|
}
|
||||||
|
|
||||||
private IRandom CreateRandomForValue(int value)
|
private IRandom CreateRandomForValue(EncryptionScopeInfo encryptionScope, int value)
|
||||||
{
|
{
|
||||||
return _randomCreator(value);
|
return encryptionScope.localRandomCreator(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
private int GenerateEncryptionOperations(IRandom random)
|
private int GenerateEncryptionOperations(EncryptionScopeInfo encryptionScope, IRandom random)
|
||||||
{
|
{
|
||||||
return EncryptionUtil.GenerateEncryptionOpCodes(random, _encryptor, _encryptionLevel);
|
return EncryptionUtil.GenerateEncryptionOpCodes(random, encryptionScope.encryptor, _encryptionLevel);
|
||||||
}
|
}
|
||||||
|
|
||||||
public int GenerateSalt(IRandom random)
|
public int GenerateSalt(IRandom random)
|
||||||
|
@ -58,10 +56,11 @@ namespace Obfuz.ObfusPasses.ConstEncrypt
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
IRandom random = CreateRandomForValue(value.GetHashCode());
|
EncryptionScopeInfo encryptionScope = _encryptionScopeProvider.GetScope(method.Module);
|
||||||
int ops = GenerateEncryptionOperations(random);
|
IRandom random = CreateRandomForValue(encryptionScope, value.GetHashCode());
|
||||||
|
int ops = GenerateEncryptionOperations(encryptionScope, random);
|
||||||
int salt = GenerateSalt(random);
|
int salt = GenerateSalt(random);
|
||||||
int encryptedValue = _encryptor.Encrypt(value, ops, salt);
|
int encryptedValue = encryptionScope.encryptor.Encrypt(value, ops, salt);
|
||||||
RvaData rvaData = _rvaDataAllocator.Allocate(method.Module, encryptedValue);
|
RvaData rvaData = _rvaDataAllocator.Allocate(method.Module, encryptedValue);
|
||||||
|
|
||||||
DefaultMetadataImporter importer = GetModuleMetadataImporter(method);
|
DefaultMetadataImporter importer = GetModuleMetadataImporter(method);
|
||||||
|
@ -81,10 +80,11 @@ namespace Obfuz.ObfusPasses.ConstEncrypt
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
IRandom random = CreateRandomForValue(value.GetHashCode());
|
EncryptionScopeInfo encryptionScope = _encryptionScopeProvider.GetScope(method.Module);
|
||||||
int ops = GenerateEncryptionOperations(random);
|
IRandom random = CreateRandomForValue(encryptionScope, value.GetHashCode());
|
||||||
|
int ops = GenerateEncryptionOperations(encryptionScope, random);
|
||||||
int salt = GenerateSalt(random);
|
int salt = GenerateSalt(random);
|
||||||
long encryptedValue = _encryptor.Encrypt(value, ops, salt);
|
long encryptedValue = encryptionScope.encryptor.Encrypt(value, ops, salt);
|
||||||
RvaData rvaData = _rvaDataAllocator.Allocate(method.Module, encryptedValue);
|
RvaData rvaData = _rvaDataAllocator.Allocate(method.Module, encryptedValue);
|
||||||
|
|
||||||
DefaultMetadataImporter importer = GetModuleMetadataImporter(method);
|
DefaultMetadataImporter importer = GetModuleMetadataImporter(method);
|
||||||
|
@ -104,10 +104,11 @@ namespace Obfuz.ObfusPasses.ConstEncrypt
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
IRandom random = CreateRandomForValue(value.GetHashCode());
|
EncryptionScopeInfo encryptionScope = _encryptionScopeProvider.GetScope(method.Module);
|
||||||
int ops = GenerateEncryptionOperations(random);
|
IRandom random = CreateRandomForValue(encryptionScope, value.GetHashCode());
|
||||||
|
int ops = GenerateEncryptionOperations(encryptionScope, random);
|
||||||
int salt = GenerateSalt(random);
|
int salt = GenerateSalt(random);
|
||||||
float encryptedValue = _encryptor.Encrypt(value, ops, salt);
|
float encryptedValue = encryptionScope.encryptor.Encrypt(value, ops, salt);
|
||||||
RvaData rvaData = _rvaDataAllocator.Allocate(method.Module, encryptedValue);
|
RvaData rvaData = _rvaDataAllocator.Allocate(method.Module, encryptedValue);
|
||||||
|
|
||||||
DefaultMetadataImporter importer = GetModuleMetadataImporter(method);
|
DefaultMetadataImporter importer = GetModuleMetadataImporter(method);
|
||||||
|
@ -127,10 +128,11 @@ namespace Obfuz.ObfusPasses.ConstEncrypt
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
IRandom random = CreateRandomForValue(value.GetHashCode());
|
EncryptionScopeInfo encryptionScope = _encryptionScopeProvider.GetScope(method.Module);
|
||||||
int ops = GenerateEncryptionOperations(random);
|
IRandom random = CreateRandomForValue(encryptionScope, value.GetHashCode());
|
||||||
|
int ops = GenerateEncryptionOperations(encryptionScope, random);
|
||||||
int salt = GenerateSalt(random);
|
int salt = GenerateSalt(random);
|
||||||
double encryptedValue = _encryptor.Encrypt(value, ops, salt);
|
double encryptedValue = encryptionScope.encryptor.Encrypt(value, ops, salt);
|
||||||
RvaData rvaData = _rvaDataAllocator.Allocate(method.Module, encryptedValue);
|
RvaData rvaData = _rvaDataAllocator.Allocate(method.Module, encryptedValue);
|
||||||
|
|
||||||
DefaultMetadataImporter importer = GetModuleMetadataImporter(method);
|
DefaultMetadataImporter importer = GetModuleMetadataImporter(method);
|
||||||
|
@ -176,11 +178,12 @@ namespace Obfuz.ObfusPasses.ConstEncrypt
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
IRandom random = CreateRandomForValue(HashUtil.ComputeHash(value));
|
EncryptionScopeInfo encryptionScope = _encryptionScopeProvider.GetScope(method.Module);
|
||||||
int ops = GenerateEncryptionOperations(random);
|
IRandom random = CreateRandomForValue(encryptionScope, value.GetHashCode());
|
||||||
|
int ops = GenerateEncryptionOperations(encryptionScope, random);
|
||||||
int salt = GenerateSalt(random);
|
int salt = GenerateSalt(random);
|
||||||
int stringByteLength = Encoding.UTF8.GetByteCount(value);
|
int stringByteLength = Encoding.UTF8.GetByteCount(value);
|
||||||
byte[] encryptedValue = _encryptor.Encrypt(value, ops, salt);
|
byte[] encryptedValue = encryptionScope.encryptor.Encrypt(value, ops, salt);
|
||||||
Assert.IsTrue(encryptedValue.Length % 4 == 0);
|
Assert.IsTrue(encryptedValue.Length % 4 == 0);
|
||||||
RvaData rvaData = _rvaDataAllocator.Allocate(method.Module, encryptedValue);
|
RvaData rvaData = _rvaDataAllocator.Allocate(method.Module, encryptedValue);
|
||||||
|
|
||||||
|
|
|
@ -12,15 +12,13 @@ namespace Obfuz.ObfusPasses.FieldEncrypt
|
||||||
{
|
{
|
||||||
public class DefaultFieldEncryptor : FieldEncryptorBase
|
public class DefaultFieldEncryptor : FieldEncryptorBase
|
||||||
{
|
{
|
||||||
private readonly RandomCreator _randomCreator;
|
private readonly EncryptionScopeProvider _encryptionScopeProvider;
|
||||||
private readonly IEncryptor _encryptor;
|
|
||||||
private readonly GroupByModuleEntityManager _moduleEntityManager;
|
private readonly GroupByModuleEntityManager _moduleEntityManager;
|
||||||
private readonly int _encryptionLevel;
|
private readonly int _encryptionLevel;
|
||||||
|
|
||||||
public DefaultFieldEncryptor(RandomCreator randomCreator, IEncryptor encryptor, GroupByModuleEntityManager moduleEntityManager, int encryptionLevel)
|
public DefaultFieldEncryptor(EncryptionScopeProvider encryptionScopeProvider, GroupByModuleEntityManager moduleEntityManager, int encryptionLevel)
|
||||||
{
|
{
|
||||||
_randomCreator = randomCreator;
|
_encryptionScopeProvider = encryptionScopeProvider;
|
||||||
_encryptor = encryptor;
|
|
||||||
_moduleEntityManager = moduleEntityManager;
|
_moduleEntityManager = moduleEntityManager;
|
||||||
_encryptionLevel = encryptionLevel;
|
_encryptionLevel = encryptionLevel;
|
||||||
}
|
}
|
||||||
|
@ -41,32 +39,32 @@ namespace Obfuz.ObfusPasses.FieldEncrypt
|
||||||
private readonly Dictionary<FieldDef, FieldEncryptInfo> _fieldEncryptInfoCache = new Dictionary<FieldDef, FieldEncryptInfo>();
|
private readonly Dictionary<FieldDef, FieldEncryptInfo> _fieldEncryptInfoCache = new Dictionary<FieldDef, FieldEncryptInfo>();
|
||||||
|
|
||||||
|
|
||||||
private long CalcXorValueForZero(ElementType type, int encryptOps, int salt)
|
private long CalcXorValueForZero(IEncryptor encryptor, ElementType type, int encryptOps, int salt)
|
||||||
{
|
{
|
||||||
switch (type)
|
switch (type)
|
||||||
{
|
{
|
||||||
case ElementType.I4:
|
case ElementType.I4:
|
||||||
case ElementType.U4:
|
case ElementType.U4:
|
||||||
case ElementType.R4:
|
case ElementType.R4:
|
||||||
return _encryptor.Encrypt(0, encryptOps, salt);
|
return encryptor.Encrypt(0, encryptOps, salt);
|
||||||
case ElementType.I8:
|
case ElementType.I8:
|
||||||
case ElementType.U8:
|
case ElementType.U8:
|
||||||
case ElementType.R8:
|
case ElementType.R8:
|
||||||
return _encryptor.Encrypt(0L, encryptOps, salt);
|
return encryptor.Encrypt(0L, encryptOps, salt);
|
||||||
default:
|
default:
|
||||||
throw new NotSupportedException($"Unsupported field type: {type} for encryption");
|
throw new NotSupportedException($"Unsupported field type: {type} for encryption");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private IRandom CreateRandomForField(FieldDef field)
|
private IRandom CreateRandomForField(RandomCreator randomCreator, FieldDef field)
|
||||||
{
|
{
|
||||||
return _randomCreator(FieldEqualityComparer.CompareDeclaringTypes.GetHashCode(field));
|
return randomCreator(FieldEqualityComparer.CompareDeclaringTypes.GetHashCode(field));
|
||||||
}
|
}
|
||||||
|
|
||||||
private int GenerateEncryptionOperations(IRandom random)
|
private int GenerateEncryptionOperations(IRandom random, IEncryptor encryptor)
|
||||||
{
|
{
|
||||||
return EncryptionUtil.GenerateEncryptionOpCodes(random, _encryptor, _encryptionLevel);
|
return EncryptionUtil.GenerateEncryptionOpCodes(random, encryptor, _encryptionLevel);
|
||||||
}
|
}
|
||||||
|
|
||||||
public int GenerateSalt(IRandom random)
|
public int GenerateSalt(IRandom random)
|
||||||
|
@ -80,12 +78,14 @@ namespace Obfuz.ObfusPasses.FieldEncrypt
|
||||||
{
|
{
|
||||||
return info;
|
return info;
|
||||||
}
|
}
|
||||||
|
EncryptionScopeInfo encryptionScope = _encryptionScopeProvider.GetScope(field.Module);
|
||||||
|
|
||||||
IRandom random = CreateRandomForField(field);
|
IRandom random = CreateRandomForField(encryptionScope.localRandomCreator, field);
|
||||||
int encryptOps = GenerateEncryptionOperations(random);
|
IEncryptor encryptor = encryptionScope.encryptor;
|
||||||
|
int encryptOps = GenerateEncryptionOperations(random, encryptor);
|
||||||
int salt = GenerateSalt(random);
|
int salt = GenerateSalt(random);
|
||||||
ElementType fieldType = field.FieldSig.Type.RemovePinnedAndModifiers().ElementType;
|
ElementType fieldType = field.FieldSig.Type.RemovePinnedAndModifiers().ElementType;
|
||||||
long xorValueForZero = CalcXorValueForZero(fieldType, encryptOps, salt);
|
long xorValueForZero = CalcXorValueForZero(encryptor, fieldType, encryptOps, salt);
|
||||||
|
|
||||||
info = new FieldEncryptInfo
|
info = new FieldEncryptInfo
|
||||||
{
|
{
|
||||||
|
|
|
@ -30,7 +30,7 @@ namespace Obfuz.ObfusPasses.FieldEncrypt
|
||||||
public override void Start()
|
public override void Start()
|
||||||
{
|
{
|
||||||
var ctx = ObfuscationPassContext.Current;
|
var ctx = ObfuscationPassContext.Current;
|
||||||
_memoryEncryptor = new DefaultFieldEncryptor(ctx.localRandomCreator, ctx.encryptor, ctx.moduleEntityManager, _encryptionLevel);
|
_memoryEncryptor = new DefaultFieldEncryptor(ctx.encryptionScopeProvider, ctx.moduleEntityManager, _encryptionLevel);
|
||||||
_encryptionPolicy = new ConfigurableEncryptPolicy(ctx.toObfuscatedAssemblyNames, _configFiles);
|
_encryptionPolicy = new ConfigurableEncryptPolicy(ctx.toObfuscatedAssemblyNames, _configFiles);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -14,6 +14,48 @@ namespace Obfuz
|
||||||
{
|
{
|
||||||
public delegate IRandom RandomCreator(int seed);
|
public delegate IRandom RandomCreator(int seed);
|
||||||
|
|
||||||
|
public class EncryptionScopeInfo
|
||||||
|
{
|
||||||
|
public readonly byte[] byteSecret;
|
||||||
|
public readonly int[] intSecret;
|
||||||
|
public readonly IEncryptor encryptor;
|
||||||
|
public readonly RandomCreator localRandomCreator;
|
||||||
|
|
||||||
|
public EncryptionScopeInfo(byte[] byteSecret, int[] intSecret, IEncryptor encryptor, RandomCreator localRandomCreator)
|
||||||
|
{
|
||||||
|
this.byteSecret = byteSecret;
|
||||||
|
this.intSecret = intSecret;
|
||||||
|
this.encryptor = encryptor;
|
||||||
|
this.localRandomCreator = localRandomCreator;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class EncryptionScopeProvider
|
||||||
|
{
|
||||||
|
private readonly EncryptionScopeInfo _defaultStaticScope;
|
||||||
|
private readonly EncryptionScopeInfo _defaultDynamicScope;
|
||||||
|
private readonly HashSet<string> _dynamicSecretAssemblyNames;
|
||||||
|
|
||||||
|
public EncryptionScopeProvider(EncryptionScopeInfo defaultStaticScope, EncryptionScopeInfo defaultDynamicScope, HashSet<string> dynamicSecretAssemblyNames)
|
||||||
|
{
|
||||||
|
_defaultStaticScope = defaultStaticScope;
|
||||||
|
_defaultDynamicScope = defaultDynamicScope;
|
||||||
|
_dynamicSecretAssemblyNames = dynamicSecretAssemblyNames;
|
||||||
|
}
|
||||||
|
|
||||||
|
public EncryptionScopeInfo GetScope(ModuleDef module)
|
||||||
|
{
|
||||||
|
if (_dynamicSecretAssemblyNames.Contains(module.Assembly.Name))
|
||||||
|
{
|
||||||
|
return _defaultDynamicScope;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return _defaultStaticScope;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public class ObfuscationPassContext
|
public class ObfuscationPassContext
|
||||||
{
|
{
|
||||||
public static ObfuscationPassContext Current { get; set; }
|
public static ObfuscationPassContext Current { get; set; }
|
||||||
|
@ -31,10 +73,7 @@ namespace Obfuz
|
||||||
|
|
||||||
public string obfuscatedAssemblyOutputDir;
|
public string obfuscatedAssemblyOutputDir;
|
||||||
|
|
||||||
public IRandom globalRandom;
|
public EncryptionScopeProvider encryptionScopeProvider;
|
||||||
public RandomCreator localRandomCreator;
|
|
||||||
|
|
||||||
public IEncryptor encryptor;
|
|
||||||
public ConstFieldAllocator constFieldAllocator;
|
public ConstFieldAllocator constFieldAllocator;
|
||||||
public RvaDataAllocator rvaDataAllocator;
|
public RvaDataAllocator rvaDataAllocator;
|
||||||
public NotObfuscatedMethodWhiteList whiteList;
|
public NotObfuscatedMethodWhiteList whiteList;
|
||||||
|
|
|
@ -31,8 +31,13 @@ namespace Obfuz
|
||||||
|
|
||||||
private readonly Pipeline _pipeline1 = new Pipeline();
|
private readonly Pipeline _pipeline1 = new Pipeline();
|
||||||
private readonly Pipeline _pipeline2 = new Pipeline();
|
private readonly Pipeline _pipeline2 = new Pipeline();
|
||||||
private readonly byte[] _byteSecret;
|
|
||||||
private readonly int[] _intSecret;
|
private readonly byte[] _defaultStaticByteSecret;
|
||||||
|
private readonly int[] _defaultStaticIntSecret;
|
||||||
|
private readonly byte[] _defaultDynamicByteSecret;
|
||||||
|
private readonly int[] _defaultDynamicIntSecret;
|
||||||
|
private readonly HashSet<string> _dynamicSecretAssemblyNames;
|
||||||
|
|
||||||
private readonly int _randomSeed;
|
private readonly int _randomSeed;
|
||||||
private readonly string _encryptionVmGenerationSecret;
|
private readonly string _encryptionVmGenerationSecret;
|
||||||
private readonly int _encryptionVmOpCodeCount;
|
private readonly int _encryptionVmOpCodeCount;
|
||||||
|
@ -42,9 +47,15 @@ namespace Obfuz
|
||||||
|
|
||||||
public Obfuscator(ObfuscatorBuilder builder)
|
public Obfuscator(ObfuscatorBuilder builder)
|
||||||
{
|
{
|
||||||
_byteSecret = KeyGenerator.GenerateKey(builder.Secret, VirtualMachine.SecretKeyLength);
|
_defaultStaticByteSecret = KeyGenerator.GenerateKey(builder.DefaultStaticSecret, VirtualMachine.SecretKeyLength);
|
||||||
_intSecret = KeyGenerator.ConvertToIntKey(_byteSecret);
|
_defaultStaticIntSecret = KeyGenerator.ConvertToIntKey(_defaultStaticByteSecret);
|
||||||
SaveKey(_byteSecret, builder.SecretOutputPath);
|
SaveKey(_defaultStaticByteSecret, builder.DefaultStaticSecretOutputPath);
|
||||||
|
_defaultDynamicByteSecret = KeyGenerator.GenerateKey(builder.DefaultDynamicSecret, VirtualMachine.SecretKeyLength);
|
||||||
|
_defaultDynamicIntSecret = KeyGenerator.ConvertToIntKey(_defaultDynamicByteSecret);
|
||||||
|
SaveKey(_defaultDynamicByteSecret, builder.DefaultDynamicSecretOutputPath);
|
||||||
|
_dynamicSecretAssemblyNames = new HashSet<string>(builder.DynamicSecretAssemblyNames);
|
||||||
|
|
||||||
|
|
||||||
_randomSeed = builder.RandomSeed;
|
_randomSeed = builder.RandomSeed;
|
||||||
_encryptionVmGenerationSecret = builder.EncryptionVmGenerationSecretKey;
|
_encryptionVmGenerationSecret = builder.EncryptionVmGenerationSecretKey;
|
||||||
_encryptionVmOpCodeCount = builder.EncryptionVmOpCodeCount;
|
_encryptionVmOpCodeCount = builder.EncryptionVmOpCodeCount;
|
||||||
|
@ -98,7 +109,7 @@ namespace Obfuz
|
||||||
OnPostObfuscation(pipeline);
|
OnPostObfuscation(pipeline);
|
||||||
}
|
}
|
||||||
|
|
||||||
private IEncryptor CreateEncryptionVirtualMachine()
|
private IEncryptor CreateEncryptionVirtualMachine(byte[] secret)
|
||||||
{
|
{
|
||||||
var vmCreator = new VirtualMachineCreator(_encryptionVmGenerationSecret);
|
var vmCreator = new VirtualMachineCreator(_encryptionVmGenerationSecret);
|
||||||
var vm = vmCreator.CreateVirtualMachine(_encryptionVmOpCodeCount);
|
var vm = vmCreator.CreateVirtualMachine(_encryptionVmOpCodeCount);
|
||||||
|
@ -112,7 +123,7 @@ namespace Obfuz
|
||||||
{
|
{
|
||||||
throw new Exception($"EncryptionVm CodeFile:`{_encryptionVmCodeFile}` not match with encryptionVM settings! Please run `Obfuz/GenerateVm` to update it!");
|
throw new Exception($"EncryptionVm CodeFile:`{_encryptionVmCodeFile}` not match with encryptionVM settings! Please run `Obfuz/GenerateVm` to update it!");
|
||||||
}
|
}
|
||||||
var vms = new VirtualMachineSimulator(vm, _byteSecret);
|
var vms = new VirtualMachineSimulator(vm, secret);
|
||||||
|
|
||||||
var generatedVmTypes = AppDomain.CurrentDomain.GetAssemblies()
|
var generatedVmTypes = AppDomain.CurrentDomain.GetAssemblies()
|
||||||
.Select(assembly => assembly.GetType("Obfuz.EncryptionVM.GeneratedEncryptionVirtualMachine"))
|
.Select(assembly => assembly.GetType("Obfuz.EncryptionVM.GeneratedEncryptionVirtualMachine"))
|
||||||
|
@ -127,7 +138,7 @@ namespace Obfuz
|
||||||
throw new Exception($"class Obfuz.EncryptionVM.GeneratedEncryptionVirtualMachine found in multiple assemblies! Please retain only one!");
|
throw new Exception($"class Obfuz.EncryptionVM.GeneratedEncryptionVirtualMachine found in multiple assemblies! Please retain only one!");
|
||||||
}
|
}
|
||||||
|
|
||||||
var gvmInstance = (IEncryptor)Activator.CreateInstance(generatedVmTypes[0], new object[] { _byteSecret } );
|
var gvmInstance = (IEncryptor)Activator.CreateInstance(generatedVmTypes[0], new object[] { secret } );
|
||||||
|
|
||||||
VerifyVm(vm, vms, gvmInstance);
|
VerifyVm(vm, vms, gvmInstance);
|
||||||
|
|
||||||
|
@ -241,6 +252,20 @@ namespace Obfuz
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private EncryptionScopeInfo CreateEncryptionScope(byte[] byteSecret, int[] intSecret)
|
||||||
|
{
|
||||||
|
IEncryptor encryption = CreateEncryptionVirtualMachine(byteSecret);
|
||||||
|
RandomCreator localRandomCreator = (seed) => new RandomWithKey(intSecret, _randomSeed ^ seed);
|
||||||
|
return new EncryptionScopeInfo(byteSecret, intSecret, encryption, localRandomCreator);
|
||||||
|
}
|
||||||
|
|
||||||
|
private EncryptionScopeProvider CreateEncryptionScopeProvider()
|
||||||
|
{
|
||||||
|
var defaultStaticScope = CreateEncryptionScope(_defaultStaticByteSecret, _defaultStaticIntSecret);
|
||||||
|
var defaultDynamicScope = CreateEncryptionScope(_defaultDynamicByteSecret, _defaultDynamicIntSecret);
|
||||||
|
return new EncryptionScopeProvider(defaultStaticScope, defaultDynamicScope, _dynamicSecretAssemblyNames);
|
||||||
|
}
|
||||||
|
|
||||||
private void OnPreObfuscation(Pipeline pipeline)
|
private void OnPreObfuscation(Pipeline pipeline)
|
||||||
{
|
{
|
||||||
AssemblyCache assemblyCache = new AssemblyCache(new PathAssemblyResolver(_assemblySearchDirs.ToArray()));
|
AssemblyCache assemblyCache = new AssemblyCache(new PathAssemblyResolver(_assemblySearchDirs.ToArray()));
|
||||||
|
@ -248,12 +273,10 @@ namespace Obfuz
|
||||||
List<ModuleDef> obfuscatedAndNotObfuscatedModules = new List<ModuleDef>();
|
List<ModuleDef> obfuscatedAndNotObfuscatedModules = new List<ModuleDef>();
|
||||||
LoadAssemblies(assemblyCache, toObfuscatedModules, obfuscatedAndNotObfuscatedModules);
|
LoadAssemblies(assemblyCache, toObfuscatedModules, obfuscatedAndNotObfuscatedModules);
|
||||||
|
|
||||||
var random = new RandomWithKey(_intSecret, _randomSeed);
|
EncryptionScopeProvider encryptionScopeProvider = CreateEncryptionScopeProvider();
|
||||||
RandomCreator localRandomCreator = (seed) => new RandomWithKey(_intSecret, _randomSeed ^ seed);
|
|
||||||
var encryptor = CreateEncryptionVirtualMachine();
|
|
||||||
var moduleEntityManager = new GroupByModuleEntityManager();
|
var moduleEntityManager = new GroupByModuleEntityManager();
|
||||||
var rvaDataAllocator = new RvaDataAllocator(random, encryptor, moduleEntityManager);
|
var rvaDataAllocator = new RvaDataAllocator(encryptionScopeProvider, moduleEntityManager);
|
||||||
var constFieldAllocator = new ConstFieldAllocator(encryptor, localRandomCreator, rvaDataAllocator, moduleEntityManager);
|
var constFieldAllocator = new ConstFieldAllocator(encryptionScopeProvider, rvaDataAllocator, moduleEntityManager);
|
||||||
_ctx = new ObfuscationPassContext
|
_ctx = new ObfuscationPassContext
|
||||||
{
|
{
|
||||||
assemblyCache = assemblyCache,
|
assemblyCache = assemblyCache,
|
||||||
|
@ -264,9 +287,8 @@ namespace Obfuz
|
||||||
obfuscatedAssemblyOutputDir = _obfuscatedAssemblyOutputDir,
|
obfuscatedAssemblyOutputDir = _obfuscatedAssemblyOutputDir,
|
||||||
moduleEntityManager = moduleEntityManager,
|
moduleEntityManager = moduleEntityManager,
|
||||||
|
|
||||||
globalRandom = random,
|
encryptionScopeProvider = encryptionScopeProvider,
|
||||||
localRandomCreator = localRandomCreator,
|
|
||||||
encryptor = encryptor,
|
|
||||||
rvaDataAllocator = rvaDataAllocator,
|
rvaDataAllocator = rvaDataAllocator,
|
||||||
constFieldAllocator = constFieldAllocator,
|
constFieldAllocator = constFieldAllocator,
|
||||||
whiteList = new NotObfuscatedMethodWhiteList(),
|
whiteList = new NotObfuscatedMethodWhiteList(),
|
||||||
|
|
|
@ -15,8 +15,12 @@ namespace Obfuz
|
||||||
{
|
{
|
||||||
public class ObfuscatorBuilder
|
public class ObfuscatorBuilder
|
||||||
{
|
{
|
||||||
private string _secret;
|
private string _defaultStaticSecret;
|
||||||
private string _secretOutputPath;
|
private string _defaultStaticSecretOutputPath;
|
||||||
|
private string _defaultDynamicSecret;
|
||||||
|
private string _defaultDynamicSecretOutputPath;
|
||||||
|
private List<string> _dynamicSecretAssemblyNames = new List<string>();
|
||||||
|
|
||||||
private int _randomSeed;
|
private int _randomSeed;
|
||||||
private string _encryptionVmGenerationSecretKey;
|
private string _encryptionVmGenerationSecretKey;
|
||||||
private int _encryptionVmOpCodeCount;
|
private int _encryptionVmOpCodeCount;
|
||||||
|
@ -32,16 +36,34 @@ namespace Obfuz
|
||||||
private ObfuscationPassType _enabledObfuscationPasses;
|
private ObfuscationPassType _enabledObfuscationPasses;
|
||||||
private List<IObfuscationPass> _obfuscationPasses = new List<IObfuscationPass>();
|
private List<IObfuscationPass> _obfuscationPasses = new List<IObfuscationPass>();
|
||||||
|
|
||||||
public string Secret
|
public string DefaultStaticSecret
|
||||||
{
|
{
|
||||||
get => _secret;
|
get => _defaultStaticSecret;
|
||||||
set => _secret = value;
|
set => _defaultStaticSecret = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
public string SecretOutputPath
|
public string DefaultStaticSecretOutputPath
|
||||||
{
|
{
|
||||||
get => _secretOutputPath;
|
get => _defaultStaticSecretOutputPath;
|
||||||
set => _secretOutputPath = value;
|
set => _defaultStaticSecretOutputPath = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public string DefaultDynamicSecret
|
||||||
|
{
|
||||||
|
get => _defaultDynamicSecret;
|
||||||
|
set => _defaultDynamicSecret = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public string DefaultDynamicSecretOutputPath
|
||||||
|
{
|
||||||
|
get => _defaultDynamicSecretOutputPath;
|
||||||
|
set => _defaultDynamicSecretOutputPath = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<string> DynamicSecretAssemblyNames
|
||||||
|
{
|
||||||
|
get => _dynamicSecretAssemblyNames;
|
||||||
|
set => _dynamicSecretAssemblyNames = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int RandomSeed
|
public int RandomSeed
|
||||||
|
@ -151,8 +173,11 @@ namespace Obfuz
|
||||||
: settings.assemblySettings.extraAssemblySearchDirs.ToList();
|
: settings.assemblySettings.extraAssemblySearchDirs.ToList();
|
||||||
var builder = new ObfuscatorBuilder
|
var builder = new ObfuscatorBuilder
|
||||||
{
|
{
|
||||||
_secret = settings.secretSettings.secret,
|
_defaultStaticSecret = settings.secretSettings.defaultStaticSecret,
|
||||||
_secretOutputPath = settings.secretSettings.secretOutputPath,
|
_defaultStaticSecretOutputPath = settings.secretSettings.DefaultStaticSecretKeyOutputPath,
|
||||||
|
_defaultDynamicSecret = settings.secretSettings.defaultDynamicSecret,
|
||||||
|
_defaultDynamicSecretOutputPath = settings.secretSettings.DefaultDynamicSecretKeyOutputPath,
|
||||||
|
_dynamicSecretAssemblyNames = settings.secretSettings.dynamicSecretAssemblyNames.ToList(),
|
||||||
_randomSeed = settings.secretSettings.randomSeed,
|
_randomSeed = settings.secretSettings.randomSeed,
|
||||||
_encryptionVmGenerationSecretKey = settings.encryptionVMSettings.codeGenerationSecret,
|
_encryptionVmGenerationSecretKey = settings.encryptionVMSettings.codeGenerationSecret,
|
||||||
_encryptionVmOpCodeCount = settings.encryptionVMSettings.encryptionOpCodeCount,
|
_encryptionVmOpCodeCount = settings.encryptionVMSettings.encryptionOpCodeCount,
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
using System;
|
using System;
|
||||||
|
using System.IO;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
|
|
||||||
namespace Obfuz.Settings
|
namespace Obfuz.Settings
|
||||||
|
@ -7,13 +8,22 @@ namespace Obfuz.Settings
|
||||||
public class SecretSettings
|
public class SecretSettings
|
||||||
{
|
{
|
||||||
|
|
||||||
[Tooltip("secret key")]
|
[Tooltip("default static secret key")]
|
||||||
public string secret = "Code Philosophy";
|
public string defaultStaticSecret = "Code Philosophy-Static";
|
||||||
|
|
||||||
[Tooltip("secret key save path")]
|
public string defaultDynamicSecret = "Code Philosophy-Dynamic";
|
||||||
public string secretOutputPath = $"Assets/Obfuz/secret.bytes";
|
|
||||||
|
[Tooltip("secret key output directory")]
|
||||||
|
public string secretOutputDir = $"Assets/Resources/Obfuz";
|
||||||
|
|
||||||
[Tooltip("random seed")]
|
[Tooltip("random seed")]
|
||||||
public int randomSeed = 0;
|
public int randomSeed = 0;
|
||||||
|
|
||||||
|
[Tooltip("name of assemblies those use dynamic secret")]
|
||||||
|
public string[] dynamicSecretAssemblyNames;
|
||||||
|
|
||||||
|
public string DefaultStaticSecretKeyOutputPath => Path.Combine(secretOutputDir, "defaultStaticSecret.bytes");
|
||||||
|
|
||||||
|
public string DefaultDynamicSecretKeyOutputPath => Path.Combine(secretOutputDir, "defaultDynamicSecret.bytes");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,8 +28,12 @@ namespace Obfuz.Unity
|
||||||
{
|
{
|
||||||
SecretSettings settings = ObfuzSettings.Instance.secretSettings;
|
SecretSettings settings = ObfuzSettings.Instance.secretSettings;
|
||||||
|
|
||||||
var secretBytes = KeyGenerator.GenerateKey(settings.secret, VirtualMachine.SecretKeyLength);
|
var staticSecretBytes = KeyGenerator.GenerateKey(settings.defaultStaticSecret, VirtualMachine.SecretKeyLength);
|
||||||
Obfuscator.SaveKey(secretBytes, settings.secretOutputPath);
|
Obfuscator.SaveKey(staticSecretBytes, settings.DefaultStaticSecretKeyOutputPath);
|
||||||
|
Debug.Log($"Save static secret key to {settings.DefaultStaticSecretKeyOutputPath}");
|
||||||
|
var dynamicSecretBytes = KeyGenerator.GenerateKey(settings.defaultDynamicSecret, VirtualMachine.SecretKeyLength);
|
||||||
|
Obfuscator.SaveKey(dynamicSecretBytes, settings.DefaultDynamicSecretKeyOutputPath);
|
||||||
|
Debug.Log($"Save dynamic secret key to {settings.DefaultDynamicSecretKeyOutputPath}");
|
||||||
}
|
}
|
||||||
|
|
||||||
[MenuItem("Obfuz/Documents/Quick Start")]
|
[MenuItem("Obfuz/Documents/Quick Start")]
|
||||||
|
|
Loading…
Reference in New Issue