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-05 21:47:28 +08:00
|
|
|
|
public List<string> ObfuscatedAssemblyNames;
|
2025-04-05 19:02:50 +08:00
|
|
|
|
public string outputDir;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private readonly Options _options;
|
|
|
|
|
private readonly AssemblyCache _assemblyCache;
|
|
|
|
|
|
|
|
|
|
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-05 19:02:50 +08:00
|
|
|
|
public Obfuscator(Options options)
|
|
|
|
|
{
|
|
|
|
|
_options = options;
|
|
|
|
|
_assemblyCache = new AssemblyCache(new PathAssemblyResolver(options.AssemblySearchDirs.ToArray()));
|
2025-04-07 10:27:19 +08:00
|
|
|
|
_renamePolicy = new CombineRenamePolicy(new SystemRenamePolicy(), new UnityRenamePolicy(), new XmlConfigRenamePolicy());
|
2025-04-05 21:47:28 +08:00
|
|
|
|
_nameMaker = new NameMaker();
|
2025-04-05 19:02:50 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void DoIt()
|
|
|
|
|
{
|
|
|
|
|
LoadAssemblies();
|
|
|
|
|
Rename();
|
2025-04-05 21:47:28 +08:00
|
|
|
|
Save();
|
2025-04-05 19:02:50 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void LoadAssemblies()
|
|
|
|
|
{
|
2025-04-05 21:47:28 +08:00
|
|
|
|
foreach (string assName in _options.ObfuscatedAssemblyNames)
|
2025-04-05 19:02:50 +08:00
|
|
|
|
{
|
|
|
|
|
ModuleDefMD mod = _assemblyCache.LoadModule(assName);
|
|
|
|
|
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()
|
|
|
|
|
{
|
|
|
|
|
var ctx = new ObfuscatorContext
|
|
|
|
|
{
|
|
|
|
|
assemblies = _obfuzAssemblies,
|
2025-04-05 21:47:28 +08:00
|
|
|
|
renamePolicy = _renamePolicy,
|
|
|
|
|
nameMaker = _nameMaker,
|
2025-04-05 19:02:50 +08:00
|
|
|
|
};
|
|
|
|
|
var sr = new SymbolRename(ctx);
|
|
|
|
|
sr.Process();
|
|
|
|
|
}
|
2025-04-05 21:47:28 +08:00
|
|
|
|
|
|
|
|
|
private void Save()
|
|
|
|
|
{
|
|
|
|
|
string outputDir = _options.outputDir;
|
|
|
|
|
FileUtil.RecreateDir(outputDir);
|
|
|
|
|
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
|
|
|
|
}
|
|
|
|
|
}
|