首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用dnlib重写.NET堆中的字符串

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

Stack Overflow用户
提问于 2015-04-09 16:25:08
回答 1查看 2.8K关注 0票数 0

我需要在.NET文件中重写#US堆中的字符串。我决定使用看起来像一个强大的库的德尼布来操作.NET文件。不幸的是,它没有得到充分的记录。

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

代码语言:javascript
复制
ModuleDefMD module = ModuleDefMD.Load("test.dll");

现在,dnlib有Writer命名空间,建议应该使用它来写入.NET结构。它包含了看起来很有前途的班级

作者似乎需要创建可以处理的元数据:

代码语言:javascript
复制
dnlib.DotNet.Writer.MetaData metadata = dnlib.DotNet.Writer.MetaData.Create(module, null, null, null);

在USHeap类中,有描述方法“重写应该写入堆的值”。其余的还不清楚,让我们无论如何使用它来编写3个原始的任意字节。根据CLI标准,第一个有效偏移量为1:

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

dnlib示例展示了如何编写文件:

代码语言:javascript
复制
module.Write("test-out.dll");

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

我好像不知道作家是怎么工作的。研究源文件并不容易,因为dnlib包含相当多的源文件和行。

dnlib文档指的是使用dnlib操作文件的ConfuserEx混淆器.然而,从它的来源来看,它似乎根本没有操纵#US堆。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-10 17:52:48

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

有一个例子你可以看看:https://github.com/0xd4d/dnlib/blob/master/Examples/Example6.cs

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29543935

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档