перехват ZwTerminateProcess

Тема в разделе "WASM.BEGINNERS", создана пользователем FromRing0, 11 окт 2006.

  1. FromRing0

    FromRing0 New Member

    Публикаций:
    0
    Регистрация:
    10 окт 2006
    Сообщения:
    73
    И так, хочу перехватить ZwTerminateProcess, перехват удаёться, делаю так :
    Код (Text):
    1. typedef NTSTATUS (*ZWTERMINATEPROCESS)(IN HANDLE ProcessHandle OPTIONAL,IN NTSTATUS ExitStatus);
    2. ZWTERMINATEPROCESS  OldZwTerminateProcess;
    3. NTSTATUS    NewZwTerminateProcess (IN HANDLE ProcessHandle OPTIONAL,IN NTSTATUS ExitStatus);
    4. NTSTATUS    NewZwTerminateProcess(HANDLE ProcessHandle,NTSTATUS ExitStatus)
    5. {
    6.         DbgPrint(" NewZwTerminateProcess ");
    7.         return STATUS_ACCESS_DENIED;
    8. }
    Всё в порядке ни одно приложение не может закрыться , а вот у меня вопрос как запретить убивать опеределённое приложение по названию файла?
    Есть мысль циклом пробежаться по процессам, узнать название и если запрашиваеться убить хэндл этого процеса то возвращять return STATUS_ACCESS_DENIED;
    .....
    Кто как организовывает перехват ZwTerminateProcess поделитесь.
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    XP+: PsGetProcessImageFileName
    В более ранних можешь искать имя в EPROCESS.
    Как, показано в теме с перехватом ZwQuerySystemInformation.
     
  3. MegaZu

    MegaZu New Member

    Публикаций:
    0
    Регистрация:
    22 июл 2005
    Сообщения:
    290
    Может поиск поюзаешь ? Эти вопросы уже хз скока поднимались.

    PsGetCurrentProcess

    ЗЫ. Процесс можно убить не только через ZwTerminateProcess ....
     
  4. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Определенный процесс не обязательно твой.
     
  5. FromRing0

    FromRing0 New Member

    Публикаций:
    0
    Регистрация:
    10 окт 2006
    Сообщения:
    73
    Я искал, не нашёл.

    n0name, спасибо, попробую.
     
  6. FromRing0

    FromRing0 New Member

    Публикаций:
    0
    Регистрация:
    10 окт 2006
    Сообщения:
    73
    Значит как я понял я должен через PsGetProcessImageFileName(PEPROCESS Process) получить имя процесса который пытаються закрыть, потом (LPSTR)Process->ImageFileName; сверить со своим и соответственно запретить или разрешить ?
     
  7. FromRing0

    FromRing0 New Member

    Публикаций:
    0
    Регистрация:
    10 окт 2006
    Сообщения:
    73
    Код (Text):
    1. NTSTATUS NewZwTerminateProcess(HANDLE ProcessHandle,NTSTATUS ExitStatus)
    2. {
    3.         // ЛОКАЛЬНЫЕ ПЕРЕМЕННЫЕ ФУНКЦИИ
    4.        
    5.         // Функция
    6.         if (PsGetProcessImageFileName(ProcessHandle) == PROCESS_TO_HIDE)
    7.         {
    8.             return STATUS_ACCESS_DENIED;
    9.         }   else    {
    10.             return STATUS_ACCESS_DENIED;
    11.         }
    12. }
    Всё пашет (в смысле не гасятся процессы :)) , так вот что это за
    Код (Text):
    1. LPSTR NTAPI  PsGetProcessImageFileName(PEPROCESS Process);
    Где мне взять PEPROCESS Process в NewZwTerminateProcess
     
  8. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    ObReferenceObjectByHandle(ProcessHandle, ..., &pEprocess, ...)
    После обязательно ObDereferenceObject()
     
  9. FromRing0

    FromRing0 New Member

    Публикаций:
    0
    Регистрация:
    10 окт 2006
    Сообщения:
    73
    спасибо большое.
     
  10. FromRing0

    FromRing0 New Member

    Публикаций:
    0
    Регистрация:
    10 окт 2006
    Сообщения:
    73
    Код (Text):
    1. NTSTATUS NewZwTerminateProcess(HANDLE ProcessHandle,NTSTATUS ExitStatus)
    2. {
    3.     // ЛОКАЛЬНЫЕ ПЕРЕМЕННЫЕ ФУНКЦИИ
    4.     PVOID                   NZTP_OBJ;
    5.     NTSTATUS                NZTP_STATUS;
    6.    
    7.     // Функция
    8.     NZTP_STATUS =   ObReferenceObjectByHandle(ProcessHandle,0,0,KernelMode,&NZTP_OBJ,NULL);
    9.     if (NT_SUCCESS(NZTP_STATUS))
    10.     {
    11.         if (PsGetProcessImageFileName(NZTP_OBJ) == PROCESS_TO_HIDE)
    12.         {
    13.             return STATUS_ACCESS_DENIED;
    14.         }   else    {
    15.             return STATUS_SUCCESS;
    16.         }
    17.         return STATUS_SUCCESS;
    18.         ObDereferenceObject(&NZTP_OBJ);
    19.     }
    20. }
    Код (Text):
    1. 1>driver.c(151) : error C2220: warning treated as error - no 'object' file gener
    2. ated
    3. 1>driver.c(151) : error C4715: 'NewZwTerminateProcess' : not all control paths r
    4. eturn a value
    5. BUILD: Compiling  c:\driver directory
    6. 100>Compiling - driver.c for i386
    7. 100>driver.c(151) : error C2220: warning treated as error - no 'object' file gen
    8. erated
    9. 100>driver.c(151) : error C4715: 'NewZwTerminateProcess' : not all control paths
    10.  return a value
     
  11. FromRing0

    FromRing0 New Member

    Публикаций:
    0
    Регистрация:
    10 окт 2006
    Сообщения:
    73
    что за нафиг ? :dntknw:
     
  12. FromRing0

    FromRing0 New Member

    Публикаций:
    0
    Регистрация:
    10 окт 2006
    Сообщения:
    73
    всё разобрался
    Код (Text):
    1. NTSTATUS NewZwTerminateProcess(HANDLE ProcessHandle,NTSTATUS ExitStatus)
    2. {
    3.     // ЛОКАЛЬНЫЕ ПЕРЕМЕННЫЕ ФУНКЦИИ
    4.     PVOID                   NZTP_OBJ;
    5.     NTSTATUS                NZTP_STATUS;
    6.    
    7.     // Функция
    8.     NZTP_STATUS =   ObReferenceObjectByHandle(ProcessHandle,0,0,KernelMode,&NZTP_OBJ,NULL);
    9.     if (NT_SUCCESS(NZTP_STATUS))
    10.     {
    11.         DbgPrint("%s",PsGetProcessImageFileName(NZTP_OBJ));
    12.         if (0 == memcmp(PsGetProcessImageFileName(NZTP_OBJ), PROCESS_TO_HIDE, 9))
    13.         {
    14.             return STATUS_ACCESS_DENIED;
    15.         }   else    {
    16.             return STATUS_SUCCESS;
    17.         }
    18.         ObDereferenceObject(&NZTP_OBJ);
    19.     }
    20.     return STATUS_SUCCESS;
    21. }
     
  13. FromRing0

    FromRing0 New Member

    Публикаций:
    0
    Регистрация:
    10 окт 2006
    Сообщения:
    73
    Всё отлично , не даю убить свой процесс, НО и не убивает другие процессы....мне что в NewZwTerminateProcess нужно реализовать "убивалку" ? если да то подскажите как :dntknw:
     
  14. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Код (Text):
    1. Код:
    2. NTSTATUS NewZwTerminateProcess(HANDLE ProcessHandle,NTSTATUS ExitStatus)
    3. {
    4.     // ЛОКАЛЬНЫЕ ПЕРЕМЕННЫЕ ФУНКЦИИ
    5.     PVOID                    NZTP_OBJ;
    6.     NTSTATUS                NZTP_STATUS;
    7.    
    8.     // Функция
    9.     NZTP_STATUS    =    ObReferenceObjectByHandle(ProcessHandle,0,0,KernelMode,&NZTP_OBJ,NULL);
    10.     if (NT_SUCCESS(NZTP_STATUS))
    11.     {
    12.         DbgPrint("%s",PsGetProcessImageFileName(NZTP_OBJ));
    13.         if (0 == memcmp(PsGetProcessImageFileName(NZTP_OBJ), PROCESS_TO_HIDE, 9))
    14.         {
    15.             NZTP_STATUS = STATUS_ACCESS_DENIED;
    16.         }    else    {
    17.             NZTP_STATUS = Original_ZwTerminateProcess(ProcessHandle, ExitStatus);
    18.         }
    19.         ObDereferenceObject(&NZTP_OBJ);
    20.     }
    21.     return NZTP_STATUS;
    22. }
     
  15. FromRing0

    FromRing0 New Member

    Публикаций:
    0
    Регистрация:
    10 окт 2006
    Сообщения:
    73
    Я так и сделал glig спасибо !
     
  16. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Это только для XP+, если хочешь чтоб и на Win2k работало, то лучше делай так:
    Код (Text):
    1. void GetProcessNameOffset()
    2. {
    3.   PEPROCESS curproc = PsGetCurrentProcess();
    4.   int i;
    5.   for( i = 0; i < 3*PAGE_SIZE; i++ )
    6.   {
    7.       if( !strncmp( "System", (PCHAR) curproc + i, strlen("System") ))
    8.     {
    9.       gProcessNameOffset = i;
    10.     }
    11.   }
    12. }
    13.  
    14. PEPROCESS GetProcessByHandle(HANDLE hndl){
    15.     // ЛОКАЛЬНЫЕ ПЕРЕМЕННЫЕ ФУНКЦИИ
    16.     PVOID                    NZTP_OBJ;
    17.     ObReferenceObjectByHandle(ProcessHandle,0,0,KernelMode,&NZTP_OBJ,NULL);
    18.     retrurn NZTP_OBJ;
    19. }
    20.  
    21. /* Copy the process name into the specified buffer.  */
    22.  
    23. ULONG GetProcessName( PCHAR theName, HANDLE hndl )
    24. {
    25.   PEPROCESS       curproc;
    26.   char            *nameptr;
    27.   ULONG           i;
    28.   KIRQL           oldirql;
    29.  
    30.   if( gProcessNameOffset )
    31.     {
    32.       curproc = GetProcessByHandle(hndl);                      
    33.       nameptr   = (PCHAR) curproc + gProcessNameOffset;        // Тут не понятно
    34.       strncpy( theName, nameptr, NT_PROCNAMELEN );            // пихаем в nameptr theName ЗАЧЕМ ?
    35.       theName[NT_PROCNAMELEN] = 0;                            // Нуль строка
    36.       return TRUE;
    37.     }
    38.   return FALSE;
    39. }
    В коде ZwTerminateProcess ObDereferenceObject() тоже делать надо.
     
  17. MegaZu

    MegaZu New Member

    Публикаций:
    0
    Регистрация:
    22 июл 2005
    Сообщения:
    290
    Тьфу мля =) Еще спал когда катал пост =) Там по хэндлу надо.

    Вообщем, я делал перехват NtOpenProcess , NtOpenThread, так как могут поубивать нафиг все потоки. Или инжектнуть выход процесса, а без хэндла такого не здалаешь. Правда хэндл можно получить и другими способами, но это уже совсем другой компот.
     
  18. FromRing0

    FromRing0 New Member

    Публикаций:
    0
    Регистрация:
    10 окт 2006
    Сообщения:
    73
    n0name нифига не понял :dntknw: обьясни неопытному куда это пихнуть :dntknw:
     
  19. FromRing0

    FromRing0 New Member

    Публикаций:
    0
    Регистрация:
    10 окт 2006
    Сообщения:
    73
    всё понял :)
     
  20. FromRing0

    FromRing0 New Member

    Публикаций:
    0
    Регистрация:
    10 окт 2006
    Сообщения:
    73
    Код (Text):
    1. PEPROCESS GetProcessByHandle(HANDLE hndl){
    2.     // ЛОКАЛЬНЫЕ ПЕРЕМЕННЫЕ ФУНКЦИИ
    3.     PVOID                    NZTP_OBJ;
    4.     ObReferenceObjectByHandle(hndl,0,0,KernelMode,&NZTP_OBJ,NULL);
    5.     return NZTP_OBJ;
    6. }
    7.  
    8. ULONG GetProcessName2000( PCHAR theName , HANDLE hndl )
    9. {
    10.     // ЛОКАЛЬНЫЕ ПЕРЕМЕННЫЕ ФУНКЦИИ
    11.     PEPROCESS           curproc;
    12.     char                *nameptr;
    13.     ULONG               i;
    14.     KIRQL               oldirql;
    15.  
    16.     // ФУНКЦИЯ
    17.   if( gProcessNameOffset )
    18.     {
    19.       curproc = GetProcessByHandle(hndl);                      
    20.       nameptr   = (PCHAR) curproc + gProcessNameOffset;        // Тут не понятно
    21.       strncpy( theName, nameptr, NT_PROCNAMELEN );            // пихаем в nameptr theName ЗАЧЕМ ?
    22.       theName[NT_PROCNAMELEN] = 0;                            // Нуль строка
    23.       return TRUE;
    24.     }
    25.   return FALSE;
    26. }
    27.  
    28.  
    29. NTSTATUS NewZwTerminateProcess(IN HANDLE ProcessHandle OPTIONAL,IN NTSTATUS ExitStatus)
    30. {  
    31.     // ЛОКАЛЬНЫЕ ПЕРЕМЕННЫЕ ФУНКЦИИ
    32.     PVOID                    NZTP_OBJ;
    33.     NTSTATUS                 NZTP_STATUS;
    34.     CHAR                     PtheName[PROCNAMELEN];
    35.    
    36.     // Функция
    37.     if (GetProcessName2000( PtheName , ProcessHandle ))
    38.     {
    39.         if (0 == memcmp(PtheName, PROCESS_TO_HIDE, sizeof(PROCESS_TO_HIDE)))
    40.         {
    41.             NZTP_STATUS = STATUS_ACCESS_DENIED;
    42.         }    else    {
    43.             NZTP_STATUS = OldZwTerminateProcess(ProcessHandle, ExitStatus);
    44.         }
    45.         ObDereferenceObject(&NZTP_OBJ);
    46.     }
    47.     return NZTP_STATUS;
    48. }