修复没有遍历代码中的MemberRef,导致重命名函数和代码后未修复函数体中的泛型类的成员调用
parent
0bc9ea41d4
commit
0cbe09287d
|
@ -25,7 +25,7 @@ namespace Obfuz.Emit
|
||||||
_initializeArray = mod.Import(typeof(System.Runtime.CompilerServices.RuntimeHelpers).GetMethod("InitializeArray", new[] { typeof(Array), typeof(RuntimeFieldHandle) }));
|
_initializeArray = mod.Import(typeof(System.Runtime.CompilerServices.RuntimeHelpers).GetMethod("InitializeArray", new[] { typeof(Array), typeof(RuntimeFieldHandle) }));
|
||||||
Assert.IsNotNull(_initializeArray);
|
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) }));
|
_encryptBlock = mod.Import(encryptionService.GetMethod("EncryptBlock", new[] { typeof(byte[]), typeof(int), typeof(int) }));
|
||||||
Assert.IsNotNull(_encryptBlock);
|
Assert.IsNotNull(_encryptBlock);
|
||||||
_decryptBlock = mod.Import(encryptionService.GetMethod("DecryptBlock", new[] { typeof(byte[]), typeof(int), typeof(int) }));
|
_decryptBlock = mod.Import(encryptionService.GetMethod("DecryptBlock", new[] { typeof(byte[]), typeof(int), typeof(int) }));
|
||||||
|
|
|
@ -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)
|
private void BuildRefFieldMetasMap(Dictionary<FieldDef, RefFieldMetas> refFieldMetasMap)
|
||||||
{
|
{
|
||||||
foreach (ModuleDef mod in _obfuscatedAndNotObfuscatedModules)
|
foreach (ModuleDef mod in _obfuscatedAndNotObfuscatedModules)
|
||||||
{
|
{
|
||||||
foreach (MemberRef memberRef in mod.GetMemberRefs())
|
foreach (MemberRef memberRef in WalkMemberRefs(mod))
|
||||||
{
|
{
|
||||||
if (!memberRef.IsFieldRef)
|
if (!memberRef.IsFieldRef)
|
||||||
{
|
{
|
||||||
|
@ -370,7 +391,7 @@ namespace Obfuz.ObfusPasses.SymbolObfus
|
||||||
{
|
{
|
||||||
foreach (ModuleDef mod in _obfuscatedAndNotObfuscatedModules)
|
foreach (ModuleDef mod in _obfuscatedAndNotObfuscatedModules)
|
||||||
{
|
{
|
||||||
foreach (MemberRef memberRef in mod.GetMemberRefs())
|
foreach (MemberRef memberRef in WalkMemberRefs(mod))
|
||||||
{
|
{
|
||||||
if (!memberRef.IsMethodRef)
|
if (!memberRef.IsMethodRef)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -6,7 +6,8 @@ using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace Obfuz
|
namespace Obfuz
|
||||||
{
|
{
|
||||||
public static class EncryptionService
|
|
||||||
|
public static class EncryptionService<T> where T : IEncryptionScope
|
||||||
{
|
{
|
||||||
private static IEncryptor _encryptor;
|
private static IEncryptor _encryptor;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue