在可移植可执行文件(PE)的各部分之间移动数据

时间:2012-02-01 18:22:00

标签: c# portable-executable

我对Portable Executable的结构有几个问题。

现在,我通过几篇写得很好的文章herehere找到了一个很好的开始。但是,我仍然没有得到答案。

我相信, ,如果我错了,请纠正我,PE结构的某个部分中的数据是由操作加载和运行的系统。例如,选择.text.data部分。

根据我所读到的内容,.data部分包含某种类型的函数,而.text部分包含要运行的实际数据。

我很想知道是否可以将文件的数据存储在.text部分中,并将其动态移动到.text部分,然后自动(加载/启动/运行)文件的数据现在位于.text部分。

如果你对我的要求感到困惑,请允许我解释一下。

  1. 哪个(在哪个部分)是存储文件的数据?
  2. 我如何在C#中的各个部分之间移动数据?我假设我必须使用指针。
  3. 我认为这样的功能会起作用吗?

2 个答案:

答案 0 :(得分:1)

  

我认为这样的功能甚至可以正常工作吗?

不:)

我根本不清楚你想要完成什么 - 你听起来像是在谈论本地PE,因为.NET PE在PE中没有其他任何东西。

在任何情况下,在加载模块(EXE或DLL)时,Windows都会映射PE,因此您无法实时修改它。

答案 1 :(得分:0)

对于本机代码PE或PE +文件,这些问题会得到很多不同的回答,而这些问题似乎是合理的。

但是,对于封装在PE中的.NET程序集,事情会发生很大变化。 PE / PE +只是OS加载程序几乎没有引用的存储容器。

可以将一个程序集加载到内存中并执行它,因此你提出的建议在理论上是可行的。但是,它与将代码从PE的一个部分移动到另一个部分无关。

您将动态分配读取/写入虚拟内存,将代码编写到其中,将属性更改为读取+执行(添加执行,删除写入),然后调用相应的.NET程序集加载程序代码。查找各种Invoke方法。