Опубликован: 27.05.2013 | Уровень: для всех | Доступ: платный | ВУЗ: Вятский государственный гуманитарный университет
Самостоятельная работа 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 >
Анар Шенер
Анар Шенер
Екатерина Гастева
Екатерина Гастева

Добрый день. Не работают ссылки для скачивания на начальном этапе первой самостоятельной работы. Возможно и далее встречаются старые ссылки. Как быть с этим?

Может есть какой-то более новый несложный курс по устройству windows c практическими заданиями?  Заранее спасибо.

"1. Скачайте и установите программу виртуализации Microsoft Virtual PC 2007 SP1, доступную по адресу:

http://www.microsoft.com/en-us/download/details.aspx?id=24439"

"Microsoft Windows Server 2003 SP1" также не находится.  

Фанис Гильманов
Фанис Гильманов
Россия, г. Нижнекамск
chunhu wu
chunhu wu
Аргентина, jhkh jk k