|
通过Hook ObReferenceObjectByHandle达到目的。
之所以说WS,是因为估计有副作用,但是目前还不知道副作用在何处。
在XP/WIN7下测试通过。
- NTSTATUS DetourMyObReferenceObjectByHandle(IN HANDLE Handle,IN ACCESS_MASK DesiredAccess,IN POBJECT_TYPE ObjectType OPTIONAL,IN KPROCESSOR_MODE AccessMode,OUT PVOID *Object,OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL)
- {
- NTSTATUS status;
- if ( (ObjectType != *PsProcessType)&&(ObjectType != *PsThreadType) )//如果句柄类型不是进程或者线程,则放行
- {
- status=OriginalObReferenceObjectByHandle(Handle,DesiredAccess,ObjectType,AccessMode,Object,HandleInformation);
- }
- else
- { //如果是进程或线程类型
- if( (PsGetCurrentProcessId() != (HANDLE)processID) )//如果操作者不是CSRSS(变量processID保存着CSRSS进程的PID),则放行
- {
- status=OriginalObReferenceObjectByHandle(Handle,DesiredAccess,ObjectType,AccessMode,Object,HandleInformation);
- }
- else
- { //先执行一次,如果得到的目标是它自己,则放行
- status=OriginalObReferenceObjectByHandle(Handle,DesiredAccess,ObjectType,AccessMode,Object,HandleInformation);
- if ( NT_SUCCESS(status) )
- {
- if( ((ULONG)(*Object)==(ULONG)PsGetCurrentProcess())||((ULONG)IoThreadToProcess((PETHREAD)(*Object))==(ULONG)PsGetCurrentProcess()) )
- {
- //Did Nothing
- }
- else
- {
- ObfDereferenceObject(*Object);
- status=STATUS_UNSUCCESSFUL;
- }
- }
- }
- }
- return status;
- }
复制代码 |
|