Создание и управление процессами и потоками
Задание 1. Исследовать структуру данных EPROCESS.
Указания к выполнению.
1. Откройте файл WRK, содержащий описание структуры EPROCESS: base\ntos\inc\ps.h, строка 238.
Замечание. Открыть описание структуры EPROCESS можно в проекте Visual Studio или в HTML документации по WRK (см. лекцию 5 "Исследовательское ядро Windows"):
Замечание. Обратите внимание, в WRK часто названия типов (раздел Types в HTML документации) начинаются с подчеркивания (_EPROCESS), при этом для типа имеется синоним (раздел Typedefs) без подчеркивания (EPROCESS). Использовать можно одинаково как типы, так и их синонимы.
2. Откройте отладчик WinDbg. Запустите процесс отладки ядра.
3. Запустите виртуальную машину Windows Server 2003 SP1 в режиме отладки.
4. Остановите выполнение виртуальной машины в отладчике, нажав Ctrl+Break или выбрав пункт меню Debug – Break или щелкнув кнопку на панели инструментов.
Внизу окна Command отладчика (View – Command) должно появиться приглашение для ввода команд kd>:
5. Введите команду: dt eprocess.
dt (display type) – команда отображения информации о типах данных и переменных.
При этом в окне команд должна отобразиться информация обо всех полях типа EPROCESS:
Слева в окне вывода указывается шестнадцатеричное смещение в байтах для поля относительно начала расположения структуры в памяти. Например, поле Pcb – первое поле (смещение 0x000 байт), представляющее собой структуру _KRPOCESS и занимающее в памяти 0x078 = 120 байт.
Замечание. Обратите внимание, что в качестве параметра команды dt мы указываем EPROCESS – синоним типа _EPROCESS. Ввод команды dt _eprocess приведет к аналогичному результату.
6. Чтобы отобразить значения полей структуры EPROCESS для какого-либо конкретного процесса, мы должны узнать адрес этой структуры в памяти. Для этого в отладчике в поле команд введите: !process 0 0.
Команда !process отображает информацию обо всех или нескольких процессах. Первый ноль в параметрах команды означает, что нужно выводить информацию о всех процессах. Если на месте первого параметра указать ID процесса или адрес в памяти его структуры EPROCESS, будет выводиться информация только о данном процессе.
Второй ноль в параметрах команды !process определяет количество информации о процессе: 0 – минимум информации, 7 – максимум информации.
На экране отобразится краткая информация о всех процессах в системе, в том числе их идентификаторы (на рисунке обведено красным) и адреса структур EPROCESS (обведено синим):
Из рисунка видно, что в данном случае ID процесса explorer.exe равен 7EC (в шестнадцатеричном виде) или 2028 (в десятичном виде), а адрес структуры EPROCESS = 81F24BD0. Имейте в виду, что при следующем запуске системы эти значения скорее всего изменятся.
Сейчас можно отображать значения полей структуры EPROCESS для процесса explorer.exe, воспользовавшись адресом структуры:
dt eprocess 81F24BD0.
Обратите внимание на идентификатор процесса – поле UniqueProcessId (его значение должно совпадать с полученным ранее идентификатором), и на файл образа процесса – поле ImageFileName (explorer.exe).
При выводе информации с помощью команды dt не отображаются значения полей внутри вложенных структур, например, поле Pcb (структура KPROCESS). Чтобы отобразить их следует использовать ключ рекурсии –rN, где N – число уровней рекурсии.
Например, команда dt eprocess 81F24BD0 -r1 позволяет получить следующий вывод (приведен не полностью):