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

Функции для управления устройствами

< Лекция 10 || Самостоятельная работа 6: 123 || Лекция 11 >
Аннотация: Цель работы: исследовать структуры данных и функции WRK, используемые для управления устройствами.

Задание 1. Запустить приложение ReadFile.exe, установить точку останова на функции NtReadFile.

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

1. В виртуальной машине запустите приложение ReadFile.exe, разработанное в лабораторной работе 5 "Безопасность в Windows".

2. Когда сработает точка останова и управление перейдет к отладчику WinDbg, нужно установить точку останова на функции NtReadFile для процесса ReadFile.exe.

Для этого сначала следует определить адрес объекта EPROCESS для процесса ReadFile.exe при помощи команды:

!process 0 0 ReadFile.exe

В данном случае адрес равен 0x8222F630.

Установить точку останова для функции NtReadFile для процесса ReadFile.exe можно при помощи следующей команды:

bp /p 8222F630 nt!NtReadFile

Проверьте, что команда выполнена верно: в меню Edit отладчика выберите пункт Breakpoints…:


Замечание. После перезапуска процесса ReadFile.exe его адрес может поменяться. В этом случае придется удалить старую точку останова и повторить нахождение адреса объекта EPROCESS и установки новой точки останова.

3. Продолжите выполнение приложения ReadFile.exe (нажмите в отладчике F5). Должна сработать точка останова и открыться исходный код функции NtReadFile.

4. Удостоверьтесь, что поток, вызвавший функцию NtReadFile, действительно принадлежит процессу ReadFile.exe: используя клавишу F10 дойдите в отладчике до строки 112. В этом месте вызывается функция PsGetCurrentThread – получение указателя на текущий поток (посмотрите, как эта функция реализована). Чтобы произошел её вызов ещё раз нажмите F10.

После вызова функции PsGetCurrentThread в переменной CurrentThread содержится адрес объекта ETHREAD текущего потока. Этот адрес можно узнать либо наведя указатель мыши на переменную CurrentThread, либо посмотрев её значение в окне Locals (Alt+3):


В данном примере адрес структуры ETHREAD равен 0x81FB6A10.

Чтобы найти процесс, которому принадлежит текущий поток, найдите поле ThreadsProcess структуры ETHREAD, расположенной по адресу 0x81FB6A10. Это можно сделать либо введя команду:

dt ethread 81FB6A10

либо развернув переменную CurrentThread в окне Locals. На рисунке ниже показан первый способ:


Адрес структуры EPROCESS процесса-владельца текущего потока равен 0x8222F630.

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

dt eprocess 8222F630

и в поле ImageFileName будет записано имя исполняемого файла:


Ту же информацию можно получить последовательно раскрывая поля структур в окне Locals.

5. Обратите внимание на функцию ObReferenceObjectByHandle в строке 121. Эта функция по заданному дескриптору (handle) возвращает указатель на объект. В данном случае функция ObReferenceObjectByHandle по известному дескриптору файла (параметр FileHandle) возвращает указатель на объект FILE_OBJECT (параметр fileObject).

Кроме того, данная функция проверяет права доступа потока на чтение файла. Если прав недостаточно, функция сообщает об этом, возвращая соответствующее значение (STATUS_ACCESS_DENIED) переменной status.

< Лекция 10 || Самостоятельная работа 6: 123 || Лекция 11 >
Кирилл Илларионов
Кирилл Илларионов
Россия, Смоленск
Федя Mike
Федя Mike
Казахстан