Функции для управления устройствами
Задание 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.