Реферат: Методы перехвата 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
|