Всем привет, решил я попрактиковаться и захукал ф-цию ZwDeleteKey код обработчика: Код (Text): NTSTATUS RegDirDefender(IN HANDLE key) { PKEY_BASIC_INFORMATION keyinfo; ULONG data; UNICODE_STRING uname; ANSI_STRING name; KIRQL Irql; __try { currentIrql = KeGetCurrentIrql(); if(currentIrql!= PASSIVE_LEVEL) { KeLowerIrql(PASSIVE_LEVEL); } ZwQueryKey(key,KeyNameInformation,NULL, 0,&data); keyinfo = ExAllocatePool(PagedPool,data); ZwQueryKey(key,KeyNameInformation,keyinfo,data,&data); RtlInitUnicodeString(&uname,keyinfo->Name); RtlUnicodeStringToAnsiString(&name,&uname,TRUE); if(strstr(name.Buffer,"lalala")!=0) { ExFreePool(keyinfo); RtlFreeAnsiString(&name); KeRaiseIrql(Irql,&Irql); return STATUS_ACCESS_DENIED; } ExFreePool(keyinfo); RtlFreeAnsiString(&name); KeRaiseIrql(Irql,&Irql); return OldDelDir(key); } __except(EXCEPTION_EXECUTE_HANDLER) { return STATUS_UNSUCCESSFUL; } } При загрузке драйвера проц загружается на 100%! Если убрать снижение IRQL то всё становится нормально, но появляются переодические бсоды из-за того что ZwQueryKey /ExAllocatePool выполняются на PASSIVE_LEVEL. Подскажите, как корректно уменьшить IRQL?
Ошибка в хуке. Callers of ZwDeleteKey must be running at IRQL = PASSIVE_LEVEL поэтому условие currentIrql!= PASSIVE_LEVEL в нормальной работе не выполняется.
Ты должен прочитать мануал и понять что никто в здравом уме не вызывает перехватываемую функцию на повышенном IRQL
shinigami1 KeRaiseIrql тоже убери. и вообще не трогай ты его. тебе не надо. а код ужасен. нигде не чекаются возвращемые значения. может все-таки ты захукал NtDeleteKey?
Great, я всё исправил уже, ошибка была в в том, что ExAllocatePool возвращал NULL частенько, надо делать проверку, а с ZwDeleteKey и NtDeleteKey, я сначала думал это одно и тоже .
Самый безопасный метод выполнять что либо на гарантированном PASSIVE_LEVEL это создать или work item или System Thread.