Реферат: Методы перехвата API-вызовов в Win32

Рассмотрим пример, реализующий описанный метод. Для осуществления перехвата и размещения функции-трамплина и функции-перехватчика я написал WDM-драйвер (с использованием Visual C++ 6.0, Windows 2000 DDK и Compuware DriverStudio 2.7), а также программу для взаимодействия с ним. Программа и драйвер расположены в каталоге DriveType1 (там же – инструкции по установке).

Пример DriveType1 состоит из двух частей – драйвера DTDrv.sys и установочного скрипта DTDrv.inf, а также программы DriveType.exe.

DriveType.exe компилируется из одного модуля DriveType.cpp, в котором реализованы пользовательский интерфейс и интерфейс с драйвером. Интерфейс с драйвером реализуется через функции CreateFile (открытие драйвера), DeviceIoControl (операции ввода-вывода) и CloseHandle (закрытие драйвера). Реализованы четыре команды, вызываемые через DeviceIoControl – перехват функции GetDriveTypeA, снятие перехвата, установка возвращаемого значения функцией перехвата для каждого из дисков A: .. Z:, чтение текущего состояния перехвата.

Ну а вся работа по перехвату делается в драйвере, за исключением того, что адрес функции GetDriveTypeA определяется также в DriveType.cpp и присылается в качестве параметра в команде перехвата. После получения этого адреса функция DTDRV_IOCTL_HOOK_Handler (из модуля DTDrvDevice.cpp) реализует перехват рассмотренным выше способом. Функция DTDRV_IOCTL_UNHOOK_Handler снимает перехват, функция DTDRV_IOCTL_SETDRIVE_Handler устанавливает значение, возвращаемое перехватчиком, функция DTDRV_IOCTL_GETSTATE_Handler возвращает значения перехвата и флаг перехвата.

Основные переменные, используемые DriveType.cpp:

unsigned char IsHook = false; //Флагперехвата

unsigned char Drives[26]; //Значенияперехвата

PUCHAR GDT; //Адрес GetDriveTypeA

В Drives[26] хранятся значения, возвращаемые функцией MGetDriveType для дисков A: .. Z: (=0xFF, если информация о диске не переопределена).

Итак, функция-трамплин NewGetDriveType будет выглядеть следующим образом:

__declspec(naked) unsigned int NewGetDriveType(LPSTR Path)

{

_asm

{

nop //Здесь будут первые 5 байт из функции GetDriveTypeA

nop //(в Win98 3 команды ассемблера)

nop

nop

nop

jmp $ //А здесь - переход к GetDriveTypeA + 5

}

}

Изначально эта функция «пустая», так как весь её код пишется во время перехвата функцией DTDRV_IOCTL_HOOK_Handler, которая, если оперировать терминами Detours, реализует динамический перехват.

ПРИМЕЧАНИЕ

Код этой функции изначально может быть любым, но он должен занимать по крайней мере 10 байт (чтобы уместились 5 байт из заголовка GetDriveTypeA и 5 байт – команда jmp).

Собственно функция-перехватчик MGetDriveType реализована в моём примере так:

unsigned int MGetDriveType(LPSTR Path) //Это – функция-перехватчик

{

unsigned int res = NewGetDriveType(Path); //Вызовемстарый GetDriveTypeA

К-во Просмотров: 355
Бесплатно скачать Реферат: Методы перехвата API-вызовов в Win32