Проблема с перехватом ntCreateFile

Тема в разделе "WASM.WIN32", создана пользователем Progr, 8 ноя 2006.

  1. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    green_newbie
    совсем недавно KAV5 как раз валился из юзермода и как раз по причине кривого обработчика NtCreateFile :)
     
  2. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    UNICODE_STRING с именем имеет например вид:

    Код (Text):
    1. UNICODE_STRING name = {10, 10, (PVOID *) 1};
    Это можно еще обойти, поставив if (addr >= 0x1000)
    А как насчет:
    Код (Text):
    1. UNICODE_STRING name = {10, 10, (PVOID *) <адрес невыделенной памяти>};
    Именно для исключения таких ситуаций и предназначена MmProbeAndLockPages.
     
  3. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Код (Text):
    1. ProbeForRead:
    2.  
    3. {
    4.     if (Length != 0)
    5.        if (((ULONG_PTR) Address & (Alignment -1)) != 0)) {
    6.            ExRaiseDatatypeMisalignment();
    7.        } else if ((((ULONG_PTR) Address + Length) < (ULONG_PTR) Address) ||
    8.                    (((ULONG_PTR) Address + Length) > (ULONG_PTR)MM_USER_PROBE_ADDRESS)) {
    9.            ExRaiseAccessViolation();
    10.        }
    11. }
    И? Эта функция сильно помогает?
     
  4. Progr

    Progr New Member

    Публикаций:
    0
    Регистрация:
    8 ноя 2006
    Сообщения:
    48
    gilg, не могу понять, все вроде работает, но до поры...
    Такая фигня:
    - запускаю драйвер;
    - обращаюсь к запрещенному файлу, система его не находит (т.е. все нормально);
    - отключаю драйвер;
    - закрываю приложение, через которое пытался обратиться к файлу - БСОД.

    Вот код фильтра (вместе с твоим кодом):

    Код (Text):
    1.     PWCHAR wcsFileName;
    2.  
    3.     wchar_t *pdest;
    4.     wchar_t ch = '\\';
    5.     void* pMdl1;
    6.     void* pMdl2;
    7.     void* pMdl3;
    8.     UNICODE_STRING uniFileName, uniHideDirFile;
    9.     BOOLEAN locked1 = FALSE, locked2 = FALSE, locked3 = FALSE;
    10.  
    11.     RtlInitUnicodeString(&uniHideDirFile, L"test.e");
    12.     DbgPrint("Started");
    13.     if (ExGetPreviousMode() == UserMode) {
    14.         pMdl1 = IoAllocateMdl(ObjectAttributes, sizeof(ObjectAttributes), FALSE, FALSE, NULL);
    15.         if (pMdl1 == NULL)
    16.             goto done;
    17.         __try {
    18.             MmProbeAndLockPages(pMdl1, KernelMode, IoModifyAccess);
    19.         } __except(EXCEPTION_EXECUTE_HANDLER) {
    20.             DbgPrint("bla-bla-bla1: error");
    21.             goto done;
    22.         }
    23.         locked1 = TRUE;
    24.         pMdl2 = IoAllocateMdl(ObjectAttributes->ObjectName, sizeof(UNICODE_STRING), FALSE, FALSE, NULL);
    25.         if (pMdl2 == NULL)
    26.             goto done;
    27.         __try {
    28.             MmProbeAndLockPages(pMdl2, KernelMode, IoModifyAccess);
    29.         } __except(EXCEPTION_EXECUTE_HANDLER) {
    30.             DbgPrint("bla-bla-bla2: error");
    31.             goto done;
    32.         }
    33.         locked2 = TRUE;
    34.         pMdl3 = IoAllocateMdl(ObjectAttributes->ObjectName->Buffer, ObjectAttributes->ObjectName->Length, FALSE, FALSE, NULL);
    35.         if (pMdl3 == NULL)
    36.             goto done;
    37.         __try {
    38.             MmProbeAndLockPages(pMdl3, KernelMode, IoModifyAccess);
    39.         } __except(EXCEPTION_EXECUTE_HANDLER) {
    40.             DbgPrint("bla-bla-bla3: error");
    41.             goto done;
    42.         }
    43.         locked3 = TRUE;
    44.    
    45. // Start
    46.         wcsFileName = ObjectAttributes->ObjectName->Buffer;
    47.         pdest = wcsrchr(wcsFileName, ch);
    48.         if (pdest > 0) {
    49.             RtlInitUnicodeString(&uniFileName, pdest+1);
    50.             if (RtlCompareUnicodeString(&uniFileName, &uniHideDirFile, TRUE ) == 0)
    51.                 return STATUS_OBJECT_NAME_NOT_FOUND;
    52.         } else {
    53.         if (wcslen(wcsFileName) > 0)
    54.             RtlInitUnicodeString(&uniFileName, wcsFileName);
    55.             if (RtlCompareUnicodeString(&uniFileName, &uniHideDirFile, TRUE ) == 0)
    56.                 return STATUS_OBJECT_NAME_NOT_FOUND;
    57.     }
    58. // End
    59. done:
    60.         if (locked1)
    61.                  MmUnlockPages(pMdl1);
    62.         if (locked2)
    63.             MmUnlockPages(pMdl2);
    64.         if (locked3)
    65.                      MmUnlockPages(pMdl3);
    66.             if (pMdl1 != NULL)
    67.             IoFreeMdl(pMdl1);
    68.         if (pMdl2 != NULL)
    69.                      IoFreeMdl(pMdl2);
    70.             if (pMdl3 != NULL)
    71.             IoFreeMdl(pMdl3);
    72.     }
    73.     return TrueNtCreateFile(FileHandle,DesiredAccess,ObjectAttributes,IoStatusBlock,
    74.                     AllocationSize,FileAttributes,ShareAccess,CreateDisposition,
    75.                             CreateOptions,EaBuffer,EaLength);
    Твой код работает нормально, дело в моем обработчике но не могу понять в чем именно...
     
  5. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    По всей видимости, бсод связан с тем, что система не может освободить залоченные страницы
    Код (Text):
    1.         NTSTATUS status = STATUS_SUCCESS;
    2.         .....................................
    3.         wcsFileName = ObjectAttributes->ObjectName->Buffer;
    4.         pdest = wcsrchr(wcsFileName, ch);
    5.         if (pdest > 0) {
    6.             RtlInitUnicodeString(&uniFileName, pdest+1);
    7.             if (RtlCompareUnicodeString(&uniFileName, &uniHideDirFile, TRUE ) == 0){
    8.                 status = STATUS_OBJECT_NAME_NOT_FOUND;
    9.                 goto done;
    10.             }
    11.         } else {
    12.         if (wcslen(wcsFileName) > 0)
    13.             RtlInitUnicodeString(&uniFileName, wcsFileName);
    14.             if (RtlCompareUnicodeString(&uniFileName, &uniHideDirFile, TRUE ) == 0) {
    15.                 status = STATUS_OBJECT_NAME_NOT_FOUND;
    16.                 goto done;
    17.             }
    18.     }
    19. // End
    20. done:
    21. ........................
    22. if (status == STATUS_SUCCESS)
    23.     TrueNtCreateFile();
    24. return status;
     
  6. Progr

    Progr New Member

    Публикаций:
    0
    Регистрация:
    8 ноя 2006
    Сообщения:
    48
    Ты имел ввиду?

    Код (Text):
    1. if (status == STATUS_SUCCESS)
    2.     [b]return[/b] TrueNtCreateFile([b]params[/b]);
    3. return status;
     
  7. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Ну да
     
  8. Progr

    Progr New Member

    Публикаций:
    0
    Регистрация:
    8 ноя 2006
    Сообщения:
    48
    Вроде помгло.
    Такой еще вопрос: можно ли все это применить при перехвате ntOpenFile?
    Или там можно проще...
     
  9. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Все функции в общем-то перехватываются одинаково.
    Жизнь можно упростить, если перехватывать IoCreateFile, - тогда достаточно одного перехвата. Но хукать ее надо сплайсингом, т.к. это не сервисная функция.
     
  10. Progr

    Progr New Member

    Публикаций:
    0
    Регистрация:
    8 ноя 2006
    Сообщения:
    48
    Со сплайсингом я пока не дружу в должной степени, так что остановимся на дублировании...
    Спасибо glig!