我具有以下结构:
typedef struct _KERNEL_MODULE_REQUEST
{
BOOLEAN success;
ULONG64 processID;
ULONG64 module;
} _KERNEL_MODULE_REQUEST, *PKERNEL_MODULE_REQUEST;
我正在从userland进程中填充此结构,并使用以下代码将其发送到内核驱动程序:
ULONG64 GetMainModule()
{
DWORD bytes = 0;
if (handle == INVALID_HANDLE_VALUE || processID == 0)
{
return false;
}
request.processID = this->processID;
if (DeviceIoControl(handle, IO_GET_MODULE_REQUEST, &request, sizeof(request), &request, sizeof(request), &bytes, NULL))
{
if (request.success)
{
return (ULONG64)request.module;
}
else
{
return false;
}
}
}
接收说明的代码如下:
case IO_GET_MODULE_REQUEST:
{
PEPROCESS process;
PKAPC_STATE state = NULL;
PKERNEL_MODULE_REQUEST request = (PKERNEL_MODULE_REQUEST)irp->AssociatedIrp.SystemBuffer;
PsLookupProcessByProcessId(request->processID, &process);
// Attach to the process and get it's base
KeStackAttachProcess((PKPROCESS)process, &state);
request->module = (DWORD64)PsGetProcessSectionBaseAddress(process);
KeUnstackDetachProcess(&state);
irp->IoStatus.Status = STATUS_SUCCESS;
irp->IoStatus.Information = sizeof(_KERNEL_MODULE_REQUEST);
}
break;
使用windbg进行调试时,该结构在内核端已正确解压缩,并且我获得了正确的PID。我也在打印模块地址,它返回正确的值(通过ProcessHacker确认)。但是,当我尝试在用户端打印模块时,它没有返回正确的地址。
有人可以解释我在做什么错吗?