Перехват NtOpenProcces

Тема в разделе "WASM.BEGINNERS", создана пользователем Denis__, 28 фев 2007.

  1. Denis__

    Denis__ New Member

    Публикаций:
    0
    Регистрация:
    5 янв 2006
    Сообщения:
    56
    Прочитал статью «Перехват API функций в Windows NT (часть 3). Нулевое кольцо.»
    Собственно драйвер NoTerminate работает через раз, файл NoTerminate.exe можно закрыть без всяких проблем, тем же TaskManager’ом.

    В чем дело и есть ли какой-нибудь более простой поиск PID в перехватчике, нежели чем через структуру CLIENT_ID. В аттаче два исходника один Ms-Rem на С, другой мой на ASM.
     
  2. k3internal

    k3internal New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2007
    Сообщения:
    607
    Код (Text):
    1. NTSTATUS  MyZwTerminateProcess(IN HANDLE ProcessHandle, IN NTSTATUS ExitStatus)
    2. {
    3.     PVOID                       pObject = NULL;
    4.     POBJECT_HANDLE_INFORMATION  HandleInformaton = NULL;
    5.     UNICODE_STRING              fNameU;
    6.    
    7.       // процесс пытается заглушить сам себя без санкции либо кто-то выпалил наш хэндл
    8.       if (ProcessHandle == 0)
    9.       {
    10.          if ((ProcessIdToHide == PsGetCurrentProcessId()) && (SetHideProcess)) return STATUS_ACCESS_DENIED;  
    11.       }
    12.       // найдём процесс по хэндлу и проверим
    13.     if (NT_SUCCESS(ObReferenceObjectByHandle(ProcessHandle,FILE_ANY_ACCESS,NULL,KernelMode,&pObject,NULL)))
    14.     {
    15.         ObDereferenceObject(pObject);  // ссылка нам больше не нужна мы получили &EPROCESS
    16.         RtlInitUnicodeString(&fNameU,L"PsGetProcessId");
    17.         if ((ProcessIdToHide == ((PVOID)((NTPROC)MmGetSystemRoutineAddress(&fNameU))(pObject))) && (SetHideProcess))  return STATUS_ACCESS_DENIED;
    18.     }
    19.     return TrueZwTerminateProcess(ProcessHandle, ExitStatus);
    20. }
     
  3. Denis__

    Denis__ New Member

    Публикаций:
    0
    Регистрация:
    5 янв 2006
    Сообщения:
    56
    Понял в чем дело, выложенные мною исходники работают,TaskManadger не может завершить процесс (что и требовалось), но может завершить задачу.
    k3internal
    Plz выложи исходник драйвера перехвата ZwTerminateProcess, а то по приведенному куску кода мало, что понятно. И еще вопрос почему ты производишь перехват функции ZwTerminateProcess, а не NtTerminateProcess?
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    [deleted]
     
  5. Cr4sh

    Cr4sh New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2006
    Сообщения:
    668
    >> Plz выложи исходник драйвера перехвата ZwTerminateProcess, а то по приведенному куску кода мало, что понятно.
    дык что конкретно здесь непонятного, я думаю здсть кроме обработчка хукнутой ф-ции (который собсно и был выложен) и не нужно ничего)
     
  6. nitrotoluol

    nitrotoluol New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2006
    Сообщения:
    848
    Точка входа у этих функций одна, так что принципиальной разницы нет

    Еще раз внимательно пречитай Рэма. Его статьи рулят.
    А поиск PID - куда уж проще??

    Тут уже я не понял.
    Т.е. приложение получает сообщение, что нужно завершиться, и далее начинает процедуру завершения, которая по идее сводится к ExitProcess----->ZwTerminateProcess
    Как в таком случае завершается задача???
     
  7. k3internal

    k3internal New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2007
    Сообщения:
    607
    nitrotoluol

    <Точка входа у этих функций одна, так что принципиальной разницы нет
    >

    Нет. Точки входа у них разные. Смотри внимательнее.

    Denis__
    <Plz выложи исходник драйвера перехвата ZwTerminateProcess, а то по приведенному куску кода мало, что понятно. И еще вопрос почему ты производишь перехват функции ZwTerminateProcess, а не NtTerminateProcess?>

    Драйвер страшный. Ты спроси что тебе непонятно. Объясню.
     
  8. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    В ntdll.dll одинаковые :P
    Хотя для r0 разные, в Zw* AFAIR устанавливается PerviusMode = KernelMode.
     
  9. rsm

    rsm New Member

    Публикаций:
    0
    Регистрация:
    2 мар 2007
    Сообщения:
    1
    Привет всем, мне нужна помощь в написании батника. Кто готов её оказать ?
     
  10. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    какого батника
     
  11. Denis__

    Denis__ New Member

    Публикаций:
    0
    Регистрация:
    5 янв 2006
    Сообщения:
    56
    k3internal

    Каким образом до обработчика MyZwTerminateProcess получем ProcessIdToHide, SetHideProcess - что это ?
     
  12. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Сыграю роль телепата :)
    SetHideProcess из контекста мне кажется, что это флаг показывающий надо ли запрещать завершение какого-то процесса(флаг может устанавливаться через ioctl например). ProcessIdToHide можно получить например при вызове того же ioctl. PsGetCurrentProcess, получили PEPROCESS, берём оттуда хендл, ну или поставили NotifyRoutine, и если запустился процесс который нужно защитить, то также получаем его пид.
     
  13. Denis__

    Denis__ New Member

    Публикаций:
    0
    Регистрация:
    5 янв 2006
    Сообщения:
    56
    На счет SetHideProcess, хотелось бы по конкретней желательно с примерчиком. Просто не до конца логику пойму, зачем нам какой-то флаг, у нас же есть PID, который получаем через ioctl.
     
  14. k3internal

    k3internal New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2007
    Сообщения:
    607
    ProcessIdToHide это Id подконтрольного процесса.
    SetHideProcess это просто булевая переменная, показывающая, нужно запретить уничтожение процесса или хрен с ним.
     
  15. Denis__

    Denis__ New Member

    Публикаций:
    0
    Регистрация:
    5 янв 2006
    Сообщения:
    56
    Добрый вечер. Перехватываю NtTerminateProcess,ниже код обработчика.
    Код (Text):
    1. NewNtTerminateProcess proc ProcessHandle:dword,ExitStatus:dword
    2. local pEPROCESS:dword
    3. local ProcessId:dword
    4.  
    5.     invoke ObReferenceObjectByHandle,ProcessHandle, 0, NULL, KernelMode, addr pEPROCESS, NULL
    6.     .if eax==STATUS_SUCCESS
    7.         mov eax,[pEPROCESS]
    8.         mov ecx,[PidOffset]
    9.         mov eax,[eax+ecx]                                          ;PID процесса
    10.         mov ProcessId,eax
    11.         invoke DbgPrint, $CTA0("Protected process %d terminated"),ProcessId
    12.         invoke ObDereferenceObject,pEPROCESS
    13.         invoke IsAdded,wLastItem, ProcessId                        ;проверяем есть ли в списке защищеных процесов данный PID
    14.         .if eax!=0
    15.            
    16.             invoke DbgPrint, $CTA0("Access Denied")            ;запрещаем доступ
    17.             mov eax,STATUS_ACCESS_DENIED
    18.             ret
    19.         .endif
    20.     .endif
    21.    
    22.     push ExitStatus                                                ;вызываем оригинальный обработчик
    23.     push ProcessHandle
    24.     call TrueNtTerminateProcess
    25.    
    26.     ret
    27. NewNtTerminateProcess endp
    Код почти рабочий :). Все работает,недаем убить защищенные процессы,незащищенные отправляем на оригинальный обработчик

    NtTerminateProcess.Но как только происходит вызов оригинального обработчика NtTerminateProcess,закрываемый процесс

    зависает.То же самое происходит,если попытаться просто закрыть процесс, то есть нажать на крестик или ALT+F4.Не пойму где

    ошибка, в отладчике ее явно не видно :)
     
  16. Denis__

    Denis__ New Member

    Публикаций:
    0
    Регистрация:
    5 янв 2006
    Сообщения:
    56
    Нашел ошибку, нажно еще проверять,вдруг мы закрываем сами себя. Ниже рабочий код:

    Код (Text):
    1. NewNtTerminateProcess proc ProcessHandle:dword,ExitStatus:dword
    2.  
    3. local pEPROCESS:dword
    4. local ProcessId:dword
    5.      
    6.     invoke PsGetCurrentProcessId
    7.     invoke IsAdded,wLastItem, eax                      ;В eax PID процесса, если PID= PID какого то из наших,защищенных процессов,значит пытаемся закрыть сами себя
    8.     .if eax==0                                    ;прыгаем на оригинальный обработчик NtTerminateProcess
    9.         invoke ObReferenceObjectByHandle,ProcessHandle, 0, NULL, KernelMode, addr pEPROCESS, NULL
    10.         .if eax==STATUS_SUCCESS
    11.             mov eax,[pEPROCESS]
    12.             mov ecx,[PidOffset]
    13.             mov eax,[eax+ecx]                        
    14.             mov ProcessId,eax
    15.             invoke ObDereferenceObject,pEPROCESS
    16.             invoke IsAdded,wLastItem, ProcessId
    17.                 .if eax!=0
    18.                 invoke DbgPrint, $CTA0("Access Denied")
    19.                 mov eax,STATUS_ACCESS_DENIED
    20.                 ret
    21.                .endif
    22.         .endif
    23.     .endif
    24.     push ExitStatus
    25.     push ProcessHandle
    26.     call TrueNtTerminateProcess
    27.     ret
    28.    
    29. NewNtTerminateProcess endp
     
  17. Denis__

    Denis__ New Member

    Публикаций:
    0
    Регистрация:
    5 янв 2006
    Сообщения:
    56
    Сплайсинг NtOpenProcess