Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Virtual Protect, выделение памяти


Автор: kin 27.10.2012, 14:39
Здравствуйте. Есть следующий участок кода:

Код

const DWORD ImageBase=0x00400000;
...
...
...
PIMAGE_NT_HEADERS nt=MakePtr(PIMAGE_NT_HEADERS, image, dos->e_lfanew);

LPVOID HeaderBase=VirtualAlloc((void*)ImageBase, nt->OptionalHeader.SizeOfHeaders, MEM_COMMIT, PAGE_READWRITE);
memcpy(HeaderBase, image, nt->OptionalHeader.SizeOfHeaders);


Итак, мне нужно в процессе работы программы выделить участок памяти равный размеру X по адресу 0x00400000 (Базовый адрес загрузки PE файлов по умолчанию). ImageBase моего exe - 0x00500000.

Проблема: 
У VirtualAlloc выделяет память  не всегда; когда выделяет, когда нет. Поработав с отладчиком, увидел, что иногда по данному адресу уже лежат какие-то данные, либо этот участок зарезервирован. Наверное в связи с этим, VirtualAlloc и возвращает NULL. 

Вопрос:
Как можно указать в моем приложении PE загрузчику (может директивы какие и пр.), чтобы он не проецировал ничего на такой-то участок памяти, не резервировал его и пр.? Так как, данные мне нужно разместить именно в этом участке и ни в каком другом.

Если что-то не понятно, спрашивайте.

P.S. Ставил GetLastError после VirtualProtect. Код ошибки почему-то тоже не постоянный. То 87-"Параметр задан неверно", то 487-"Попытка обращения к неверному адресу".

Автор: bems 28.10.2012, 01:25
Только успеть зарезервировать этот регион раньше. Что мешает работать по другому адресу? Если отсутствие релоков в экзешнике, то в этой ситуации и виндовый загрузчик не загрузит

Автор: kin 28.10.2012, 13:47
Цитата

Только успеть зарезервировать этот регион раньше. 


Тогда, получается, это нужно делать тогда еще до запуска моего приложения, чтобы загрузчик не успел спроецировать туда данные. Этот вариант разумеется отпадает.

Далее, bems, я правильно понял, что можно загрузить образ по другому адресу и обработать таблицу релокаций? Но тут же вопрос, если в exe-шнике нет релокаций, то это значит что он должен грузиться только по одному ImageBase или что в нем просто нет абсолютных адресов, и он может грузиться по любому адресу?

Автор: bems 28.10.2012, 14:02
Цитата(kin @  28.10.2012,  13:47 Найти цитируемый пост)
я правильно понял, что можно загрузить образ по другому адресу и обработать таблицу релокаций?
правильно

Цитата(kin @  28.10.2012,  13:47 Найти цитируемый пост)
если в exe-шнике нет релокаций, то это значит что он должен грузиться только по одному ImageBase
да. Для экзешников так делают, потому что на момент загрузки образа адресное пространство практически пусто, а для дллок отсутствие релоков означает что зачастую образ не будет загружаться

Цитата(kin @  28.10.2012,  13:47 Найти цитируемый пост)
или что в нем просто нет абсолютных адресов, и он может грузиться по любому адресу? 
это экзотика, в нормальных модулях они обычно есть.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)