obfuz/Editor/ObfuscatorBuilder.cs

217 lines
8.4 KiB
C#
Raw Permalink Normal View History

using Obfuz.EncryptionVM;
using Obfuz.ObfusPasses;
2025-05-04 19:55:10 +08:00
using Obfuz.ObfusPasses.CallObfus;
2025-05-09 19:26:59 +08:00
using Obfuz.ObfusPasses.ConstEncrypt;
2025-05-04 19:55:10 +08:00
using Obfuz.ObfusPasses.ExprObfus;
2025-05-10 19:09:44 +08:00
using Obfuz.ObfusPasses.FieldEncrypt;
2025-05-04 19:55:10 +08:00
using Obfuz.ObfusPasses.SymbolObfus;
using Obfuz.Settings;
2025-05-03 21:43:50 +08:00
using System.Collections.Generic;
using System.IO;
2025-05-03 21:43:50 +08:00
using System.Linq;
using UnityEditor;
namespace Obfuz
{
public class ObfuscatorBuilder
{
2025-05-17 12:11:36 +08:00
private string _defaultStaticSecretKey;
private string _defaultStaticSecretKeyOutputPath;
private string _defaultDynamicSecretKey;
private string _defaultDynamicSecretKeyOutputPath;
private List<string> _assembliesUsingDynamicSecretKeys = new List<string>();
2025-05-16 11:33:03 +08:00
private int _randomSeed;
2025-05-11 12:48:53 +08:00
private string _encryptionVmGenerationSecretKey;
2025-05-11 17:36:58 +08:00
private int _encryptionVmOpCodeCount;
private string _encryptionVmCodeFile;
2025-05-17 12:11:36 +08:00
private List<string> _assembliesToObfuscate = new List<string>();
private List<string> _nonObfuscatedButReferencingObfuscatedAssemblies = new List<string>();
private List<string> _assemblySearchPaths = new List<string>();
2025-05-03 21:43:50 +08:00
2025-05-17 12:11:36 +08:00
private string _obfuscatedAssemblyOutputPath;
private List<string> _obfuscationPassRuleConfigFiles;
2025-05-12 22:01:35 +08:00
private ObfuscationPassType _enabledObfuscationPasses;
2025-05-03 21:43:50 +08:00
private List<IObfuscationPass> _obfuscationPasses = new List<IObfuscationPass>();
2025-05-17 12:11:36 +08:00
public string DefaultStaticSecretKey
2025-05-16 11:33:03 +08:00
{
2025-05-17 12:11:36 +08:00
get => _defaultStaticSecretKey;
set => _defaultStaticSecretKey = value;
2025-05-16 11:33:03 +08:00
}
2025-05-17 12:11:36 +08:00
public string DefaultStaticSecretKeyOutputPath
2025-05-16 11:33:03 +08:00
{
2025-05-17 12:11:36 +08:00
get => _defaultStaticSecretKeyOutputPath;
set => _defaultStaticSecretKeyOutputPath = value;
2025-05-16 11:33:03 +08:00
}
2025-05-17 12:11:36 +08:00
public string DefaultDynamicSecretKey
2025-05-16 11:33:03 +08:00
{
2025-05-17 12:11:36 +08:00
get => _defaultDynamicSecretKey;
set => _defaultDynamicSecretKey = value;
2025-05-16 11:33:03 +08:00
}
2025-05-17 12:11:36 +08:00
public string DefaultDynamicSecretKeyOutputPath
2025-05-11 09:17:04 +08:00
{
2025-05-17 12:11:36 +08:00
get => _defaultDynamicSecretKeyOutputPath;
set => _defaultDynamicSecretKeyOutputPath = value;
2025-05-11 09:17:04 +08:00
}
2025-05-17 12:11:36 +08:00
public List<string> AssembliesUsingDynamicSecretKeys
2025-05-11 09:17:04 +08:00
{
2025-05-17 12:11:36 +08:00
get => _assembliesUsingDynamicSecretKeys;
set => _assembliesUsingDynamicSecretKeys = value;
}
public int RandomSeed
{
get => _randomSeed;
set => _randomSeed = value;
2025-05-11 09:17:04 +08:00
}
2025-05-11 12:48:53 +08:00
public string EncryptionVmGenerationSecretKey
{
get => _encryptionVmGenerationSecretKey;
set => _encryptionVmGenerationSecretKey = value;
}
2025-05-11 17:36:58 +08:00
public int EncryptionVmOpCodeCount
{
get => _encryptionVmOpCodeCount;
set => _encryptionVmOpCodeCount = value;
}
public string EncryptionVmCodeFile
{
get => _encryptionVmCodeFile;
set => _encryptionVmCodeFile = value;
}
2025-05-17 12:11:36 +08:00
public List<string> AssembliesToObfuscate
2025-05-03 21:43:50 +08:00
{
2025-05-17 12:11:36 +08:00
get => _assembliesToObfuscate;
set => _assembliesToObfuscate = value;
2025-05-03 21:43:50 +08:00
}
2025-05-17 12:11:36 +08:00
public List<string> NonObfuscatedButReferencingObfuscatedAssemblies
2025-05-03 21:43:50 +08:00
{
2025-05-17 12:11:36 +08:00
get => _nonObfuscatedButReferencingObfuscatedAssemblies;
set => _nonObfuscatedButReferencingObfuscatedAssemblies = value;
2025-05-03 21:43:50 +08:00
}
2025-05-17 12:11:36 +08:00
public List<string> AssemblySearchPaths
2025-05-03 21:43:50 +08:00
{
2025-05-17 12:11:36 +08:00
get => _assemblySearchPaths;
set => _assemblySearchPaths = value;
2025-05-03 21:43:50 +08:00
}
2025-05-17 12:11:36 +08:00
public string ObfuscatedAssemblyOutputPath
2025-05-03 21:43:50 +08:00
{
2025-05-17 12:11:36 +08:00
get => _obfuscatedAssemblyOutputPath;
set => _obfuscatedAssemblyOutputPath = value;
2025-05-03 21:43:50 +08:00
}
2025-05-12 22:01:35 +08:00
public ObfuscationPassType EnableObfuscationPasses
{
get => _enabledObfuscationPasses;
set => _enabledObfuscationPasses = value;
}
2025-05-17 12:11:36 +08:00
public List<string> ObfuscationPassRuleConfigFiles
2025-05-12 22:01:35 +08:00
{
2025-05-17 12:11:36 +08:00
get => _obfuscationPassRuleConfigFiles;
set => _obfuscationPassRuleConfigFiles = value;
2025-05-12 22:01:35 +08:00
}
public List<IObfuscationPass> ObfuscationPasses
{
get => _obfuscationPasses;
set => _obfuscationPasses = value;
}
2025-05-11 17:36:58 +08:00
2025-05-17 12:11:36 +08:00
public void InsertTopPriorityAssemblySearchPaths(List<string> assemblySearchPaths)
2025-05-03 21:43:50 +08:00
{
2025-05-17 12:11:36 +08:00
_assemblySearchPaths.InsertRange(0, assemblySearchPaths);
2025-05-03 21:43:50 +08:00
}
public ObfuscatorBuilder AddPass(IObfuscationPass pass)
{
_obfuscationPasses.Add(pass);
return this;
}
public Obfuscator Build()
{
2025-05-11 17:36:58 +08:00
return new Obfuscator(this);
2025-05-03 21:43:50 +08:00
}
public static List<string> BuildUnityAssemblySearchPaths()
{
string applicationContentsPath = EditorApplication.applicationContentsPath;
return new List<string>
{
#if UNITY_2021_1_OR_NEWER
Path.Combine(applicationContentsPath, "UnityReferenceAssemblies/unity-4.8-api/Facades"),
Path.Combine(applicationContentsPath, "UnityReferenceAssemblies/unity-4.8-api"),
#elif UNITY_2020 || UNITY_2019
Path.Combine(applicationContentsPath, "MonoBleedingEdge/lib/mono/4.7.1-api/Facades"),
Path.Combine(applicationContentsPath, "MonoBleedingEdge/lib/mono/4.7.1-api"),
#else
#error "Unsupported Unity version"
#endif
Path.Combine(applicationContentsPath, "Managed/UnityEngine"),
};
}
2025-05-15 09:14:48 +08:00
public static ObfuscatorBuilder FromObfuzSettings(ObfuzSettings settings, BuildTarget target, bool searchPathIncludeUnityEditorInstallLocation)
2025-05-03 21:43:50 +08:00
{
2025-05-15 09:14:48 +08:00
List<string> searchPaths = searchPathIncludeUnityEditorInstallLocation ?
2025-05-17 12:11:36 +08:00
BuildUnityAssemblySearchPaths().Concat(settings.assemblySettings.additionalAssemblySearchPaths).ToList()
: settings.assemblySettings.additionalAssemblySearchPaths.ToList();
2025-05-03 21:43:50 +08:00
var builder = new ObfuscatorBuilder
{
2025-05-17 12:11:36 +08:00
_defaultStaticSecretKey = settings.secretSettings.defaultStaticSecretKey,
_defaultStaticSecretKeyOutputPath = settings.secretSettings.DefaultStaticSecretKeyOutputPath,
_defaultDynamicSecretKey = settings.secretSettings.defaultDynamicSecretKey,
_defaultDynamicSecretKeyOutputPath = settings.secretSettings.DefaultDynamicSecretKeyOutputPath,
_assembliesUsingDynamicSecretKeys = settings.secretSettings.assembliesUsingDynamicSecretKeys.ToList(),
2025-05-12 08:46:44 +08:00
_randomSeed = settings.secretSettings.randomSeed,
2025-05-17 12:11:36 +08:00
_encryptionVmGenerationSecretKey = settings.encryptionVMSettings.codeGenerationSecretKey,
2025-05-11 17:36:58 +08:00
_encryptionVmOpCodeCount = settings.encryptionVMSettings.encryptionOpCodeCount,
_encryptionVmCodeFile = settings.encryptionVMSettings.codeOutputPath,
2025-05-17 12:11:36 +08:00
_assembliesToObfuscate = settings.assemblySettings.assembliesToObfuscate.ToList(),
_nonObfuscatedButReferencingObfuscatedAssemblies = settings.assemblySettings.nonObfuscatedButReferencingObfuscatedAssemblies.ToList(),
_assemblySearchPaths = searchPaths,
_obfuscatedAssemblyOutputPath = settings.GetObfuscatedAssemblyOutputPath(target),
2025-05-12 22:01:35 +08:00
_enabledObfuscationPasses = settings.obfuscationPassSettings.enabledPasses,
2025-05-17 12:11:36 +08:00
_obfuscationPassRuleConfigFiles = settings.obfuscationPassSettings.ruleFiles.ToList(),
2025-05-03 21:43:50 +08:00
};
2025-05-12 08:46:44 +08:00
ObfuscationPassType obfuscationPasses = settings.obfuscationPassSettings.enabledPasses;
2025-05-11 12:48:53 +08:00
if (obfuscationPasses.HasFlag(ObfuscationPassType.ConstEncrypt))
{
builder.AddPass(new ConstEncryptPass(settings.constEncryptSettings));
}
2025-05-11 08:24:23 +08:00
if (obfuscationPasses.HasFlag(ObfuscationPassType.FieldEncrypt))
{
2025-05-10 19:50:03 +08:00
builder.AddPass(new FieldEncryptPass(settings.fieldEncryptSettings));
}
2025-05-11 08:24:23 +08:00
if (obfuscationPasses.HasFlag(ObfuscationPassType.CallObfus))
{
2025-05-09 20:18:24 +08:00
builder.AddPass(new CallObfusPass(settings.callObfusSettings));
}
2025-05-11 08:24:23 +08:00
if (obfuscationPasses.HasFlag(ObfuscationPassType.ExprObfus))
{
2025-05-10 18:25:43 +08:00
builder.AddPass(new ExprObfusPass());
}
2025-05-11 08:24:23 +08:00
if (obfuscationPasses.HasFlag(ObfuscationPassType.SymbolObfus))
{
2025-05-05 09:09:53 +08:00
builder.AddPass(new SymbolObfusPass(settings.symbolObfusSettings));
}
2025-05-03 21:43:50 +08:00
return builder;
}
}
}