Получение модуля процесса из ядра и возврат его в пользовательский процесс - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть следующая структура:

typedef struct _KERNEL_MODULE_REQUEST
{
    BOOLEAN success;
    ULONG64 processID;
    ULONG64 module;
} _KERNEL_MODULE_REQUEST, *PKERNEL_MODULE_REQUEST;

Я заполняю эту структуру из моего пользовательского процесса и отправляю ее в мой драйвер ядра со следующим кодом:

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).Однако, когда я пытаюсь распечатать модуль на стороне пользователя, он не возвращает правильный адрес.

Может кто-нибудь объяснить, что я делаю не так?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...