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