新增 函数体混淆白名单功能
parent
bf6112a4ab
commit
ac15ef8ebc
|
@ -12,19 +12,24 @@ namespace Obfuz.ObfusPasses
|
|||
|
||||
public override void Process(ObfuscationPassContext ctx)
|
||||
{
|
||||
NotObfuscatedMethodWhiteList whiteList = ctx.whiteList;
|
||||
foreach (ModuleDef mod in ctx.toObfuscatedModules)
|
||||
{
|
||||
if (whiteList.IsInWhiteList(mod))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
// ToArray to avoid modify list exception
|
||||
foreach (TypeDef type in mod.GetTypes().ToArray())
|
||||
{
|
||||
if (type.Name.StartsWith("$Obfuz$"))
|
||||
if (whiteList.IsInWhiteList(type))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
// ToArray to avoid modify list exception
|
||||
foreach (MethodDef method in type.Methods.ToArray())
|
||||
{
|
||||
if (!method.HasBody || method.Name.StartsWith("$Obfuz$") || !NeedObfuscateMethod(method))
|
||||
if (!method.HasBody || ctx.whiteList.IsInWhiteList(method) || !NeedObfuscateMethod(method))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
|
|
@ -14,19 +14,24 @@ namespace Obfuz.ObfusPasses
|
|||
public override void Process(ObfuscationPassContext ctx)
|
||||
{
|
||||
var modules = NeedProcessNotObfuscatedAssembly ? ctx.obfuscatedAndNotObfuscatedModules : ctx.toObfuscatedModules;
|
||||
NotObfuscatedMethodWhiteList whiteList = ctx.whiteList;
|
||||
foreach (ModuleDef mod in modules)
|
||||
{
|
||||
if (whiteList.IsInWhiteList(mod))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
// ToArray to avoid modify list exception
|
||||
foreach (TypeDef type in mod.GetTypes().ToArray())
|
||||
{
|
||||
if (type.Name.StartsWith("$Obfuz$"))
|
||||
if (whiteList.IsInWhiteList(type))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
// ToArray to avoid modify list exception
|
||||
foreach (MethodDef method in type.Methods.ToArray())
|
||||
{
|
||||
if (!method.HasBody || method.Name.StartsWith("$Obfuz$") || !NeedObfuscateMethod(method))
|
||||
if (!method.HasBody || ctx.whiteList.IsInWhiteList(method) || !NeedObfuscateMethod(method))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
|
|
@ -0,0 +1,45 @@
|
|||
using dnlib.DotNet;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Obfuz.ObfusPasses
|
||||
{
|
||||
public class NotObfuscatedMethodWhiteList
|
||||
{
|
||||
|
||||
public bool IsInWhiteList(ModuleDef module)
|
||||
{
|
||||
string modName = module.Assembly.Name;
|
||||
if (modName == "Obfuz.Runtime")
|
||||
{
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public bool IsInWhiteList(MethodDef method)
|
||||
{
|
||||
if (IsInWhiteList(method.DeclaringType))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public bool IsInWhiteList(TypeDef type)
|
||||
{
|
||||
//if (type.Name.StartsWith("$Obfuz$"))
|
||||
//{
|
||||
// continue;
|
||||
//}
|
||||
if (IsInWhiteList(type.Module))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -38,7 +38,6 @@ namespace Obfuz.ObfusPasses.SymbolObfus
|
|||
|
||||
private List<ModuleDef> _toObfuscatedModules;
|
||||
private List<ModuleDef> _obfuscatedAndNotObfuscatedModules;
|
||||
private List<AssemblyReferenceInfo> _obfuzAssemblies;
|
||||
private HashSet<ModuleDef> _toObfuscatedModuleSet;
|
||||
private IObfuscationPolicy _renamePolicy;
|
||||
private INameMaker _nameMaker;
|
||||
|
@ -70,44 +69,11 @@ namespace Obfuz.ObfusPasses.SymbolObfus
|
|||
_toObfuscatedModules = ctx.toObfuscatedModules;
|
||||
_obfuscatedAndNotObfuscatedModules = ctx.obfuscatedAndNotObfuscatedModules;
|
||||
_toObfuscatedModuleSet = ctx.toObfuscatedModules.ToHashSet();
|
||||
_obfuzAssemblies = BuildAssemblyReferenceInfos(ctx);
|
||||
var obfuscateRuleConfig = new ConfigurableRenamePolicy(ctx.toObfuscatedAssemblyNames, _obfuscationRuleFiles);
|
||||
_renamePolicy = new CacheRenamePolicy(new CombineRenamePolicy(new SystemRenamePolicy(), new UnityRenamePolicy(), obfuscateRuleConfig));
|
||||
BuildCustomAttributeArguments();
|
||||
}
|
||||
|
||||
private static List<AssemblyReferenceInfo> BuildAssemblyReferenceInfos(ObfuscationPassContext ctx)
|
||||
{
|
||||
var obfuzAssemblies = new List<AssemblyReferenceInfo>();
|
||||
foreach (ModuleDef mod in ctx.obfuscatedAndNotObfuscatedModules)
|
||||
{
|
||||
var obfuzAsm = new AssemblyReferenceInfo
|
||||
{
|
||||
name = mod.Assembly.Name,
|
||||
needObfuscated = ctx.toObfuscatedModules.Contains(mod),
|
||||
module = mod,
|
||||
referenceMeAssemblies = new List<AssemblyReferenceInfo>(),
|
||||
};
|
||||
obfuzAsm.referenceMeAssemblies.Add(obfuzAsm);
|
||||
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;
|
||||
if (assByName.TryGetValue(refAssName, out var refAssembly))
|
||||
{
|
||||
//UnityEngine.Debug.Log($"assembly:{ass.name} reference to {refAssName}");
|
||||
refAssembly.referenceMeAssemblies.Add(ass);
|
||||
}
|
||||
}
|
||||
}
|
||||
return obfuzAssemblies;
|
||||
}
|
||||
|
||||
private void CollectCArgumentWithTypeOf(IHasCustomAttribute meta, List<CustomAttributeInfo> customAttributes)
|
||||
{
|
||||
int index = 0;
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
using dnlib.DotNet;
|
||||
using Obfuz.Data;
|
||||
using Obfuz.ObfusPasses;
|
||||
using Obfuz.ObfusPasses.SymbolObfus;
|
||||
using Obfuz.Utils;
|
||||
using System;
|
||||
|
@ -27,5 +28,6 @@ namespace Obfuz
|
|||
public IEncryptor encryptor;
|
||||
public ConstFieldAllocator constFieldAllocator;
|
||||
public RvaDataAllocator rvaDataAllocator;
|
||||
public NotObfuscatedMethodWhiteList whiteList;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -175,6 +175,7 @@ namespace Obfuz
|
|||
encryptor = encryptor,
|
||||
rvaDataAllocator = rvaDataAllocator,
|
||||
constFieldAllocator = constFieldAllocator,
|
||||
whiteList = new NotObfuscatedMethodWhiteList(),
|
||||
};
|
||||
pipeline.Start(_ctx);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue