反作弊驱动开发:如何从PreOperationCallback获取句柄目标信息?
OB回调拦截进程句柄创建:正确获取目标进程信息的方法
你的代码存在两个核心错误,导致无法正确识别被保护的目标进程:
- 参数使用错误:
PsLookupProcessByProcessId的第一个参数是进程ID(HANDLE类型),但你传入了OP_INFO->Object——这个字段本身就是目标进程的PEPROCESS指针,完全不需要调用这个函数转换。 - 类型匹配错误:直接将
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字符串)
- 目标PID:
- 若需要获取调用进程(比如
ProcessHacker.exe)的信息,可使用PsGetCurrentProcess()获取调用者的PEPROCESS,再用PsGetProcessId()得到其PID。
额外建议
- 不要硬编码PID,建议通过进程名动态获取目标进程的
PEPROCESS,避免每次重启游戏都要修改代码。 - 在回调中修改
DesiredAccess为0后,上层调用OpenProcess会返回INVALID_HANDLE_VALUE,达到禁止访问的效果,但要注意某些系统进程的特殊情况,避免影响系统稳定性。
内容的提问来源于stack exchange,提问作者Yellow
相关产品推荐
相关产品推荐

