【发布时间】:2020-05-01 01:46:38
【问题描述】:
目前我正在研究一种 .NET 程序集保护器/修补程序。
问题是,在某种动态代码注入(通过 MethodBody.ILProcessor.Emit() 系列例程执行)之后,新添加的类型、方法和其他工件,取自已编译的模板程序集,将被放置在目标程序集中。因此,注入后,目标程序集被修改,没有对模板程序集的引用。在此类操作(类型、方法等复制)之后,注入工件(类型、方法等)的元数据标记无效(即,模板程序集中的所有 MethodDefinition-s 在被复制到目标程序集,接收元数据标记,对应于 RID == 0 的 MethodDefinition-s)。但是尝试保存目标程序集没有任何效果,因为它已被使用,因此尽管目标程序集加载为:AssemblyDefinition target = AssemblyDefinition.ReadAssembly(path, new ReaderParameters(ReadingMode.Immediate));
所以,我的问题是:有没有办法(在 Mono.Cecil 中)使所有元数据令牌分层更新(即接收 RID != 0 的 RID),而无需实际写入文件?或者至少手动分配/分发元数据令牌?
附:提前致谢!
【问题讨论】:
标签: c# .net clr cil mono.cecil