我目前对反作弊开发感到好奇,并且正在尝试和编写内核驱动程序。我发现 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 文档,但找不到与我正在尝试执行的操作相关的任何内容。如果有更好的方法来完成此任务或者我做错了,请说出来。
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;
}