Доброго времени суток. Пишу драйвер для 32-разрядной Windows XP, Vista, 7. # Задача: Необходимо получить PID процесса, дескриптор которого пытаются скопировать. - То есть. 1. Мы защищаем процесс Notepad.exe 2. Есть программа Cheat.exe, которая вызывает DuplicateObject и копирует дескриптор Notepad.exe с csrss.exe 3. Мне необходимо в перехваченой функции NuDuplicateObject получить PID процесса, дескриптор которого Cheat.exe хочет скопировать с csrss.exe # Прототип NtDuplicateObject: Перейти; # Прототип DuplicateObject: DuplicateHandle Function; Код (Text): NTSTATUS NtDuplicateObject_New( IN HANDLE SourceProcessHandle, IN PHANDLE SourceHandle, IN с TargetProcessHandle, OUT PHANDLE TargetHandle, IN ACCESS_MASK DesiredAccess OPTIONAL, IN BOOLEAN InheritHandle, IN ULONG Options) { KPROCESSOR_MODE mAccess = KeGetPreviousMode(); // ---- PEPROCESS curProcess = PsGetCurrentProcess(); HANDLE curProcesId = PsGetCurrentProcessId(); // csrss.exe PID; // ---- PEPROCESS pProTar; NTSTATUS nRes; ULONG uProTarId; // ---- nRes = ObReferenceObjectByHandle(SourceProcessHandle, 0, *PsProcessType, KernelMode, & pProTar, NULL); // ---- if ( nRes != STATUS_SUCCESS ) { DPRINT("[NtDublicateObject_New] ObReferenceObjectByHandle() Error: 0x%.8X;\n\0", nRes); // ---- return g_NtDuplicateObject.funcOriginal(SourceProcessHandle, SourceHandle, TargetProcessHandle, TargetHandle, DesiredAccess OPTIONAL, InheritHandle, Options); } // ---- uProTarId = (ULONG)PsGetProcessId(pProTar); // ---- DPRINT("[NtDublicateObject_New] ### CheatPID: %ld;\n\0", uProTarId); // ---- // Далее нужно получить PEPROCESS процесса, HANDLE которого Cheat.exe хочет скопировать у csrss.exe // То есть, нужно получить PEPROCESS от Notepad.exe, чтобы далее можно было получить PID Notepad.exe; // ---- return g_NtDuplicateObject.funcOriginal(SourceProcessHandle, SourceHandle, TargetProcessHandle, TargetHandle, DesiredAccess OPTIONAL, InheritHandle, Options); } # Добавлено: Читал про функцию ObGetObjectType() для получения типа дублируемого дескриптора, но эта функция появилась лишь в Windows7. P.S. -> Надеюсь на советы, подсказки, ссылки и т.д. - Заранее благодарю.
Хендл, который пытаются скопировать, находится в параметре SourceHandle. Как получить тип объекта по хендлу, достаточно подробно описано у меня в блоге.
#2, x64 - Благодарю за ссылку, прочитал, с горем пополам сделал для XP. - Всё работает, НО, так и не получается получить PID защищаемого процесса Notepad.exe, дескриптор которого хотят скопировать. Код (Text): NTSTATUS NtDuplicateObject_New( IN HANDLE SourceProcessHandle, IN PHANDLE SourceHandle, IN HANDLE TargetProcessHandle, OUT PHANDLE TargetHandle, IN ACCESS_MASK DesiredAccess OPTIONAL, IN BOOLEAN InheritHandle, IN ULONG Options) { KPROCESSOR_MODE mAccess; // ---- PEPROCESS curProcess; ULONG curProcesId; // ---- NTSTATUS nRes; PEPROCESS pProTar; ULONG uSourcePID; ULONG uDestPID; // ---- PVOID pUnk; POBJECT_TYPE ObjectType; // ---- mAccess = KeGetPreviousMode(); // ---- curProcess = PsGetCurrentProcess(); curProcesId = (ULONG)PsGetCurrentProcessId(); // ---- if ( (ULONG)SourceProcessHandle < 1 ) { return g_NtDuplicateObject.funcOriginal(SourceProcessHandle, SourceHandle, TargetProcessHandle, TargetHandle, DesiredAccess OPTIONAL, InheritHandle, Options); } // ---- nRes = ObReferenceObjectByHandle(SourceProcessHandle, 0, *PsProcessType, KernelMode, & pProTar, NULL); // ---- if ( nRes != STATUS_SUCCESS ) { DPRINT("[NtDublicateObject_New] ObReferenceObjectByHandle() Error: 0x%.8X;\n\0", nRes); // ---- return g_NtDuplicateObject.funcOriginal(SourceProcessHandle, SourceHandle, TargetProcessHandle, TargetHandle, DesiredAccess OPTIONAL, InheritHandle, Options); } // ---- uSourcePID = (ULONG)PsGetProcessId(pProTar); // ---- if ( (uSourcePID != 932) && (uSourcePID != 356) ) { return g_NtDuplicateObject.funcOriginal(SourceProcessHandle, SourceHandle, TargetProcessHandle, TargetHandle, DesiredAccess OPTIONAL, InheritHandle, Options); } // ---- DPRINT("[NtDublicateObject_New] uSourcePID: %ld;\n\0", uSourcePID); // ---- DPRINT("[NtDublicateObject_New] curProcess: %ld; curProcesId: %ld;\n\0", curProcess, curProcesId); // ---- nRes = ObReferenceObjectByHandle(SourceHandle, 0, NULL, KernelMode, & pUnk, NULL); // ---- if ( nRes != STATUS_SUCCESS ) { DPRINT("[NtDublicateObject_New] ### 2 ### ObReferenceObjectByHandle() Error: 0x%.8X;\n\0", nRes); // ---- return g_NtDuplicateObject.funcOriginal(SourceProcessHandle, SourceHandle, TargetProcessHandle, TargetHandle, DesiredAccess OPTIONAL, InheritHandle, Options); } // ---- ObjectType = ((POBJECT_HEADER)((ULONG_PTR)pUnk - sizeof(OBJECT_HEADER)))->Type; // ---- if ( ObjectType == *ExEventObjectType ) { DPRINT("[NtDublicateObject_New] ObjectHeader->Type == *ExEventObjectType;\n\0"); } else if ( ObjectType == *ExSemaphoreObjectType ) { DPRINT("[NtDublicateObject_New] ObjectHeader->Type == *ExSemaphoreObjectType;\n\0"); } else if ( ObjectType == *IoFileObjectType ) { DPRINT("[NtDublicateObject_New] ObjectHeader->Type == *IoFileObjectType;\n\0"); } else if ( ObjectType == *PsProcessType ) { DPRINT("[NtDublicateObject_New] ObjectHeader->Type == *PsProcessType;\n\0"); } else if ( ObjectType == *PsThreadType ) { DPRINT("[NtDublicateObject_New] ObjectHeader->Type == *PsThreadType;\n\0"); // ---- pProTar = IoThreadToProcess((PETHREAD)pUnk); // ---- uDestPID = (ULONG)PsGetProcessId(pProTar); // ---- DPRINT("[NtDublicateObject_New] DestPID: %ld;\n\0", uDestPID); } else if ( ObjectType == *SeTokenObjectType ) { DPRINT("[NtDublicateObject_New] ObjectHeader->Type == *SeTokenObjectType;\n\0"); } else { DPRINT("[NtDublicateObject_New] ObjectHeader->Type == Unknow; Code: %ld;\n\0", ObjectType); } // ---- return g_NtDuplicateObject.funcOriginal(SourceProcessHandle, SourceHandle, TargetProcessHandle, TargetHandle, DesiredAccess OPTIONAL, InheritHandle, Options); } # Результаты следующие: P.S. -> Как я понял, Cheat.exe(ArtMoney Pro) дублирует HANDLE потока с любого другого процесса. - Но вот что дальше, как всё же выйти на PID моего защищаемого процесса Notepad.exe (1243)? P.S. -> Видимо я ещё очень мало понимаю принципы работы ядра и связующих =(
Я конечно извиняюсь, но вы явно не смотрели код... Код (Text): ... else if ( ObjectType == *PsThreadType ) { DPRINT("[NtDublicateObject_New] ObjectHeader->Type == *PsThreadType;\n\0"); // ---- pProTar = IoThreadToProcess((PETHREAD)pUnk); // ---- uDestPID = (ULONG)PsGetProcessId(pProTar); // ---- DPRINT("[NtDublicateObject_New] DestPID: %ld;\n\0", uDestPID); } ... Мне выдаёт PID процесса, но ни как не защищаемого(Notepad.exe)...
Не весь код смотрел. Видимо ошибка здесь: nRes = ObReferenceObjectByHandle(SourceHandle, 0, NULL, KernelMode, & pUnk, NULL); SourceHandle - хэндл из адресного пространства процесса SourceProcessHandle Можно попробовать зааттачиться (KeStackAttachProcess()) а затем вызвать ObReferenceObjectByHandle
Попробовал я как вы написали. Результат отрицательный =( # Вариант №1: Код (Text): [NtDublicateObject_New] uSourcePID: 1988; // Cheat.exe; [NtDublicateObject_New] curProcess: -1974478632; curProcesId: 588; // csrss.exe; [NtDublicateObject_New] ObjectHeader->Type == *PsThreadType; [NtDublicateObject_New] DestPID: 1988; // Cheat.exe; NTSTATUS NtDuplicateObject_New( IN HANDLE SourceProcessHandle, IN PHANDLE SourceHandle, IN HANDLE TargetProcessHandle, OUT PHANDLE TargetHandle, IN ACCESS_MASK DesiredAccess OPTIONAL, IN BOOLEAN InheritHandle, IN ULONG Options) { KPROCESSOR_MODE mAccess; // ---- PEPROCESS curProcess; ULONG curProcesId; // ---- NTSTATUS nRes; PEPROCESS pProTar; ULONG uSourcePID; ULONG uDestPID; // ---- PVOID pUnk; POBJECT_TYPE ObjectType; // ---- KAPC_STATE apcState; // ---- mAccess = KeGetPreviousMode(); // ---- curProcess = PsGetCurrentProcess(); curProcesId = (ULONG)PsGetCurrentProcessId(); // ---- if ( (ULONG)SourceProcessHandle < 1 ) { return g_NtDuplicateObject.funcOriginal(SourceProcessHandle, SourceHandle, TargetProcessHandle, TargetHandle, DesiredAccess OPTIONAL, InheritHandle, Options); } // ---- nRes = ObReferenceObjectByHandle(SourceProcessHandle, 0, *PsProcessType, KernelMode, & pProTar, NULL); // ---- if ( nRes != STATUS_SUCCESS ) { DPRINT("[NtDublicateObject_New] ObReferenceObjectByHandle() Error: 0x%.8X;\n\0", nRes); // ---- return g_NtDuplicateObject.funcOriginal(SourceProcessHandle, SourceHandle, TargetProcessHandle, TargetHandle, DesiredAccess OPTIONAL, InheritHandle, Options); } // ---- uSourcePID = (ULONG)PsGetProcessId(pProTar); // Cheat.exe; // ---- if ( uSourcePID != 1988 ) { return g_NtDuplicateObject.funcOriginal(SourceProcessHandle, SourceHandle, TargetProcessHandle, TargetHandle, DesiredAccess OPTIONAL, InheritHandle, Options); } // ---- KeStackAttachProcess(pProTar, & apcState); // ---- DPRINT("[NtDublicateObject_New] uSourcePID: %ld;\n\0", uSourcePID); // ---- DPRINT("[NtDublicateObject_New] curProcess: %ld; curProcesId: %ld;\n\0", curProcess, curProcesId); // ---- nRes = ObReferenceObjectByHandle(SourceHandle, 0, NULL, KernelMode, & pUnk, NULL); // ---- if ( nRes != STATUS_SUCCESS ) { DPRINT("[NtDublicateObject_New] ### 2 ### ObReferenceObjectByHandle() Error: 0x%.8X;\n\0", nRes); // ---- KeUnstackDetachProcess( & apcState); // ----- return g_NtDuplicateObject.funcOriginal(SourceProcessHandle, SourceHandle, TargetProcessHandle, TargetHandle, DesiredAccess OPTIONAL, InheritHandle, Options); } // ---- ObjectType = ((POBJECT_HEADER)((ULONG_PTR)pUnk - sizeof(OBJECT_HEADER)))->Type; // ---- if ( ObjectType == *ExEventObjectType ) { DPRINT("[NtDublicateObject_New] ObjectHeader->Type == *ExEventObjectType;\n\0"); } else if ( ObjectType == *ExSemaphoreObjectType ) { DPRINT("[NtDublicateObject_New] ObjectHeader->Type == *ExSemaphoreObjectType;\n\0"); } else if ( ObjectType == *IoFileObjectType ) { DPRINT("[NtDublicateObject_New] ObjectHeader->Type == *IoFileObjectType;\n\0"); } else if ( ObjectType == *PsProcessType ) { DPRINT("[NtDublicateObject_New] ObjectHeader->Type == *PsProcessType;\n\0"); } else if ( ObjectType == *PsThreadType ) { DPRINT("[NtDublicateObject_New] ObjectHeader->Type == *PsThreadType;\n\0"); // ---- pProTar = IoThreadToProcess((PETHREAD)pUnk); // ---- uDestPID = (ULONG)PsGetProcessId(pProTar); // ---- DPRINT("[NtDublicateObject_New] DestPID: %ld;\n\0", uDestPID); } else if ( ObjectType == *SeTokenObjectType ) { DPRINT("[NtDublicateObject_New] ObjectHeader->Type == *SeTokenObjectType;\n\0"); } else { DPRINT("[NtDublicateObject_New] ObjectHeader->Type == Unknow; Code: %ld;\n\0", ObjectType); } // ---- KeUnstackDetachProcess( & apcState); // ----- return g_NtDuplicateObject.funcOriginal(SourceProcessHandle, SourceHandle, TargetProcessHandle, TargetHandle, DesiredAccess OPTIONAL, InheritHandle, Options); } # Вариант №2: Код (Text): [NtDublicateObject_New] uSourcePID: 1988; // Cheat.exe [NtDublicateObject_New] curProcess: -1974478632; curProcesId: 588; // csrss.exe [NtDublicateObject_New] ObjectHeader->Type == *PsThreadType; [NtDublicateObject_New] DestPID: 668; // lsass.exe NTSTATUS NtDuplicateObject_New( IN HANDLE SourceProcessHandle, IN PHANDLE SourceHandle, IN HANDLE TargetProcessHandle, OUT PHANDLE TargetHandle, IN ACCESS_MASK DesiredAccess OPTIONAL, IN BOOLEAN InheritHandle, IN ULONG Options) { KPROCESSOR_MODE mAccess; // ---- PEPROCESS curProcess; ULONG curProcesId; // ---- NTSTATUS nRes; PEPROCESS pProTar; ULONG uSourcePID; ULONG uDestPID; // ---- PVOID pUnk; POBJECT_TYPE ObjectType; // ---- KAPC_STATE apcState; // ---- mAccess = KeGetPreviousMode(); // ---- curProcess = PsGetCurrentProcess(); curProcesId = (ULONG)PsGetCurrentProcessId(); // ---- if ( (ULONG)SourceProcessHandle < 1 ) { return g_NtDuplicateObject.funcOriginal(SourceProcessHandle, SourceHandle, TargetProcessHandle, TargetHandle, DesiredAccess OPTIONAL, InheritHandle, Options); } // ---- nRes = ObReferenceObjectByHandle(SourceProcessHandle, 0, *PsProcessType, KernelMode, & pProTar, NULL); // ---- if ( nRes != STATUS_SUCCESS ) { DPRINT("[NtDublicateObject_New] ObReferenceObjectByHandle() Error: 0x%.8X;\n\0", nRes); // ---- return g_NtDuplicateObject.funcOriginal(SourceProcessHandle, SourceHandle, TargetProcessHandle, TargetHandle, DesiredAccess OPTIONAL, InheritHandle, Options); } // ---- uSourcePID = (ULONG)PsGetProcessId(pProTar); // Cheat.exe; // ---- if ( uSourcePID != 1988 ) { return g_NtDuplicateObject.funcOriginal(SourceProcessHandle, SourceHandle, TargetProcessHandle, TargetHandle, DesiredAccess OPTIONAL, InheritHandle, Options); } // ---- DPRINT("[NtDublicateObject_New] uSourcePID: %ld;\n\0", uSourcePID); // ---- DPRINT("[NtDublicateObject_New] curProcess: %ld; curProcesId: %ld;\n\0", curProcess, curProcesId); // ---- nRes = ObReferenceObjectByHandle(SourceHandle, 0, NULL, KernelMode, & pUnk, NULL); // ---- if ( nRes != STATUS_SUCCESS ) { DPRINT("[NtDublicateObject_New] ### 2 ### ObReferenceObjectByHandle() Error: 0x%.8X;\n\0", nRes); // ---- return g_NtDuplicateObject.funcOriginal(SourceProcessHandle, SourceHandle, TargetProcessHandle, TargetHandle, DesiredAccess OPTIONAL, InheritHandle, Options); } // ---- ObjectType = ((POBJECT_HEADER)((ULONG_PTR)pUnk - sizeof(OBJECT_HEADER)))->Type; // ---- if ( ObjectType == *ExEventObjectType ) { DPRINT("[NtDublicateObject_New] ObjectHeader->Type == *ExEventObjectType;\n\0"); } else if ( ObjectType == *ExSemaphoreObjectType ) { DPRINT("[NtDublicateObject_New] ObjectHeader->Type == *ExSemaphoreObjectType;\n\0"); } else if ( ObjectType == *IoFileObjectType ) { DPRINT("[NtDublicateObject_New] ObjectHeader->Type == *IoFileObjectType;\n\0"); } else if ( ObjectType == *PsProcessType ) { DPRINT("[NtDublicateObject_New] ObjectHeader->Type == *PsProcessType;\n\0"); } else if ( ObjectType == *PsThreadType ) { DPRINT("[NtDublicateObject_New] ObjectHeader->Type == *PsThreadType;\n\0"); // ---- pProTar = IoThreadToProcess((PETHREAD)pUnk); // ---- KeStackAttachProcess(pProTar, & apcState); // ---- uDestPID = (ULONG)PsGetProcessId(pProTar); // ---- KeUnstackDetachProcess( & apcState); // ----- DPRINT("[NtDublicateObject_New] DestPID: %ld;\n\0", uDestPID); } else if ( ObjectType == *SeTokenObjectType ) { DPRINT("[NtDublicateObject_New] ObjectHeader->Type == *SeTokenObjectType;\n\0"); } else { DPRINT("[NtDublicateObject_New] ObjectHeader->Type == Unknow; Code: %ld;\n\0", ObjectType); } // ---- return g_NtDuplicateObject.funcOriginal(SourceProcessHandle, SourceHandle, TargetProcessHandle, TargetHandle, DesiredAccess OPTIONAL, InheritHandle, Options); } P.S. -> Прошу помочь решить данную проблему. - Либо тут либо в приват(если есть какие-то предложения/условия). - Заранее благодарю.