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

if (Letter >= 'a' && Letter <= 'z') Letter- = 'a' - 'A'; //Заглавные

if (Letter >= 'A' && Letter <= 'Z')

{

unsigned char NewRes = Drives[Letter - 'A'];

if (NewRes < 0xFF) res = NewRes; //Если диск переназначен, вернём значение из таблицы

}

return res;

}

Сначала вызывается функция-трамплин NewGetDriveType, которая фактически выполняет код оригинальной GetDriveTypeA (сначала выполняются первые 5 байт – это 3 команды ассемблера, затем – всё остальное). После этого определяется буква диска. Преобразование буквы в верхний регистр осуществляется вручную. Далее, если данный диск перехвачен, возвращается значение из массива Drives, в противном случае – то, которое вернула NewGetDriveType.

Перехват реализован в функции DTDRV_IOCTL_HOOK_Handler следующим образом:

NTSTATUS DTDrvDev::DTDRV_IOCTL_HOOK_Handler(KIrp I)

{

NTSTATUS status = STATUS_SUCCESS;

I.Information() = 0;

if (IsHook)

return status;

#pragma pack(push, 1) //Включимвыравниваниепограницебайта

struct

{

UCHAR Byte0;

ULONG Byte1_4;

} Patch = {0xE9}; //Кодинструкции jmp

#pragma pack(pop) //Вернёмвыравниваниепоумолчанию

KIRQL oldirql;

KeRaiseIrql(DISPATCH_LEVEL, &oldirql); //Поднимем IRQL до DISPATCH_LEVEL

GDT = (PUCHAR)*(PULONG)I.IoctlBuffer(); //GDT = Адрес GetDriveTypeA

RtlCopyMemory(NewGetDriveType, GDT, 5); //Заголовок NewGetDriveType

Patch.Byte1_4 = (ULONG)GDT - (ULONG)NewGetDriveType - 5;

RtlCopyMemory((PVOID)((ULONG)NewGetDriveType + 5), &Patch, 5); //jmp GetDriveTypeA + 5

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