如何从PreOperationCallback获取句柄信息?

问题描述 投票:0回答:1

我目前对反作弊开发感到好奇,并且正在尝试和编写内核驱动程序。我发现 OB 注册回调可以让您拦截句柄创建,从而禁止访问进程。我的问题是获取句柄信息,现在我只能获取调用 openprocess 的程序的 processID。例如,我的 game.exe 的 PID 为 1234,ProcessHacker.exe 的 PID 为 4321。在我的驱动程序中,

case OB_OPERATION_HANDLE_CREATE:
        DesiredAccess = &OP_INFO->Parameters->CreateHandleInformation.DesiredAccess;
        OriginalDesiredAccess = OP_INFO->Parameters->CreateHandleInformation.OriginalDesiredAccess;
        
        PEPROCESS peProcessC;
        PsLookupProcessByProcessId((PEPROCESS)OP_INFO->Object, &peProcessC);


        if (peProcessC == (HANDLE)1234) { //game.exe PID
            *DesiredAccess = 0;
        }

        OperationName = L"OB_OPERATION_HANDLE_CREATE";
        break;

当我让 processhacker 将 DLL 注入 game.exe 时,我的驱动程序返回 processhacker PID。 我的目标是只保护 game.exe,为此我一直在尝试获取句柄信息,即 DesiredAccess、Binherit 和 dwProcessID。我希望能够看到句柄指向什么,而不是调用 OpenProcess 的程序。我找不到关于此的其他主题。

抱歉所有文字,英语不是我的母语。

我一直在查看有关 POB_PRE_OPERATION_INFORMATION 的 MS 文档,但找不到与我正在尝试执行的操作相关的任何内容。如果有更好的方法来完成此任务或者我做错了,请说出来。

c windows winapi kernel kernel-module
1个回答
0
投票

您需要使用

PsGetProcessId
来检查调用者尝试打开的进程的ID。您首先还需要确保这是进程对象:

if (*PsProcessType == OperationInformation->ObjectType)

还需要检查该请求不是来自 game.exe 本身,或者来自受保护的进程(例如 csrss.exe 或来自内核模式)

OB_PREOP_CALLBACK_STATUS ObjectPreCallback(PVOID /*RegistrationContext*/, POB_PRE_OPERATION_INFORMATION OperationInformation)
{
    if (OperationInformation->KernelHandle)
    {
        return OB_PREOP_SUCCESS;
    }

    ACCESS_MASK *pDesiredAccess;

    switch (OperationInformation->Operation)
    {
    case OB_OPERATION_HANDLE_CREATE:
        pDesiredAccess = &OperationInformation->Parameters->CreateHandleInformation.DesiredAccess;
        break;
    case OB_OPERATION_HANDLE_DUPLICATE:
        pDesiredAccess = &OperationInformation->Parameters->DuplicateHandleInformation.DesiredAccess;
        break;
    default:
        // unknown operation ?!
        return OB_PREOP_SUCCESS;
    }
    
    union {
        PVOID Object;
        PEPROCESS Process;
        PETHREAD Thread;
    };

    Object = OperationInformation->Object;

    POBJECT_TYPE ObjectType = OperationInformation->ObjectType;

    if (*PsProcessType == ObjectType)
    {
        PEPROCESS CurrentProcess = IoGetCurrentProcess();

        if (Process != CurrentProcess &&
            PsGetProcessId(Process) == _G_gamePID &&
            !PsIsProtectedProcess(CurrentProcess))
        {
            // block access
            *pDesiredAccess &= PROCESS_QUERY_LIMITED_INFORMATION;
        }
            
    }
    return OB_PREOP_SUCCESS;
}
© www.soinside.com 2019 - 2024. All rights reserved.