Я нашел и прочитал этот вопрос, но не нашел ответа альтернатива перехвата SSDT в системах x64
Я хочу защитить свое приложение от завершения другими программами. В 32-битной версии Windows я использовал SSDT hooking
для подключения ZwTerminateProcess
или ZwOpenProcess
. Я должен обновить свою программу для использования в 64-битной версии Windows. И, к сожалению, в 64-битных окнах мы не можем использовать хук SSDT
(Поскольку Patch Guard (KPP)), обратите внимание, что в этом случае я не хочу обходить PG и должен использовать только перехват в режиме ядра. Например, я не хочу, чтобы моя программа начинала завершаться (даже) следующим кодом:
NTSTATUS drvTerminateProcess( ULONG ulProcessID )
{
NTSTATUS ntStatus = STATUS_SUCCESS;
HANDLE hProcess;
OBJECT_ATTRIBUTES ObjectAttributes;
CLIENT_ID ClientId;
DbgPrint( "drvTerminateProcess( %u )", ulProcessID );
InitializeObjectAttributes( &ObjectAttributes, NULL, OBJ_INHERIT, NULL, NULL );
ClientId.UniqueProcess = (HANDLE)ulProcessID;
ClientId.UniqueThread = NULL;
__try
{
ntStatus = ZwOpenProcess( &hProcess, PROCESS_ALL_ACCESS, &ObjectAttributes, &ClientId );
if( NT_SUCCESS(ntStatus) )
{
ntStatus = ZwTerminateProcess( hProcess, 0 );
if( !NT_SUCCESS(ntStatus) )
DbgPrint( "ZwTerminateProcess failed with status : %08X\n", ntStatus );
ZwClose( hProcess );
}
else
DbgPrint( "ZwOpenProcess failed with status : %08X\n", ntStatus );
}
__except( EXCEPTION_EXECUTE_HANDLER )
{
ntStatus = STATUS_UNSUCCESSFUL;
DbgPrint( "Exception caught in drvTerminateProcess()" );
}
return ntStatus;
}
Для выполнения этой работы я использовал следующую функцию (NewZwOpenProcess
) и заменил ее оригинальной ZwOpenProcess
в SSDT, но в x64 windows я не знаю, что мне делать :( :
NTSTATUS NewZwOpenProcess(
OUT PHANDLE ProcessHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes,
IN PCLIENT_ID ClientId OPTIONAL)
{
HANDLE ProcessId;
__try
{
ProcessId = ClientId->UniqueProcess;
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
return STATUS_INVALID_PARAMETER;
}
if (ProcessId == (HANDLE)11) //Check if the PID matches our protected process PID (My programm)
{
return STATUS_ACCESS_DENIED;
}
else
return OldZwOpenProcess(ProcessHandle, DesiredAccess,ObjectAttributes, ClientId);
}
Есть идеи ??
(Извините, если мой английский плохой)