obfuz/Editor/Obfuscator.cs

120 lines
4.0 KiB
C#
Raw Normal View History

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);
2025-04-18 08:50:51 +08:00
_renamePolicy = new CacheRenamePolicy(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
}
}