Указания к выполнению.
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 позволяет получить следующий вывод (приведен не полностью):
Указания к выполнению.
1. Как уже отмечалось, для получения информации о процессах используется команда !process. У неё есть следующие варианты:
!process 0 0 – отображение краткой информации о всех процессах в системе;
!process id 7 – отображение полной информации о процессе с идентификатором id;
!process id 0 – отображение краткой информации о процессе с идентификатором id;
!process address 7 – отображение полной информации о процессе с адресом address структуры EPROCESS;
!process address 0 – отображение краткой информации о процессе с адресом address структуры EPROCESS.
2. Чтобы узнать идентификатор процесса, можно воспользоваться либо командой отладчика !process (этот способ уже демонстрировался), либо специальными утилитами, например Process Explorer или Task Manager (Диспетчер задач).
Продемонстрируем второй способ на примере процесса explorer.exe.
Возобновите выполнение виртуальной машины: нажмите F5 или выберите пункт меню Debug – Go или щелкните кнопку
на панели инструментов.
На виртуальной машине запустите утилиту Process Explorer от Sysinternals.
Замечание. Утилиту Process Explorer можно скачать на сайте Sysinternals: http://technet.microsoft.com/ru-ru/sysinternals. Информацию о ней можно получить либо на том же сайте, либо в литературе [5; 2].
Идентификатор процесса указывается в поле PID (Process Identifier):
В примере на рисунке PID = 2028 (в десятичном виде) или 7EC (в шестнадцатеричном виде).
3. Остановите выполнение виртуальной машины (нажмите Ctrl+Break в отладчике).
В окне команд введите
!process 7EC 0
или
!process 81F24BD0 0
Результаты вывода почти одинаковые, за тем исключением, что в первом случае дополнительно выводится адрес таблицы дескрипторов процесса:
4. Чтобы вывести информацию о потоках процесса, наберите команду:
!process 7EC 4
Для каждого потока указывается адрес его структуры ETHREAD (на рисунке выделено красным цветом), идентификатор потока (синий цвет) и текущее состояние потока (зеленый цвет).
Для отображения полной информации о потоках процесса введите команду:
!process 7EC 7
Указания к выполнению.
1. Создайте пустой проект С/С++ в Visual Studio (Файл – Создать – Проект…) с названием CreateProcess. Выберите расположение проекта (кнопка Обзор…), например, C:\Programs:
2. Добавьте в проект файл исходного кода с расширением CPP.
Для этого щелкните правой кнопкой мыши на папке Файлы исходного кода в Обозревателе решений, выберите Добавить, затем Создать элемент…
В открывшемся окне выберите пункт Файл C++ (.cpp) и введите его название, например, main:
3. Откройте добавленный файл и вставьте в него следующий код (взят с сайта MSDN):
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
void _tmain( int argc, TCHAR *argv[] )
{
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory( si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( pi, sizeof(pi) );
// Запуск дочернего процесса
if( !CreateProcess( NULL,
"notepad.exe", // Имя образа запускаемого процесса
NULL, // Дескриптор процесса не наследуется
NULL, // Дескриптор потока не наследуется
FALSE, // Дескрипторы не наследуются
0, // Флагов создания нет
NULL, // Родительский environment block
NULL, // Родительский текущий каталог
si, // Указатель на структуру STARTUPINFO
pi ) // Указатель на PROCESS_INFORMATION
)
{
printf( "CreateProcess failed (%d).\n", GetLastError() );
return;
}
// Ожидаем, пока созданный процесс не завершится
WaitForSingleObject( pi.hProcess, INFINITE );
// Закрываем дескрипторы процесса и потока
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
}
Приведенная программа будет запускать другой процесс (в данном случае стандартное приложение Windows "Блокнот") и ждать, пока он не завершится.
4. Установите требуемые свойства проекта.
Для этого выберите конфигурацию Release на панели инструментов:
В конфигурации Release проект будет компилироваться без отладочной информации и с оптимизацией кода.
Затем щелкните правой кнопкой мыши на заголовке проекта в окне Обозреватель решений и выберите пункт Свойства (или щелкните левой кнопкой мыши на заголовке проекта и нажмите Alt+Enter):
В свойствах проекта найдите опцию Свойства конфигурации – C/C++ – Создание кода – Библиотека времени выполнения. Выберите параметр Многопоточная (/MT). Если этого не сделать, то приложение при запуске в Windows Server 2003, возможно, будет требовать библиотеку msvcr100.dll (для Visual Studio 2010).
5. Проверьте работоспособность созданного приложения.
Нажмите кнопку
на панели инструментов или нажмите F5. При появлении окна с вопросом о выполнении построения проекта выберите Да.
Если все сделано правильно, должно запуститься созданное приложение (консольное окно), а затем приложение "Блокнот".
Закройте "Блокнот" – при этом должно завершиться ваше приложение.
Указания к выполнению.
1. Исполняемый файл созданного в предыдущем пункте приложения CreateProcess.exe после компиляции проекта должен находиться в следующей папке:
c:\Programs\CreateProcess\Release.
Скопируйте исполняемый файл на виртуальную машину.
2. Проверьте работоспособность исполняемого файла на виртуальной машине. При его запуске должен запускаться "Блокнот".
3. Установите в отладчике точку останова на функции NtCreateProcessEx.
Для этого прервите выполнение виртуальной машины (Ctrl+Break в отладчике). В меню Edit выберите пункт Breakpoints…
В открывшемся окне введите команду:
bp nt!NtCreateProcessEx
и нажмите Enter.
Данная команда устанавливает точку останова на функции NtCreateProcessEx. Указание nt! означает модуль, в котором отладчику следует искать функцию. Если в данном случае не указать модуль nt (ядро), то отладчик автоматически поставит точку останова на функции NtCreateProcessEx, экспортируемой ntdll.dll.
4. Возобновите выполнение виртуальной машины (нажмите F5 в отладчике). Запустите в виртуальной машине приложение CreateProcess.
Сработает точка останова для функции NtCreateProcessEx, которая запускает приложение CreateProcess. Нас интересует запуск "Блокнота", поэтому продолжите выполнение, нажав F5 в отладчике.
Точка останова сработает второй раз – произошел вызов функции NtCreateProcessEx для запуска "Блокнота". Перейдите в отладчик. В нем должно открыться окно с исходным кодом функции NtCreateProcessEx (файл base\ntos\ps\create.c).
Проследите ход создания объекта процесс (см. лекцию 6 "Процессы и потоки", раздел "Создание процесса", шаг 3). Для этого используйте клавиши F11 – выполнение следующей команды с заходом в процедуры (Step Into) и F10 – то же самое, но процедуры выполняются за один шаг (без захода, Step Over).
Значения переменных можно отслеживать в окне Locals (Alt+3), окне Watch (Alt+2, нужно вводить интересующие переменные) или просто наводя курсор мыши на переменную в окне исходного кода.
Задание 1. Исследуйте структуру данных ETHREAD.
Указания к выполнению.
1. Используйте HTML документацию по WRK или проект Visual Studio.
2. Для просмотра полей структуры ETHREAD используйте команду:
dt ethread.
3. Для получения информации об адресах структур ETHREAD потоков процесса используйте команду:
!process id 4.
4. Для получения информации о потоке используйте команду:
!thread address,
где address – адрес структуры ETHREAD потока.
5. Для просмотра значений полей структуры ETHREAD для конкретного потока используйте команду:
dt ethread address.
Задание 2. Исследовать в отладчике ход создания потока.
Указания к выполнению.
NtCreateThread:bp nt! NtCreateThread
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.