从内核获取进程模块并将其返回到用户级进程

时间:2019-02-25 13:22:04

标签: c++ c windows kernel

我具有以下结构:

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确认)。但是,当我尝试在用户端打印模块时,它没有返回正确的地址。

有人可以解释我在做什么错吗?

0 个答案:

没有答案