Кстати анитивирус Касперского просто перехватывает ядерную NtOpenProcess, а перехватчик выглядит примерно так:
NTSTATUS NewNtOpenProcess (
OUT PHANDLE ProcessHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes,
IN PCLIENT_ID ClientId OPTIONAL)
{
HANDLE ProcessId;
//Безопасным образом извлекаем ProcessId
if ((ULONG)ClientId > MmUserProbeAddress)//Проверяем что адресе ClientId находится ниже ядрерной памяти
return STATUS_INVALID_PARAMETER;
__try//Используем SEH, т.к. ClientId может указывать на непереданную память
{
ProcessId = ClientId->UniqueProcess;
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
DPRINT("Exception");
return STATUS_INVALID_PARAMETER;
}
if ((ProtectedPid != 0)&&(ProcessId == ProtectedPid)) //защищаем процесс с указанным PID для нужного процесса
{
DPRINT("Access Denied!");
return STATUS_ACCESS_DENIED;
} else
return TrueNtOpenProcess(ProcessHandle, DesiredAccess,
ObjectAttributes, ClientId);
}