Сейчас на форуме: zds, UniSoft (+5 невидимых)

 eXeL@B —› Программирование —› Гранулирование страниц памяти в VirtualAllocEx
Посл.ответ Сообщение

Ранг: 3.1 (гость)
Активность: 0=0
Статус: Участник

Создано: 14 марта 2013 12:02
· Личное сообщение · #1

Может кто-нибудь встречался с подобным: выделяю память во внешнем процессе через VirtualAllocEx, задаю конкретно нужный адрес 0x00686000 и размер блока 0x00C2D000. Память выделяется,но адрес съезжает на 0x00680000. То есть операционная система сама корректирует разбивку страниц памяти исходя из оптимальных по её мнению критерием.
А можно сделать так,чтобы всё таки VirtualAllocEx игнорировала ОС и выделяла именно адрес 0x00686000 ?



Ранг: 369.8 (мудрец), 400thx
Активность: 0.390
Статус: Участник

Создано: 14 марта 2013 12:25
· Личное сообщение · #2

Гранулярность резервирования адресного пространства - 64к, виртуалалок выравнивает по гранулярности, читай MSDN.
Выделение памяти по заданному адресу не гарантируется, т.к. она может быть уже занята. Изменить нельзя. В твоем случае советую выделять больше чем надо и выравнивать как тебе хочется.

-----
PGP key <0x1B6A24550F33E44A>




Ранг: 3.1 (гость)
Активность: 0=0
Статус: Участник

Создано: 14 марта 2013 12:37
· Личное сообщение · #3

Ну вообще я так и пытаюсь сейчас сделать: выделяю регион через VirtualAllocEx размером addr+0x00000100,
а потом через VirtualQuery получить данные о блоке памяти из структуры MEMORY_BASIC_INFORMATION.
Единственное непонятно,как получить указатель на новый буфер?
Первоначальная извращенная мысль была удалить блок через VirtualFree и перезагрузить по новой VirtualAlloc уже в самом процессе-жертве.



Ранг: 17.7 (новичок), 13thx
Активность: 0.010
Статус: Участник

Создано: 14 марта 2013 12:42 · Поправил: Artem_N
· Личное сообщение · #4

Здесь пишут всякое про dwReserveSize. Возможно, поможет. А далее как предложил ntldr.



Ранг: 4.7 (гость), 2thx
Активность: 0=0
Статус: Участник

Создано: 14 марта 2013 12:46 · Поправил: Ripped_Boy
· Личное сообщение · #5

Тут тоже кое что есть

| Сообщение посчитали полезным: MagicLan

Ранг: 369.8 (мудрец), 400thx
Активность: 0.390
Статус: Участник

Создано: 14 марта 2013 12:54
· Личное сообщение · #6

MagicLan пишет:
выделяю регион через VirtualAllocEx размером addr+0x00000100

Нужно выделять размером needed + ((size_t)ptr - ((size_t)ptr & ~(65536 - 1)))
Вместо 64к правильно будет взять GetSystemInfo->dwAllocationGranularity

MagicLan пишет:
Единственное непонятно,как получить указатель на новый буфер?

Ты же указатель не получаешь а задаешь. Считай размер по вышеназванной формуле и всё, больше ничего не надо делать.

-----
PGP key <0x1B6A24550F33E44A>


| Сообщение посчитали полезным: MagicLan

Ранг: 3.1 (гость)
Активность: 0=0
Статус: Участник

Создано: 14 марта 2013 13:42
· Личное сообщение · #7

ntldr пишет:
Ты же указатель не получаешь а задаешь

Он задается в одном процессе,а данные пишутся уже в другом.Нужно либо передать буфер,либо заново получить. Придется городить либо DuplicateHandle,либо через VirtualQuery как-то получить этот буфер и записать в него данные


 eXeL@B —› Программирование —› Гранулирование страниц памяти в VirtualAllocEx
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати