Просто пытаясь создать новый раздел и настраивая его атрибуты с помощью #pragma, верните это предупреждение:

предупреждение C4330: атрибут 'write' для раздела '.mysec' игнорируется

Простой код:

#include <windows.h>
#include <stdio.h>

#pragma section(".mysec",execute,read,write)
__declspec(allocate(".mysec")) UCHAR var[] = {0xDE, 0xAD, 0xBE, 0xEF};

void main() { return; }

параметры компоновщика: / DYNAMICBASE: NO, / FIXED, / NXCOMPAT: NO, / OPT: NOREF

ОС / инструменты: Win x64 / msvc ++ 110

Я прочитал несколько статей на MSDN и, в частности, на этом http: //msdn.microsoft.com/en-us/library/50bewfwa(v=vs.110).aspx, но не нашел ответа.

Спасибо.

4
flydev 20 Мар 2013 в 06:37

2 ответа

Лучший ответ

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

Возможно, я запомнил это неправильно, но это проблема безопасности и поэтому не поддерживается.

4
Preet Sangha 20 Мар 2013 в 06:42
На данный момент компиляция без атрибута execute не дает предупреждений.
 – 
flydev
20 Мар 2013 в 06:49
1
Как и ожидалось. Флаг выполнения означает, что код будет в этом разделе. Он не поддерживает возможность записи. Удаление выполнения изменяет его на раздел данных
 – 
Preet Sangha
20 Мар 2013 в 07:18
2
Есть ли какой-либо параметр компилятора, чтобы избежать этой проверки и позволить разделу быть как исполняемым, так и доступным для записи?
 – 
Luca Reccia
29 Авг 2018 в 21:06
1
Не то, что я знаю из.
 – 
Preet Sangha
30 Авг 2018 в 23:37

Вы можете использовать командную строку компоновщика -> /SECTION:.mysec,RWE, отлично работает.

Также вы можете использовать такой инструмент, как CFF Explorer, чтобы изменить флаг раздела на E0000040 или вручную проанализировать свой PE-файл и изменить его.

1
Cyclone 6 Мар 2023 в 23:48