2025-05-11 19:28:19 +08:00
|
|
|
|
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;
|
2025-05-11 19:28:19 +08:00
|
|
|
|
using System.IO;
|
2025-05-03 21:43:50 +08:00
|
|
|
|
using System.Linq;
|
|
|
|
|
using UnityEditor;
|
|
|
|
|
|
|
|
|
|
namespace Obfuz
|
|
|
|
|
{
|
|
|
|
|
public class ObfuscatorBuilder
|
|
|
|
|
{
|
2025-05-12 08:13:01 +08:00
|
|
|
|
private string _secret;
|
|
|
|
|
private string _secretOutputPath;
|
|
|
|
|
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;
|
2025-05-11 20:12:33 +08:00
|
|
|
|
private string _encryptionVmCodeFile;
|
2025-05-11 19:28:19 +08:00
|
|
|
|
|
2025-05-03 21:43:50 +08:00
|
|
|
|
private List<string> _toObfuscatedAssemblyNames = new List<string>();
|
|
|
|
|
private List<string> _notObfuscatedAssemblyNamesReferencingObfuscated = new List<string>();
|
|
|
|
|
private List<string> _assemblySearchDirs = new List<string>();
|
|
|
|
|
|
|
|
|
|
private string _obfuscatedAssemblyOutputDir;
|
2025-05-12 22:01:35 +08:00
|
|
|
|
private List<string> _obfuscationPassConfigFiles;
|
|
|
|
|
|
|
|
|
|
private ObfuscationPassType _enabledObfuscationPasses;
|
2025-05-03 21:43:50 +08:00
|
|
|
|
private List<IObfuscationPass> _obfuscationPasses = new List<IObfuscationPass>();
|
|
|
|
|
|
2025-05-12 08:13:01 +08:00
|
|
|
|
public string Secret
|
2025-05-11 09:17:04 +08:00
|
|
|
|
{
|
2025-05-12 08:13:01 +08:00
|
|
|
|
get => _secret;
|
|
|
|
|
set => _secret = value;
|
2025-05-11 09:17:04 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-05-12 08:13:01 +08:00
|
|
|
|
public string SecretOutputPath
|
2025-05-11 09:17:04 +08:00
|
|
|
|
{
|
2025-05-12 08:13:01 +08:00
|
|
|
|
get => _secretOutputPath;
|
|
|
|
|
set => _secretOutputPath = 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;
|
|
|
|
|
}
|
|
|
|
|
|
2025-05-11 19:28:19 +08:00
|
|
|
|
public string EncryptionVmCodeFile
|
|
|
|
|
{
|
|
|
|
|
get => _encryptionVmCodeFile;
|
|
|
|
|
set => _encryptionVmCodeFile = value;
|
|
|
|
|
}
|
|
|
|
|
|
2025-05-03 21:43:50 +08:00
|
|
|
|
public List<string> ToObfuscatedAssemblyNames
|
|
|
|
|
{
|
|
|
|
|
get => _toObfuscatedAssemblyNames;
|
|
|
|
|
set => _toObfuscatedAssemblyNames = value;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public List<string> NotObfuscatedAssemblyNamesReferencingObfuscated
|
|
|
|
|
{
|
|
|
|
|
get => _notObfuscatedAssemblyNamesReferencingObfuscated;
|
|
|
|
|
set => _notObfuscatedAssemblyNamesReferencingObfuscated = value;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public List<string> AssemblySearchDirs
|
|
|
|
|
{
|
|
|
|
|
get => _assemblySearchDirs;
|
|
|
|
|
set => _assemblySearchDirs = value;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public string ObfuscatedAssemblyOutputDir
|
|
|
|
|
{
|
|
|
|
|
get => _obfuscatedAssemblyOutputDir;
|
|
|
|
|
set => _obfuscatedAssemblyOutputDir = value;
|
|
|
|
|
}
|
|
|
|
|
|
2025-05-12 22:01:35 +08:00
|
|
|
|
public ObfuscationPassType EnableObfuscationPasses
|
|
|
|
|
{
|
|
|
|
|
get => _enabledObfuscationPasses;
|
|
|
|
|
set => _enabledObfuscationPasses = value;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public List<string> ObfuscationPassConfigFiles
|
|
|
|
|
{
|
|
|
|
|
get => _obfuscationPassConfigFiles;
|
|
|
|
|
set => _obfuscationPassConfigFiles = value;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public List<IObfuscationPass> ObfuscationPasses
|
|
|
|
|
{
|
|
|
|
|
get => _obfuscationPasses;
|
|
|
|
|
set => _obfuscationPasses = value;
|
|
|
|
|
}
|
2025-05-11 17:36:58 +08:00
|
|
|
|
|
2025-05-03 21:43:50 +08:00
|
|
|
|
public void InsertTopPriorityAssemblySearchDirs(List<string> assemblySearchDirs)
|
|
|
|
|
{
|
|
|
|
|
_assemblySearchDirs.InsertRange(0, assemblySearchDirs);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
}
|
|
|
|
|
|
2025-05-12 09:42:58 +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-03 21:43:50 +08:00
|
|
|
|
public static ObfuscatorBuilder FromObfuzSettings(ObfuzSettings settings, BuildTarget target)
|
|
|
|
|
{
|
|
|
|
|
var builder = new ObfuscatorBuilder
|
|
|
|
|
{
|
2025-05-12 08:46:44 +08:00
|
|
|
|
_secret = settings.secretSettings.secret,
|
|
|
|
|
_secretOutputPath = settings.secretSettings.secretOutputPath,
|
|
|
|
|
_randomSeed = settings.secretSettings.randomSeed,
|
2025-05-12 08:13:01 +08:00
|
|
|
|
_encryptionVmGenerationSecretKey = settings.encryptionVMSettings.codeGenerationSecret,
|
2025-05-11 17:36:58 +08:00
|
|
|
|
_encryptionVmOpCodeCount = settings.encryptionVMSettings.encryptionOpCodeCount,
|
2025-05-12 08:13:01 +08:00
|
|
|
|
_encryptionVmCodeFile = settings.encryptionVMSettings.codeOutputPath,
|
2025-05-12 08:46:44 +08:00
|
|
|
|
_toObfuscatedAssemblyNames = settings.assemblySettings.toObfuscatedAssemblyNames.ToList(),
|
|
|
|
|
_notObfuscatedAssemblyNamesReferencingObfuscated = settings.assemblySettings.notObfuscatedAssemblyNamesReferencingObfuscated.ToList(),
|
2025-05-12 09:42:58 +08:00
|
|
|
|
_assemblySearchDirs = BuildUnityAssemblySearchPaths().Concat(settings.assemblySettings.extraAssemblySearchDirs).ToList(),
|
2025-05-03 21:43:50 +08:00
|
|
|
|
_obfuscatedAssemblyOutputDir = settings.GetObfuscatedAssemblyOutputDir(target),
|
2025-05-12 22:01:35 +08:00
|
|
|
|
_enabledObfuscationPasses = settings.obfuscationPassSettings.enabledPasses,
|
|
|
|
|
_obfuscationPassConfigFiles = settings.obfuscationPassSettings.configFiles.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-03 22:00:59 +08:00
|
|
|
|
{
|
2025-05-10 19:50:03 +08:00
|
|
|
|
builder.AddPass(new FieldEncryptPass(settings.fieldEncryptSettings));
|
2025-05-03 22:00:59 +08:00
|
|
|
|
}
|
2025-05-11 08:24:23 +08:00
|
|
|
|
if (obfuscationPasses.HasFlag(ObfuscationPassType.CallObfus))
|
2025-05-03 22:00:59 +08:00
|
|
|
|
{
|
2025-05-09 20:18:24 +08:00
|
|
|
|
builder.AddPass(new CallObfusPass(settings.callObfusSettings));
|
2025-05-03 22:00:59 +08:00
|
|
|
|
}
|
2025-05-11 08:24:23 +08:00
|
|
|
|
if (obfuscationPasses.HasFlag(ObfuscationPassType.ExprObfus))
|
2025-05-03 22:00:59 +08:00
|
|
|
|
{
|
2025-05-10 18:25:43 +08:00
|
|
|
|
builder.AddPass(new ExprObfusPass());
|
2025-05-03 22:00:59 +08:00
|
|
|
|
}
|
2025-05-11 08:24:23 +08:00
|
|
|
|
if (obfuscationPasses.HasFlag(ObfuscationPassType.SymbolObfus))
|
2025-05-03 22:00:59 +08:00
|
|
|
|
{
|
2025-05-05 09:09:53 +08:00
|
|
|
|
builder.AddPass(new SymbolObfusPass(settings.symbolObfusSettings));
|
2025-05-03 22:00:59 +08:00
|
|
|
|
}
|
2025-05-03 21:43:50 +08:00
|
|
|
|
return builder;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|