You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

反作弊驱动开发:如何从PreOperationCallback获取句柄目标信息?

OB回调拦截进程句柄创建:正确获取目标进程信息的方法

你的代码存在两个核心错误,导致无法正确识别被保护的目标进程:

  1. 参数使用错误:PsLookupProcessByProcessId的第一个参数是进程ID(HANDLE类型),但你传入了OP_INFO->Object——这个字段本身就是目标进程的PEPROCESS指针,完全不需要调用这个函数转换。
  2. 类型匹配错误:直接将PEPROCESS对象和PID(1234)比较是逻辑错误,PEPROCESS是内核进程对象的指针,PID是进程的标识符,两者类型和值没有关联。

修正后的代码示例

case OB_OPERATION_HANDLE_CREATE:
    DesiredAccess = &OP_INFO->Parameters->CreateHandleInformation.DesiredAccess;
    OriginalDesiredAccess = OP_INFO->Parameters->CreateHandleInformation.OriginalDesiredAccess;
    
    // 直接获取目标进程的PEPROCESS(即被打开的进程,比如game.exe)
    PEPROCESS targetProcess = (PEPROCESS)OP_INFO->Object;
    // 获取目标进程的PID
    HANDLE targetPid = PsGetProcessId(targetProcess);

    // 判断是否是需要保护的game.exe(PID=1234)
    if (targetPid == (HANDLE)1234) {
        // 清空访问权限,禁止创建该进程的句柄
        *DesiredAccess = 0;
    }

    OperationName = L"OB_OPERATION_HANDLE_CREATE";
    break;

关键说明

  • OP_INFO->Object:在OB_OPERATION_HANDLE_CREATE回调中,这个字段指向被打开的目标进程的PEPROCESS内核对象,也就是你要保护的game.exe,而非调用OpenProcess的进程(比如ProcessHacker.exe)。
  • 获取目标进程属性:
    • 目标PID:PsGetProcessId(targetProcess)
    • 目标进程名:可通过PsGetProcessImageFileName(targetProcess)获取(返回ANSI字符串)
  • 若需要获取调用进程(比如ProcessHacker.exe)的信息,可使用PsGetCurrentProcess()获取调用者的PEPROCESS,再用PsGetProcessId()得到其PID。

额外建议

  • 不要硬编码PID,建议通过进程名动态获取目标进程的PEPROCESS,避免每次重启游戏都要修改代码。
  • 在回调中修改DesiredAccess为0后,上层调用OpenProcess会返回INVALID_HANDLE_VALUE,达到禁止访问的效果,但要注意某些系统进程的特殊情况,避免影响系统稳定性。

内容的提问来源于stack exchange,提问作者Yellow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 19:12:33