2025-04-05 19:02:50 +08:00
|
|
|
|
using dnlib.DotNet;
|
2025-04-05 21:47:28 +08:00
|
|
|
|
using Obfuz.Rename;
|
2025-04-05 19:02:50 +08:00
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
2025-04-05 21:47:28 +08:00
|
|
|
|
using System.IO;
|
2025-04-05 19:02:50 +08:00
|
|
|
|
using System.Linq;
|
|
|
|
|
using System.Text;
|
|
|
|
|
using System.Threading.Tasks;
|
2025-04-05 21:47:28 +08:00
|
|
|
|
using UnityEngine;
|
2025-04-05 19:02:50 +08:00
|
|
|
|
|
|
|
|
|
namespace Obfuz
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public class Obfuscator
|
|
|
|
|
{
|
|
|
|
|
public class Options
|
|
|
|
|
{
|
|
|
|
|
public List<string> AssemblySearchDirs;
|
2025-04-17 22:02:48 +08:00
|
|
|
|
public List<string> ObfuscationRuleFiles;
|
2025-04-16 23:03:41 +08:00
|
|
|
|
public string mappingXmlPath;
|
2025-04-05 19:02:50 +08:00
|
|
|
|
public string outputDir;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private readonly Options _options;
|
|
|
|
|
private readonly AssemblyCache _assemblyCache;
|
2025-04-17 22:02:48 +08:00
|
|
|
|
private readonly ObfuscateRuleConfig _obfuscateRuleConfig;
|
2025-04-05 19:02:50 +08:00
|
|
|
|
|
|
|
|
|
private readonly List<ObfuzAssemblyInfo> _obfuzAssemblies = new List<ObfuzAssemblyInfo>();
|
|
|
|
|
|
2025-04-05 21:47:28 +08:00
|
|
|
|
private readonly IRenamePolicy _renamePolicy;
|
|
|
|
|
private readonly INameMaker _nameMaker;
|
2025-04-16 13:12:21 +08:00
|
|
|
|
private readonly SymbolRename _symbolRename;
|
2025-04-05 21:47:28 +08:00
|
|
|
|
|
2025-04-17 22:02:48 +08:00
|
|
|
|
public IList<string> ObfuscatedAssemblyNames => _obfuzAssemblies.Select(x => x.name).ToList();
|
|
|
|
|
|
2025-04-05 19:02:50 +08:00
|
|
|
|
public Obfuscator(Options options)
|
|
|
|
|
{
|
|
|
|
|
_options = options;
|
|
|
|
|
_assemblyCache = new AssemblyCache(new PathAssemblyResolver(options.AssemblySearchDirs.ToArray()));
|
2025-04-17 22:02:48 +08:00
|
|
|
|
_obfuscateRuleConfig = new ObfuscateRuleConfig();
|
|
|
|
|
_obfuscateRuleConfig.LoadXmls(options.ObfuscationRuleFiles);
|
|
|
|
|
_renamePolicy = new CombineRenamePolicy(new SystemRenamePolicy(), new UnityRenamePolicy(), _obfuscateRuleConfig);
|
2025-04-15 18:30:17 +08:00
|
|
|
|
//_nameMaker = new TestNameMaker();
|
|
|
|
|
_nameMaker = NameMakerFactory.CreateNameMakerBaseASCIICharSet();
|
2025-04-16 13:12:21 +08:00
|
|
|
|
|
|
|
|
|
var ctx = new ObfuscatorContext
|
|
|
|
|
{
|
|
|
|
|
assemblyCache = _assemblyCache,
|
|
|
|
|
assemblies = _obfuzAssemblies,
|
|
|
|
|
renamePolicy = _renamePolicy,
|
|
|
|
|
nameMaker = _nameMaker,
|
2025-04-16 23:03:41 +08:00
|
|
|
|
mappingXmlPath = _options.mappingXmlPath,
|
2025-04-16 13:12:21 +08:00
|
|
|
|
outputDir = _options.outputDir,
|
|
|
|
|
};
|
|
|
|
|
_symbolRename = new SymbolRename(ctx);
|
2025-04-05 19:02:50 +08:00
|
|
|
|
}
|
|
|
|
|
|
2025-04-16 23:03:41 +08:00
|
|
|
|
public void Run()
|
2025-04-05 19:02:50 +08:00
|
|
|
|
{
|
|
|
|
|
LoadAssemblies();
|
|
|
|
|
Rename();
|
2025-04-05 21:47:28 +08:00
|
|
|
|
Save();
|
2025-04-05 19:02:50 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void LoadAssemblies()
|
|
|
|
|
{
|
2025-04-17 22:02:48 +08:00
|
|
|
|
foreach (string assName in _obfuscateRuleConfig.ObfuscatedAssemblyNames)
|
2025-04-05 19:02:50 +08:00
|
|
|
|
{
|
2025-04-17 22:02:48 +08:00
|
|
|
|
ModuleDefMD mod = _assemblyCache.TryLoadModule(assName);
|
|
|
|
|
if (mod == null)
|
|
|
|
|
{
|
|
|
|
|
Debug.Log($"assembly: {assName} not found! ignore.");
|
|
|
|
|
continue;
|
|
|
|
|
}
|
2025-04-05 19:02:50 +08:00
|
|
|
|
var obfuzAsm = new ObfuzAssemblyInfo
|
|
|
|
|
{
|
|
|
|
|
name = assName,
|
|
|
|
|
module = mod,
|
|
|
|
|
referenceMeAssemblies = new List<ObfuzAssemblyInfo>(),
|
|
|
|
|
};
|
2025-04-05 21:47:28 +08:00
|
|
|
|
obfuzAsm.referenceMeAssemblies.Add(obfuzAsm);
|
2025-04-05 19:02:50 +08:00
|
|
|
|
_obfuzAssemblies.Add(obfuzAsm);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var assByName = _obfuzAssemblies.ToDictionary(x => x.name);
|
|
|
|
|
foreach (var ass in _obfuzAssemblies)
|
|
|
|
|
{
|
|
|
|
|
foreach (var refAss in ass.module.GetAssemblyRefs())
|
|
|
|
|
{
|
|
|
|
|
string refAssName = refAss.Name.ToString();
|
|
|
|
|
if (assByName.TryGetValue(refAssName, out var refAssembly))
|
|
|
|
|
{
|
|
|
|
|
UnityEngine.Debug.Log($"assembly:{ass.name} reference to {refAssName}");
|
|
|
|
|
refAssembly.referenceMeAssemblies.Add(ass);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void Rename()
|
|
|
|
|
{
|
2025-04-16 13:12:21 +08:00
|
|
|
|
_symbolRename.Process();
|
2025-04-05 19:02:50 +08:00
|
|
|
|
}
|
2025-04-05 21:47:28 +08:00
|
|
|
|
|
|
|
|
|
private void Save()
|
|
|
|
|
{
|
|
|
|
|
string outputDir = _options.outputDir;
|
|
|
|
|
FileUtil.RecreateDir(outputDir);
|
2025-04-16 13:12:21 +08:00
|
|
|
|
_symbolRename.Save();
|
2025-04-05 21:47:28 +08:00
|
|
|
|
foreach (var ass in _obfuzAssemblies)
|
|
|
|
|
{
|
|
|
|
|
string outputFile = $"{outputDir}/{ass.module.Name}";
|
|
|
|
|
ass.module.Write(outputFile);
|
|
|
|
|
Debug.Log($"save module. oldName:{ass.name} newName:{ass.module.Name} output:{outputFile}");
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-04-05 19:02:50 +08:00
|
|
|
|
}
|
|
|
|
|
}
|