我发现并阅读了这个问题,但我没有找到我的答案SSDT挂钩替代x64系统
我想保护我的申请免受其他程序的终止.在32位版本的Windows中我使用了SSDT hooking
挂钩ZwTerminateProcess
或ZwOpenProcess
.我现在要将程序升级为64位版本的Windows.不幸的是在64位窗口中我们不能使用SSDT
hook(因为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窗口中我不知道该怎么做:(:
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); }
任何的想法 ??
(打扰一下,如果我的英语不好)