Вятский государственный гуманитарный университет
Опубликован: 27.05.2013 | Доступ: свободный | Студентов: 2828 / 632 | Длительность: 09:18:00
Самостоятельная работа 4:

Функции по управлению памятью

< Лекция 8 || Самостоятельная работа 4: 12 || Лекция 9 >

Задание 5. Просмотреть содержимое памяти, изменяемое приложением.

Указания к выполнению.

1. Удалите точку останова с функции NtAllocateVirtualMemory: в меню Edit отладчика выберите Breakpoints… и нажмите кнопку Remove All.

2. Возобновите выполнение виртуальной машины, пройдя все точки останова приложение MemoryAlloc.exe (несколько раз нажмите в отладчике F5).

3. Запустите приложение MemoryAlloc.exe ещё раз.

4. Когда сработает первая точка останова, продолжите в отладчике выполнение (нажмите F5 один раз).

5. На второй точке останова перейдите в окно виртуальной машины и посмотрите, по какому адресу оказалась зарезервирована область памяти:


6. Перейдите в отладчик и просмотрите содержимое памяти по этому адресу, введя команду:

db 340000 L1

Команда db отображает однобайтовое значение, параметр L1 указывает, что необходимо показать одно такое значение.

Как и подсказывает сообщение нашего приложения ("Write to memory area failed"), попытка записи в зарезервированную область память оказалась неудачна, значение в данной ячейке не определено:


Чтобы работать с памятью, её нужно передать (commit).

7. Нажмите в отладчике F5 – программа дойдет до третьей точки останова (после передачи памяти):


Снова просмотрите содержимое памяти по адресу 340000. Сейчас в этой ячейке должен оказаться символ ‘a’ (с шестнадцатеричным кодом 61):


Задание 6. Исследовать дескрипторы виртуальных адресов VAD.

Указания к выполнению.

1. Запустите приложение MemoryAlloc.exe. Когда сработает первая точка останова и управление перейдет к отладчику, требуется узнать адрес процесса MemoryAlloc.exe в памяти. Для этого введите команду:

!process 0 0

и найдите процесс с именем MemoryAlloc.exe:


В данном примере адрес процесса в памяти (адрес объекта EPROCESS): 81F9E320.

2. Определите адрес корня АВЛ дерева дескрипторов виртуальных адресов VadRoot.

Для этого введите команду:

!process 81F9E320 1

Адрес корня VadRoot равен 82251498.

3. Выведите на экран дерево дескрипторов виртуальных адресов процесса MemoryAlloc.exe.

Введите команду:

!vad 82251498

На экран выводится таблица со следующими столбцами:

  • VAD – адрес дескриптора виртуального адреса – узла дерева;
  • level – уровень в дереве, на котором находится узел;
  • start – номер начальной виртуальной страницы (VPN) в блоке, за который отвечает данный VAD;
  • end – номер последней виртуальной страницы в блоке;
  • commit – счетчик переданных страниц в блоке;
  • тип памяти блока;
  • параметры защиты блока;
  • файлы, отображаемые на блок памяти.

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

4. Продолжите выполнение процесса MemoryAlloc.exe, нажав F5 в отладчике. Должна сработать вторая точка останова.

Снова выведите на экран дерево дескрипторов виртуальных адресов:


Вы должны заметить, что общее количество дескрипторов увеличилось на единицу, т. е. после резервирования области памяти в приложении в дереве появился новый дескриптор по адресу 81F454E8.

Обратите внимание на номер стартовой виртуальной страницы для этого дескриптора: 340. Сравните это значение с адресом зарезервированной области памяти в приложении:


Как и отмечалось в лекции 8 "Управление памятью" номер виртуальной страницы в VAD получается путем отбрасыванием младших 12 бит (или 3 шестнадцатеричных цифр).

5. Продолжите выполнение приложения (F5). Сработает третья точка останова.

Снова выведите дерево дескрипторов виртуальных адресов: на экран:


Обратите внимание, что после передачи (commit) зарезервированной области памяти счетчик переданных страниц нового дескриптора увеличился на единицу.

Задания для самостоятельного выполнения

Задание 1. Исследуйте действие различных значений параметров защиты памяти функции VirtualAlloc на примере приложения MemoryAlloc.

Указания к выполнению.

1. На странице MSDN "Memory Protection Constants" приведено описание значений параметра flProtect функции VirtualAlloc. Попробуйте запустить приложение MemoryAlloc с разными значениями данного параметра и оцените результат.

Желательно также исследовать влияние параметра защиты на дескрипторы виртуальных адресов VAD.

Задание 2. Продолжить исследование функции NtAllocateVirtualMemory.

Указания к выполнению.

1. В основной части лабораторной работы (задание 4) осуществлялась трассировка функции NtAllocateVirtualMemory при резервировании области памяти в приложении MemoryAlloc.

Выполните трассировку данной функции при передаче (commit) области памяти (поставьте точку останова на функции NtAllocateVirtualMemory после срабатывания второй точки останова в программе MemoryAlloc.

Задание 3. Исследовать процесс трансляции виртуальных адресов.

Указания к выполнению.

1. Выполните процесс трансляции виртуального адреса из диапазона адресов области памяти, выделенной в приложении MemoryAlloc. Воспользуйтесь описанием трансляции из лекции 8 "Управление памятью" и примером из [5, стр. 456].

Задание 4. Исследовать утилиту для работы с виртуальной памятью VMMap от Sysinternals.

Указания к выполнению.

1. Скачайте утилиту VMMap по адресу:

http://technet.microsoft.com/en-us/sysinternals/dd535533

2. Исследуйте возможности утилиты на примере приложения MemoryAlloc.

< Лекция 8 || Самостоятельная работа 4: 12 || Лекция 9 >
Айрат Хисматуллин
Айрат Хисматуллин
Россия
Юрий Тарасов
Юрий Тарасов
Россия, Мегион, средняя школа №1, 1993