标记为"执行"和"读取"的可执行部分?

zil*_*n01 2 memory winapi executable portable-executable

我注意到(至少在Win32上)在可执行文件中,代码段(.text)具有"读取"访问位设置,以及"执行"访问位.是否有任何真正合理的理由让代码自己阅读而不是自己执行?我认为这是其他部分的用途(例如.rdata).

(具体来说,我在谈论IMAGE_SCN_MEM_READ.)

Mic*_*ael 5

IMAGE_SCN_MEM_EXECUTE |IMAGE_SCN_MEM_READ被映射到内存中PAGE_EXECUTE_READ,相当于PAGE_EXECUTE_WRITECOPY.这是启用写时复制访问所必需的.写时复制意味着任何修改页面的尝试都会导致正在创建的页面的新的进程私有副本.

需要写入副本有几个不同的原因:

  • 需要由加载程序重定位的代码必须具有此设置,以便加载程序可以执行修复.这很常见.
  • 在单个部分中具有代码和数据的部分也需要这样,以启用修改进程全局变量.单个部分中的代码和数据可以节省空间,并且可以通过使代码和代码使用的全局变量位于同一页面上来改善位置.
  • 试图修改自身的代码.我相信这是相当罕见的.