Как получить все хэндлы тредов процесса по pid

Тема в разделе "WASM.NT.KERNEL", создана пользователем Weberd, 4 дек 2007.

  1. Weberd

    Weberd New Member

    Публикаций:
    0
    Регистрация:
    14 июн 2007
    Сообщения:
    67
    Вообще мне нужно саспенд процесса делать в кернел мод
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    насколько документированно?
    ZwQueryProcessInformation/ZwQuerySystemInformation
     
  3. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    1 ZwQuerySystemInformation - Processes and Threads
    2 ZwOpenThread - threads ID's from 1
    3 ZwSuspendThread - thread HANDLE from 2
    4 ZwClose
     
  4. Weberd

    Weberd New Member

    Публикаций:
    0
    Регистрация:
    14 июн 2007
    Сообщения:
    67
    всем спасибо информации достаточно.
    ZwQuerySystemInformation вроде как достаточно документирована
    http://msdn2.microsoft.com/en-us/library/ms725506.aspx.
    Поковыряю статью, там должен быть и более правильный с точки зрения МС
    способ.
     
  5. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    более правильный? )
     
  6. Weberd

    Weberd New Member

    Публикаций:
    0
    Регистрация:
    14 июн 2007
    Сообщения:
    67
     
  7. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    так про любую (тобишь про многие) функцию нтдлл в принципе сказать можно
     
  8. Weberd

    Weberd New Member

    Публикаций:
    0
    Регистрация:
    14 июн 2007
    Сообщения:
    67
    Есть способ и получше чем дергать все треды - NtSuspendProcess(HANDLE hProcess);

    но почему то не открывается процесс через ZwOpenProcess

    код вполне нормальный
    Код (Text):
    1.         OBJECT_ATTRIBUTES ObjectAttributes;
    2.         CLIENT_ID ClientId;
    3.         HANDLE hProcess = NULL;
    4.         NTSTATUS status;
    5.    
    6.         InitializeObjectAttributes(&ObjectAttributes, NULL, 0, NULL, NULL);
    7.    
    8.         ClientId.UniqueProcess = Pid;
    9.         ClientId.UniqueThread = (HANDLE)0;
    10.    
    11.         status = ZwOpenProcess(&hProcess, PROCESS_ALL_ACCESS, &ObjectAttributes, &ClientId);
    12.    
    13.         if (!NT_SUCCESS(status))
    14.         {
    15.             DbgPrint("ZwOpenProcess() ERROR 0x%.8x on pid %d", status, Pid);
    16.             return STATUS_INVALID_PARAMETER;
    17.         }
    18.        
    19.         status = _NtSuspendProcess(hProcess);
    20.        
    21.         if (!NT_SUCCESS(status))
    22.         {
    23.             DbgPrint("_NtSuspendProcess() ERROR : 0x%.8x", status);
    24.         }
    25.        
    26.         return status;
    ZwOpenPRocess возвращает STATUS_INVALID_PARAMETER ((NTSTATUS)0xC000000DL)
    Может это из-за того, что драйвер занимается перехватом NtOpenProcess через SDT ?
     
  9. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    вместо &ObjectAttributes, 0 ставь.
     
  10. Weberd

    Weberd New Member

    Публикаций:
    0
    Регистрация:
    14 июн 2007
    Сообщения:
    67
    проблема была именно из-за перехвата NtOpenProcess, точнее из-за такого кода в нем:

    Код (Text):
    1.     if ((ULONG)ClientId > *MmUserProbeAddress)
    2.         return STATUS_INVALID_PARAMETER;
    3.        
    4.     __try
    5.     {
    6.         PidToOpen = ClientId->UniqueProcess;
    7.     }
    8.     __except(EXCEPTION_EXECUTE_HANDLER)
    9.     {
    10.         return STATUS_INVALID_PARAMETER;
    11.     }
    да, да драйверы, пытающиеся открывать процессы идут лесом :)

    на самом деле это вообще все херня, потому что получается, что процесс саспендится в перехваченной функции, то есть саспендит сам себе %)
     
  11. n0name

    n0name New Member

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

    Weberd New Member

    Публикаций:
    0
    Регистрация:
    14 июн 2007
    Сообщения:
    67
    спасибо!

    я правда уже написал, что саспенд все равно работает не так, как я ожидал :) вообще он и не нужен оказался, просто решил поделится результатами своей деятельности.
     
  13. JCronuz

    JCronuz New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    1.240
    Адрес:
    Russia
    Похожая проблема, при открытии процесса через ZwOpenProcess() возвращает 0xc000000d
    Код (Text):
    1. InitializeObjectAttributes(&InitializedAttributes, NULL, OBJ_CASE_INSENSITIVE, 0, 0);
    2. cid.UniqueProcess = (HANDLE)PID;
    3. cid.UniqueThread = (HANDLE) 0;
    4.  
    5. ntStatus = ZwOpenProcess(&ProcessHandle, PROCESS_ALL_ACCESS, &InitializedAttributes, &cid);
    6. if (!NT_SUCCESS(ntStatus)) {
    7.     DbgPrint("[-] ZwOpenProcess() erorr  0x%x", ntStatus);
    8.     return 0;
    9. }
    Вчера еще работало, правда прописывал PID вручную, сейчас через IOCTL из user-mode отправляю, в отладчике смотрел PID передается правильный, "отладочный вывод" показывает правильный PID, все верно передается, но
    ntStatus=0xc000000d


    Все работает, стоит запостить на форуме, так ошибки боятся вылезать :)
     
  14. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    PsSuspendProcess().