Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Virtual Protect, выделение памяти 
:(
    Опции темы
kin
Дата 27.10.2012, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 204
Регистрация: 9.5.2008

Репутация: нет
Всего: 6



Здравствуйте. Есть следующий участок кода:

Код

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-"Попытка обращения к неверному адресу".
PM MAIL   Вверх
bems
Дата 28.10.2012, 01:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 2
Всего: 88



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


--------------------
Обижено школьников: 8
PM MAIL   Вверх
kin
Дата 28.10.2012, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 204
Регистрация: 9.5.2008

Репутация: нет
Всего: 6



Цитата

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


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

Далее, bems, я правильно понял, что можно загрузить образ по другому адресу и обработать таблицу релокаций? Но тут же вопрос, если в exe-шнике нет релокаций, то это значит что он должен грузиться только по одному ImageBase или что в нем просто нет абсолютных адресов, и он может грузиться по любому адресу?
PM MAIL   Вверх
bems
Дата 28.10.2012, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 2
Всего: 88



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

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

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



--------------------
Обижено школьников: 8
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0415 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.