使用 dnlib 的方法注入 class

Inject a class with a method using dnlib

我正在尝试使用文件中的方法注入 class。我知道 ConfuserEx 的源代码中有一个可行的解决方案,但它有点需要编辑我想避免的 dnlib 代码。

ModuleDef manifestModule = assembly.ManifestModule;
Importer importer = new Importer(manifestModule);
IMethod method = importer.Import(typeof(AntiDumpRuntime).GetMethod("Initialize"));

TypeDef type = new TypeDefUser("AntiDump");
type.Methods.Add(method.ResolveMethodDefThrow()); // dnlib.DotNet.MemberRefResolveException: 'Could not resolve method: System.Void Obfuscator.Core.Protections.AntiDump.AntiDumpRuntime::Initialize() (Obfuscator, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null)'
manifestModule.Types.Add(type);

在上面的代码片段中,我尝试通过 Importer class 来做到这一点,但它在注释行上引发了异常。

这是 ConfuserEx 的解决方案: https://github.com/yck1509/ConfuserEx/blob/master/Confuser.Core/Helpers/InjectHelper.cs 这是需要在 dnlib 中完成的修改:https://github.com/yck1509/dnlib/blob/master/src/DotNet/Importer.cs#L72

最新版本的 dnlib 包含使其正常工作所需的更改。导入器有一个允许设置 ImportMapper 实现的构造函数。使用它,您可以使用默认版本的 dnlib 正确地注入代码。

我正在维护 fork 的 ConfuserEx,它使用 dnlib 而不进行修改。所以它工作正常。