Перехват NtDebugActiveProcess

Тема в разделе "WASM.WIN32", создана пользователем Crash, 9 июл 2006.

  1. Crash

    Crash New Member

    Публикаций:
    0
    Регистрация:
    23 авг 2004
    Сообщения:
    73
    Привет всем!

    Такая проблема: пишу драйвер с перехватом функции NtDebugActiveProcess. Есть PID процесса - dwPIDToProtect. Мне нужно проверить, для этого ли процесса вызывается перехватываемая функция. Если для этого, то нужно возвратить STATUS_ACCESS_DENIED. Делаю так:

    Код (Text):
    1. //Функция-обработчик перехвата
    2. NTSTATUS NewNtDebugActiveProcess(IN HANDLE Process, IN HANDLE DebugObject) {
    3.     PPROCESS_BASIC_INFORMATION pbi = (PPROCESS_BASIC_INFORMATION)ExAllocatePool(PagedPool, sizeof(PROCESS_BASIC_INFORMATION));
    4.  
    5.     NTSTATUS ntReturn = NtQueryInformationProcess(Process, ProcessBasicInformation, pbi, sizeof(pbi), NULL);
    6.     if (ntReturn == STATUS_SUCCESS) {
    7.         ULONG ProcessId;
    8.  
    9.         __try {
    10.             ProcessId = pbi->UniqueProcessId;
    11.         } __except(EXCEPTION_EXECUTE_HANDLER) {
    12.             return STATUS_INVALID_PARAMETER;
    13.         }
    14.  
    15.         if (ProcessId == dwPIDToProtect) {
    16.             return STATUS_ACCESS_DENIED;
    17.         }
    18.     }
    19.  
    20.     ExFreePool(pbi);
    21.     return TrueNtDebugActiveProcess(Process, DebugObject);
    22. }
    Т.е. узнаю по хендлу процесса его PID. Вся проблема в том, что NtQueryInformationProcess здесь возвращает STATUS_ACCESS_VIOLATION. Не пойму из-за чего. Подскажите, пожалуйста, кто знает!
     
  2. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    Мне почему-то кажется что стоит осуществлять перехват zw... функций :)
     
  3. Crash

    Crash New Member

    Публикаций:
    0
    Регистрация:
    23 авг 2004
    Сообщения:
    73
    Почему?
     
  4. rav

    rav New Member

    Публикаций:
    0
    Регистрация:
    19 июл 2004
    Сообщения:
    159
    Адрес:
    Москва
    Вместо NtQueryInformationProcess используй ZwQueryInformationProcess и учти, что этот вызов сработает только в случае, если хендл открыт с PROCESS_QUERY_INFORMATION.
     
  5. Crash

    Crash New Member

    Публикаций:
    0
    Регистрация:
    23 авг 2004
    Сообщения:
    73
    Все, проблема решена!

    Вместо ZwQueryInformationProcess я использовал функцию

    ULONG GetPidByHandle(HANDLE PHanlde) {
    NTSTATUS st;
    PEPROCESS process;
    ULONG pId;

    st = ObReferenceObjectByHandle(PHanlde, 0, NULL, UserMode, &process, NULL);
    if (st == STATUS_SUCCESS) {
    pId = *(PULONG)(((ULONG)process) + pIdOffset);
    ObDereferenceObject(process);
    return pId;
    }
    return 0;
    }

    Спасибо Ms-Rem'у! И всем, кто отвечал!
     
  6. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Crash
    А в первоначальном коде у тебя видимо еще путанница с указателем на структуру и самой структурой
     
  7. Crash

    Crash New Member

    Публикаций:
    0
    Регистрация:
    23 авг 2004
    Сообщения:
    73
    Да, я это еще давно заметил и исправил.