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