解决Import metadata缓存未更新,导致rename后有函数未改名的bug

backup
walon 2025-05-12 17:21:20 +08:00
parent 48b36d8ff2
commit 7eabfbdf08
2 changed files with 62 additions and 32 deletions

View File

@ -5,6 +5,7 @@ using Obfuz.Emit;
using Obfuz.EncryptionVM;
using Obfuz.ObfusPasses;
using Obfuz.ObfusPasses.CleanUp;
using Obfuz.ObfusPasses.SymbolObfus;
using Obfuz.Utils;
using System;
using System.Collections.Generic;
@ -21,14 +22,13 @@ namespace Obfuz
public class Obfuscator
{
private readonly string _obfuscatedAssemblyOutputDir;
private readonly AssemblyCache _assemblyCache;
private readonly List<string> _toObfuscatedAssemblyNames;
private readonly List<string> _notObfuscatedAssemblyNamesReferencingObfuscated;
private readonly List<ModuleDef> _toObfuscatedModules = new List<ModuleDef>();
private readonly List<ModuleDef> _obfuscatedAndNotObfuscatedModules = new List<ModuleDef>();
private readonly List<string> _assemblySearchDirs;
private readonly Pipeline _pipeline = new Pipeline();
private readonly Pipeline _pipeline1 = new Pipeline();
private readonly Pipeline _pipeline2 = new Pipeline();
private readonly byte[] _secret;
private readonly int _randomSeed;
private readonly string _encryptionVmGenerationSecret;
@ -49,14 +49,20 @@ namespace Obfuz
_toObfuscatedAssemblyNames = builder.ToObfuscatedAssemblyNames;
_notObfuscatedAssemblyNamesReferencingObfuscated = builder.NotObfuscatedAssemblyNamesReferencingObfuscated;
_obfuscatedAssemblyOutputDir = builder.ObfuscatedAssemblyOutputDir;
_assemblySearchDirs = builder.AssemblySearchDirs;
GroupByModuleEntityManager.Reset();
_assemblyCache = new AssemblyCache(new PathAssemblyResolver(builder.AssemblySearchDirs.ToArray()));
foreach (var pass in builder.ObfuscationPasses)
{
_pipeline.AddPass(pass);
if (pass is SymbolObfusPass symbolObfusPass)
{
_pipeline2.AddPass(pass);
}
_pipeline.AddPass(new CleanUpInstructionPass());
else
{
_pipeline1.AddPass(pass);
}
}
_pipeline1.AddPass(new CleanUpInstructionPass());
}
public static void SaveKey(byte[] secret, string secretOutputPath)
@ -68,9 +74,21 @@ namespace Obfuz
public void Run()
{
OnPreObfuscation();
DoObfuscation();
OnPostObfuscation();
FileUtil.RecreateDir(_obfuscatedAssemblyOutputDir);
RunPipeline(_pipeline1);
_assemblySearchDirs.Insert(0, _obfuscatedAssemblyOutputDir);
RunPipeline(_pipeline2);
}
private void RunPipeline(Pipeline pipeline)
{
if (pipeline.Empty)
{
return;
}
OnPreObfuscation(pipeline);
DoObfuscation(pipeline);
OnPostObfuscation(pipeline);
}
private IEncryptor CreateEncryptionVirtualMachine()
@ -128,9 +146,16 @@ namespace Obfuz
return vms;
}
private void OnPreObfuscation()
private void OnPreObfuscation(Pipeline pipeline)
{
LoadAssemblies();
AssemblyCache assemblyCache = new AssemblyCache(new PathAssemblyResolver(_assemblySearchDirs.ToArray()));
List<ModuleDef> toObfuscatedModules = new List<ModuleDef>();
List<ModuleDef> obfuscatedAndNotObfuscatedModules = new List<ModuleDef>();
GroupByModuleEntityManager.Reset();
LoadAssemblies(assemblyCache, toObfuscatedModules, obfuscatedAndNotObfuscatedModules);
var random = new RandomWithKey(_secret, _randomSeed);
@ -139,9 +164,9 @@ namespace Obfuz
var constFieldAllocator = new ConstFieldAllocator(encryptor, random, rvaDataAllocator);
_ctx = new ObfuscationPassContext
{
assemblyCache = _assemblyCache,
toObfuscatedModules = _toObfuscatedModules,
obfuscatedAndNotObfuscatedModules = _obfuscatedAndNotObfuscatedModules,
assemblyCache = assemblyCache,
toObfuscatedModules = toObfuscatedModules,
obfuscatedAndNotObfuscatedModules = obfuscatedAndNotObfuscatedModules,
toObfuscatedAssemblyNames = _toObfuscatedAssemblyNames,
notObfuscatedAssemblyNamesReferencingObfuscated = _notObfuscatedAssemblyNamesReferencingObfuscated,
obfuscatedAssemblyOutputDir = _obfuscatedAssemblyOutputDir,
@ -151,14 +176,14 @@ namespace Obfuz
rvaDataAllocator = rvaDataAllocator,
constFieldAllocator = constFieldAllocator,
};
_pipeline.Start(_ctx);
pipeline.Start(_ctx);
}
private void LoadAssemblies()
private void LoadAssemblies(AssemblyCache assemblyCache, List<ModuleDef> toObfuscatedModules, List<ModuleDef> obfuscatedAndNotObfuscatedModules)
{
foreach (string assName in _toObfuscatedAssemblyNames.Concat(_notObfuscatedAssemblyNamesReferencingObfuscated))
{
ModuleDefMD mod = _assemblyCache.TryLoadModule(assName);
ModuleDefMD mod = assemblyCache.TryLoadModule(assName);
if (mod == null)
{
Debug.Log($"assembly: {assName} not found! ignore.");
@ -166,24 +191,15 @@ namespace Obfuz
}
if (_toObfuscatedAssemblyNames.Contains(assName))
{
_toObfuscatedModules.Add(mod);
toObfuscatedModules.Add(mod);
}
_obfuscatedAndNotObfuscatedModules.Add(mod);
obfuscatedAndNotObfuscatedModules.Add(mod);
}
}
private void DoObfuscation()
private void WriteAssemblies()
{
FileUtil.RecreateDir(_obfuscatedAssemblyOutputDir);
_pipeline.Run(_ctx);
}
private void OnPostObfuscation()
{
_pipeline.Stop(_ctx);
foreach (ModuleDef mod in _obfuscatedAndNotObfuscatedModules)
foreach (ModuleDef mod in _ctx.obfuscatedAndNotObfuscatedModules)
{
string assNameWithExt = mod.Name;
string outputFile = $"{_obfuscatedAssemblyOutputDir}/{assNameWithExt}";
@ -191,5 +207,17 @@ namespace Obfuz
Debug.Log($"save module. name:{mod.Assembly.Name} output:{outputFile}");
}
}
private void DoObfuscation(Pipeline pipeline)
{
pipeline.Run(_ctx);
}
private void OnPostObfuscation(Pipeline pipeline)
{
pipeline.Stop(_ctx);
WriteAssemblies();
}
}
}

View File

@ -7,6 +7,8 @@ namespace Obfuz
{
private readonly List<IObfuscationPass> _passes = new List<IObfuscationPass>();
public bool Empty => _passes.Count == 0;
public Pipeline AddPass(IObfuscationPass pass)
{
_passes.Add(pass);