2017-02-23 78 views
-1

当我们从存储器(MODULE/Process)转储PE时,为什么不执行未映射?为什么我们需要取消映射才能成为PE文件有效?

PE在内存中发生了哪些变化,使其无法直接执行?

+1

很难猜测“不执行”可能意味着什么。卸载一个DLL,但仍然对导入的DLL函数进行生命调用是一个非常常见的错误。幸运的是,如果它产生了一个AVE,如果发布的地址空间被另一个DLL重用,这真是糟糕的一天。 –

+0

“内存转储”是什么意思?虽然它已经在执行,或者您只是加载并映射它,并在第一条指令开始之前将其转储?有很大区别... – Devolus

回答

0

映射在执行之前是必需的,因为您无法预知内存中每个DLL和其他资源的地址,以及程序中动态分配内存的地址。 PE文件头告诉操作系统如何分配.text.data内存段。

回到80年代和90年代初,你可以回忆.COM文件。这些被复制并执行的内存副本(%EIP指向它的地址)是笔直的,因为那里限制了.text数据的64kb。

+1

这与64Kb限制无关。映射是需要的,因为在早期,大多数代码并不是独立的,因此不能在不破坏它的情况下将其加载到任意地址。 – Devolus

+0

感谢您的详细信息。 –