找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 165|回复: 0

重写的NTOpenProcess(注册SSDT后,就可以直接使用)

[复制链接]

210

主题

371

回帖

0

积分

管理员

积分
0
发表于 2013-10-12 12:06:43 | 显示全部楼层 |阅读模式
【原创】天道酬勤  QQ:394999492
NTSTATUS WINAPI
MyNtOpenProcess (
    __out PHANDLE ProcessHandle,
    __in ACCESS_MASK DesiredAccess,
    __in POBJECT_ATTRIBUTES ObjectAttributes,
    __in_opt PCLIENT_ID ClientId
    )
{
    HANDLE Handle;
    KPROCESSOR_MODE PreviousMode;
    NTSTATUS Status;
    PEPROCESS Process;
    PETHREAD Thread;
    CLIENT_ID CapturedCid={0};
    BOOLEAN ObjectNamePresent;
    BOOLEAN ClientIdPresent;
    ACCESS_STATE AccessState;
    AUX_ACCESS_DATA AuxData;
    ULONG Attributes;
KIRQL CurrentIrql;
    PAGED_CODE();
CurrentIrql = KeGetCurrentIrql();
if(CurrentIrql>ASSIVE_LEVEL)
{
  KeLowerIrql(PASSIVE_LEVEL);
}
//DbgPrint("HxNtOpenProcess IRQL: %u \n",CurrentIrql);
DbgPrint("OD已经调用过我们的HxNtOpenProcess ()函数 \n");
    PreviousMode = KeGetPreviousMode();
    if (PreviousMode != KernelMode) {
        try {
            ProbeForWriteHandle (ProcessHandle);
            ProbeForReadSmallStructure (ObjectAttributes,
                                        sizeof(OBJECT_ATTRIBUTES),
                                        sizeof(ULONG));
            ObjectNamePresent = (BOOLEAN)ARGUMENT_PRESENT (ObjectAttributes->ObjectName);
            //Attributes = ObSanitizeHandleAttributes (ObjectAttributes->Attributes, UserMode);
   Attributes=ObjectAttributes->Attributes;
            if (ARGUMENT_PRESENT (ClientId)) {
                ProbeForReadSmallStructure (ClientId, sizeof (CLIENT_ID), sizeof (ULONG));
                CapturedCid = *ClientId;
                ClientIdPresent = TRUE;
            } else {
                ClientIdPresent = FALSE;
            }
        } except (EXCEPTION_EXECUTE_HANDLER) {
            return GetExceptionCode();
        }
    } else {
        ObjectNamePresent = (BOOLEAN)ARGUMENT_PRESENT (ObjectAttributes->ObjectName);
        //Attributes = ObSanitizeHandleAttributes (ObjectAttributes->Attributes, KernelMode);
  Attributes=ObjectAttributes->Attributes;
        if (ARGUMENT_PRESENT (ClientId)) {
            CapturedCid = *ClientId;
            ClientIdPresent = TRUE;
        } else {
            ClientIdPresent = FALSE;
        }
    }
    if (ObjectNamePresent && ClientIdPresent) {
        return STATUS_INVALID_PARAMETER_MIX;
    }
    Status = SeCreateAccessState(
                 &AccessState,
                 &AuxData,
                 DesiredAccess,
                 &(*PsProcessType)->TypeInfo.GenericMapping
                 );
    if ( !NT_SUCCESS(Status) ) {
        return Status;
    }
    if (SeSinglePrivilegeCheck( SeDebugPrivilege, PreviousMode )) {
        if ( AccessState.RemainingDesiredAccess & MAXIMUM_ALLOWED ) {
            AccessState.PreviouslyGrantedAccess |= PROCESS_ALL_ACCESS;
        } else {
            AccessState.PreviouslyGrantedAccess |= ( AccessState.RemainingDesiredAccess );
        }
        AccessState.RemainingDesiredAccess = 0;
    }
    if (ObjectNamePresent) {
        Status = ObOpenObjectByName(
                    ObjectAttributes,
                    *PsProcessType,
                    PreviousMode,
                    &AccessState,
                    0,
                    NULL,
                    &Handle
                    );
        SeDeleteAccessState( &AccessState );
        if ( NT_SUCCESS(Status) ) {
            try {
                *ProcessHandle = Handle;
            } except (EXCEPTION_EXECUTE_HANDLER) {
                return GetExceptionCode ();
            }
        }
        return Status;
    }
    if ( ClientIdPresent ) {
        Thread = NULL;
        if (CapturedCid.UniqueThread) {
            Status = PsLookupProcessThreadByCid(
                        &CapturedCid,
                        &rocess,
                        &Thread
                        );
            if (!NT_SUCCESS(Status)) {
                SeDeleteAccessState( &AccessState );
                return Status;
            }
        } else {
            Status = PsLookupProcessByProcessId(
                        CapturedCid.UniqueProcess,
                        &rocess
                        );
            if ( !NT_SUCCESS(Status) ) {
                SeDeleteAccessState( &AccessState );
                return Status;
            }
        }
        Status = ObOpenObjectByPointer(
                    Process,
                    Attributes,
                    &AccessState,
                    0,
                    *PsProcessType,
                    PreviousMode,
                    &Handle
                    ); //得到进程句柄
        SeDeleteAccessState( &AccessState );
        if (Thread) {
            ObDereferenceObject(Thread);
        }
        ObDereferenceObject(Process);
        if (NT_SUCCESS (Status)) {
            try {
                *ProcessHandle = Handle;
            } except (EXCEPTION_EXECUTE_HANDLER) {
                return GetExceptionCode ();
            }
        }
        return Status;
    }
    return STATUS_INVALID_PARAMETER_MIX;
}
}
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

果子博客
扫码关注微信公众号

Archiver|手机版|小黑屋|风叶林

GMT+8, 2026-2-1 04:41 , Processed in 0.100803 second(s), 20 queries .

Powered by 风叶林

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表