green_newbie совсем недавно KAV5 как раз валился из юзермода и как раз по причине кривого обработчика NtCreateFile
UNICODE_STRING с именем имеет например вид: Код (Text): UNICODE_STRING name = {10, 10, (PVOID *) 1}; Это можно еще обойти, поставив if (addr >= 0x1000) А как насчет: Код (Text): UNICODE_STRING name = {10, 10, (PVOID *) <адрес невыделенной памяти>}; Именно для исключения таких ситуаций и предназначена MmProbeAndLockPages.
Код (Text): ProbeForRead: { if (Length != 0) if (((ULONG_PTR) Address & (Alignment -1)) != 0)) { ExRaiseDatatypeMisalignment(); } else if ((((ULONG_PTR) Address + Length) < (ULONG_PTR) Address) || (((ULONG_PTR) Address + Length) > (ULONG_PTR)MM_USER_PROBE_ADDRESS)) { ExRaiseAccessViolation(); } } И? Эта функция сильно помогает?
gilg, не могу понять, все вроде работает, но до поры... Такая фигня: - запускаю драйвер; - обращаюсь к запрещенному файлу, система его не находит (т.е. все нормально); - отключаю драйвер; - закрываю приложение, через которое пытался обратиться к файлу - БСОД. Вот код фильтра (вместе с твоим кодом): Код (Text): PWCHAR wcsFileName; wchar_t *pdest; wchar_t ch = '\\'; void* pMdl1; void* pMdl2; void* pMdl3; UNICODE_STRING uniFileName, uniHideDirFile; BOOLEAN locked1 = FALSE, locked2 = FALSE, locked3 = FALSE; RtlInitUnicodeString(&uniHideDirFile, L"test.e"); DbgPrint("Started"); if (ExGetPreviousMode() == UserMode) { pMdl1 = IoAllocateMdl(ObjectAttributes, sizeof(ObjectAttributes), FALSE, FALSE, NULL); if (pMdl1 == NULL) goto done; __try { MmProbeAndLockPages(pMdl1, KernelMode, IoModifyAccess); } __except(EXCEPTION_EXECUTE_HANDLER) { DbgPrint("bla-bla-bla1: error"); goto done; } locked1 = TRUE; pMdl2 = IoAllocateMdl(ObjectAttributes->ObjectName, sizeof(UNICODE_STRING), FALSE, FALSE, NULL); if (pMdl2 == NULL) goto done; __try { MmProbeAndLockPages(pMdl2, KernelMode, IoModifyAccess); } __except(EXCEPTION_EXECUTE_HANDLER) { DbgPrint("bla-bla-bla2: error"); goto done; } locked2 = TRUE; pMdl3 = IoAllocateMdl(ObjectAttributes->ObjectName->Buffer, ObjectAttributes->ObjectName->Length, FALSE, FALSE, NULL); if (pMdl3 == NULL) goto done; __try { MmProbeAndLockPages(pMdl3, KernelMode, IoModifyAccess); } __except(EXCEPTION_EXECUTE_HANDLER) { DbgPrint("bla-bla-bla3: error"); goto done; } locked3 = TRUE; // Start wcsFileName = ObjectAttributes->ObjectName->Buffer; pdest = wcsrchr(wcsFileName, ch); if (pdest > 0) { RtlInitUnicodeString(&uniFileName, pdest+1); if (RtlCompareUnicodeString(&uniFileName, &uniHideDirFile, TRUE ) == 0) return STATUS_OBJECT_NAME_NOT_FOUND; } else { if (wcslen(wcsFileName) > 0) RtlInitUnicodeString(&uniFileName, wcsFileName); if (RtlCompareUnicodeString(&uniFileName, &uniHideDirFile, TRUE ) == 0) return STATUS_OBJECT_NAME_NOT_FOUND; } // End done: if (locked1) MmUnlockPages(pMdl1); if (locked2) MmUnlockPages(pMdl2); if (locked3) MmUnlockPages(pMdl3); if (pMdl1 != NULL) IoFreeMdl(pMdl1); if (pMdl2 != NULL) IoFreeMdl(pMdl2); if (pMdl3 != NULL) IoFreeMdl(pMdl3); } return TrueNtCreateFile(FileHandle,DesiredAccess,ObjectAttributes,IoStatusBlock, AllocationSize,FileAttributes,ShareAccess,CreateDisposition, CreateOptions,EaBuffer,EaLength); Твой код работает нормально, дело в моем обработчике но не могу понять в чем именно...
По всей видимости, бсод связан с тем, что система не может освободить залоченные страницы Код (Text): NTSTATUS status = STATUS_SUCCESS; ..................................... wcsFileName = ObjectAttributes->ObjectName->Buffer; pdest = wcsrchr(wcsFileName, ch); if (pdest > 0) { RtlInitUnicodeString(&uniFileName, pdest+1); if (RtlCompareUnicodeString(&uniFileName, &uniHideDirFile, TRUE ) == 0){ status = STATUS_OBJECT_NAME_NOT_FOUND; goto done; } } else { if (wcslen(wcsFileName) > 0) RtlInitUnicodeString(&uniFileName, wcsFileName); if (RtlCompareUnicodeString(&uniFileName, &uniHideDirFile, TRUE ) == 0) { status = STATUS_OBJECT_NAME_NOT_FOUND; goto done; } } // End done: ........................ if (status == STATUS_SUCCESS) TrueNtCreateFile(); return status;
Ты имел ввиду? Код (Text): if (status == STATUS_SUCCESS) [b]return[/b] TrueNtCreateFile([b]params[/b]); return status;
Вроде помгло. Такой еще вопрос: можно ли все это применить при перехвате ntOpenFile? Или там можно проще...
Все функции в общем-то перехватываются одинаково. Жизнь можно упростить, если перехватывать IoCreateFile, - тогда достаточно одного перехвата. Но хукать ее надо сплайсингом, т.к. это не сервисная функция.
Со сплайсингом я пока не дружу в должной степени, так что остановимся на дублировании... Спасибо glig!