Исполняемые разделы, помеченные как «выполнить» И «прочитать»? - PullRequest
2 голосов
/ 27 апреля 2009

Я заметил (по крайней мере на Win32), что в исполняемых файлах разделы кода (.text) имеют установленный бит доступа «чтение», а также бит доступа «выполнение». Существуют ли какие-либо законные причины того, что код читает сам вместо того, чтобы выполнял сам? Я думал, что это было то, для чего были другие разделы (такие как .rdata).

(В частности, я говорю о IMAGE_SCN_MEM_READ.)

Ответы [ 3 ]

5 голосов
/ 27 апреля 2009

IMAGE_SCN_MEM_EXECUTE |IMAGE_SCN_MEM_READ отображаются в память как PAGE_EXECUTE_READ, что эквивалентно PAGE_EXECUTE_WRITECOPY. Это необходимо для обеспечения доступа при копировании при записи. Копирование при записи означает, что любые попытки изменить страницу приводят к созданию новой, приватной копии процесса создаваемой страницы.

Есть несколько причин, по которым нужно писать-копировать:

  • Код, который должен быть перемещен загрузчиком, должен иметь этот набор, чтобы загрузчик мог выполнять исправления. Это очень распространено.
  • Секции, содержащие код и данные в одном разделе, также потребуются, чтобы можно было изменять глобальные переменные процесса. Код и данные в одном разделе могут сэкономить пространство и, возможно, улучшить местность, имея код и глобальные переменные, используемые кодом, на одной странице.
  • Код, который пытается изменить себя. Я считаю, что это довольно редко.
1 голос
/ 27 апреля 2009

Константы времени компиляции, особенно для длинных или длинных значений, часто загружаются в регистр mov, оператор address из сегмента кода.

0 голосов
/ 27 апреля 2009

Один пример, который я могу вспомнить по причине чтения кода, - это возможность самоизменения кода. Код должен обязательно быть в состоянии прочитать себя, чтобы быть самоизменяющимся.

Также рассмотрите противоположную сторону. Какие преимущества дает запрет на чтение кода? Я немного боролся с этим, но не вижу никакой выгоды от этого.

...