【问题标题】:Executable sections marked as "execute" AND "read"?标记为“执行”和“读取”的可执行部分?
【发布时间】:2009-04-26 20:31:54
【问题描述】:

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

(具体来说,我说的是IMAGE_SCN_MEM_READ。)

【问题讨论】:

    标签: winapi memory executable portable-executable


    【解决方案1】:

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

    需要写拷贝有几个不同的原因:

    • 需要由加载程序重新定位的代码必须具有此设置,以便加载程序可以进行修复。这很常见。
    • 在单个部分中包含代码和数据的部分也需要此功能,以启用修改进程全局变量。单个部分中的代码和数据可以节省空间,并可能通过将代码和代码使用的全局变量放在同一页面上来改善局部性。
    • 尝试修改自身的代码。我相信这种情况相当罕见。

    【讨论】:

      【解决方案2】:

      编译时常量,特别是对于 long long 或 double 值,通常使用 mov 寄存器,address 语句从代码段加载。

      【讨论】:

        【解决方案3】:

        我能想到的一个阅读代码的例子是允许自我修改代码。代码必须能够自我阅读才能进行自我修改。

        还要考虑相反的一面。禁止代码读取自身有什么好处?我在这一点上挣扎了一会儿,但我看不出这样做有什么好处。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-05-06
          • 2017-07-07
          • 2010-09-22
          • 1970-01-01
          • 2016-10-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多