解决Import metadata缓存未更新,导致rename后有函数未改名的bug
parent
48b36d8ff2
commit
7eabfbdf08
|
@ -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);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_pipeline1.AddPass(pass);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
_pipeline.AddPass(new CleanUpInstructionPass());
|
_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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in New Issue