1 ZwQuerySystemInformation - Processes and Threads 2 ZwOpenThread - threads ID's from 1 3 ZwSuspendThread - thread HANDLE from 2 4 ZwClose
всем спасибо информации достаточно. ZwQuerySystemInformation вроде как достаточно документирована http://msdn2.microsoft.com/en-us/library/ms725506.aspx. Поковыряю статью, там должен быть и более правильный с точки зрения МС способ.
Есть способ и получше чем дергать все треды - NtSuspendProcess(HANDLE hProcess); но почему то не открывается процесс через ZwOpenProcess код вполне нормальный Код (Text): OBJECT_ATTRIBUTES ObjectAttributes; CLIENT_ID ClientId; HANDLE hProcess = NULL; NTSTATUS status; InitializeObjectAttributes(&ObjectAttributes, NULL, 0, NULL, NULL); ClientId.UniqueProcess = Pid; ClientId.UniqueThread = (HANDLE)0; status = ZwOpenProcess(&hProcess, PROCESS_ALL_ACCESS, &ObjectAttributes, &ClientId); if (!NT_SUCCESS(status)) { DbgPrint("ZwOpenProcess() ERROR 0x%.8x on pid %d", status, Pid); return STATUS_INVALID_PARAMETER; } status = _NtSuspendProcess(hProcess); if (!NT_SUCCESS(status)) { DbgPrint("_NtSuspendProcess() ERROR : 0x%.8x", status); } return status; ZwOpenPRocess возвращает STATUS_INVALID_PARAMETER ((NTSTATUS)0xC000000DL) Может это из-за того, что драйвер занимается перехватом NtOpenProcess через SDT ?
проблема была именно из-за перехвата NtOpenProcess, точнее из-за такого кода в нем: Код (Text): if ((ULONG)ClientId > *MmUserProbeAddress) return STATUS_INVALID_PARAMETER; __try { PidToOpen = ClientId->UniqueProcess; } __except(EXCEPTION_EXECUTE_HANDLER) { return STATUS_INVALID_PARAMETER; } да, да драйверы, пытающиеся открывать процессы идут лесом на самом деле это вообще все херня, потому что получается, что процесс саспендится в перехваченной функции, то есть саспендит сам себе %)
спасибо! я правда уже написал, что саспенд все равно работает не так, как я ожидал вообще он и не нужен оказался, просто решил поделится результатами своей деятельности.
Похожая проблема, при открытии процесса через ZwOpenProcess() возвращает 0xc000000d Код (Text): InitializeObjectAttributes(&InitializedAttributes, NULL, OBJ_CASE_INSENSITIVE, 0, 0); cid.UniqueProcess = (HANDLE)PID; cid.UniqueThread = (HANDLE) 0; ntStatus = ZwOpenProcess(&ProcessHandle, PROCESS_ALL_ACCESS, &InitializedAttributes, &cid); if (!NT_SUCCESS(ntStatus)) { DbgPrint("[-] ZwOpenProcess() erorr 0x%x", ntStatus); return 0; } Вчера еще работало, правда прописывал PID вручную, сейчас через IOCTL из user-mode отправляю, в отладчике смотрел PID передается правильный, "отладочный вывод" показывает правильный PID, все верно передается, но ntStatus=0xc000000d Все работает, стоит запостить на форуме, так ошибки боятся вылезать