使用dnlib重写.NET CLR堆中的字符串

时间:2015-04-09 16:25:09

标签: c# .net disassembly dnlib

我需要在.NET文件中的#US堆中重写字符串。我决定使用dnlib看起来像一个强大的库来操作.NET文件。遗憾的是,它没有被记录在案。

我按常规方式加载文件。 ModuleDefMD Load()方法似乎是加载文件的唯一方法:

ModuleDefMD module = ModuleDefMD.Load("test.dll");

现在,dnlib具有Writer命名空间,表明它应该用于写入.NET结构。它包含看起来很有希望的USHeap class

似乎Writer需要创建可以使用的元数据:

dnlib.DotNet.Writer.MetaData metadata = dnlib.DotNet.Writer.MetaData.Create(module, null, null, null);

在USHeap类中,SetRawData() methoddescription"覆盖应该写入堆的值#34;。其余的不清楚,让我们使用它来编写3个原始任意字节。根据CLI标准,第一个有效偏移量为1:

byte[] raw_data = { 0x61, 0x62, 0x63 };   // "abc"
uint offset = 1;   // the least valid offset in #US heap
metadata.USHeap.SetRawData(offset, raw_data);

dnlib Examples显示如何编写文件:

module.Write("test-out.dll");

此代码编译并运行且没有错误。不幸的是,新文件具有与原始文件相同的#US流内容。

我似乎并不了解Writer的工作原理。研究资源并不容易,因为dnlib包含很多源文件和行。

dnlib documentation引用ConfuserEx - 使用dnlib来操作文件的混淆器。但是,看看它的来源,它似乎根本没有操纵#US堆。

1 个答案:

答案 0 :(得分:4)

在调用module.Write()之前,初始化一个writer选项类。将侦听器设置为编写器侦听器,然后将选项传递给Write()。在某些编写器事件之后,您可以在将元数据写入文件之前开始操作元数据。然后,您可以将任意字符串添加到#US堆或任何其他堆中。

您可以查看一个示例:https://github.com/0xd4d/dnlib/blob/master/Examples/Example6.cs