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