修复没有遍历代码中的MemberRef,导致重命名函数和代码后未修复函数体中的泛型类的成员调用

backup
walon 2025-05-16 09:55:04 +08:00
parent 0bc9ea41d4
commit 0cbe09287d
4 changed files with 57 additions and 4 deletions

View File

@ -25,7 +25,7 @@ namespace Obfuz.Emit
_initializeArray = mod.Import(typeof(System.Runtime.CompilerServices.RuntimeHelpers).GetMethod("InitializeArray", new[] { typeof(Array), typeof(RuntimeFieldHandle) }));
Assert.IsNotNull(_initializeArray);
Type encryptionService = typeof(EncryptionService);
Type encryptionService = typeof(EncryptionService<DefaultStaticEncryptionScope>);
_encryptBlock = mod.Import(encryptionService.GetMethod("EncryptBlock", new[] { typeof(byte[]), typeof(int), typeof(int) }));
Assert.IsNotNull(_encryptBlock);
_decryptBlock = mod.Import(encryptionService.GetMethod("DecryptBlock", new[] { typeof(byte[]), typeof(int), typeof(int) }));

View File

@ -274,11 +274,32 @@ namespace Obfuz.ObfusPasses.SymbolObfus
}
}
private IEnumerable<MemberRef> WalkMemberRefs(ModuleDef mod)
{
foreach (TypeDef type in mod.GetTypes())
{
foreach (MethodDef method in type.Methods)
{
if (!method.HasBody)
{
continue;
}
foreach (var instr in method.Body.Instructions)
{
if (instr.Operand is MemberRef memberRef)
{
yield return memberRef;
}
}
}
}
}
private void BuildRefFieldMetasMap(Dictionary<FieldDef, RefFieldMetas> refFieldMetasMap)
{
foreach (ModuleDef mod in _obfuscatedAndNotObfuscatedModules)
{
foreach (MemberRef memberRef in mod.GetMemberRefs())
foreach (MemberRef memberRef in WalkMemberRefs(mod))
{
if (!memberRef.IsFieldRef)
{
@ -370,7 +391,7 @@ namespace Obfuz.ObfusPasses.SymbolObfus
{
foreach (ModuleDef mod in _obfuscatedAndNotObfuscatedModules)
{
foreach (MemberRef memberRef in mod.GetMemberRefs())
foreach (MemberRef memberRef in WalkMemberRefs(mod))
{
if (!memberRef.IsMethodRef)
{

View File

@ -0,0 +1,31 @@
namespace Obfuz
{
public interface IEncryptionScope
{
}
public abstract class EncryptionScopeBase : IEncryptionScope
{
public void ForcePreserveAOT()
{
EncryptionService<EncryptionScopeBase>.Encrypt(0, 0, 0);
}
}
public struct DefaultDynamicEncryptionScope : IEncryptionScope
{
public void ForcePreserveAOT()
{
EncryptionService<DefaultDynamicEncryptionScope>.Encrypt(0, 0, 0);
}
}
public struct DefaultStaticEncryptionScope: IEncryptionScope
{
public void ForcePreserveAOT()
{
EncryptionService<DefaultStaticEncryptionScope>.Encrypt(0, 0, 0);
}
}
}

View File

@ -6,7 +6,8 @@ using System.Threading.Tasks;
namespace Obfuz
{
public static class EncryptionService
public static class EncryptionService<T> where T : IEncryptionScope
{
private static IEncryptor _encryptor;