Является ли SourceAddress относительно SourceProcess в MmCopyVirtualMemory?

Я пытаюсь использовать следующий код из режима ядра в драйвере:

NTSTATUS NTAPI MmCopyVirtualMemory
(
    PEPROCESS SourceProcess,
    PVOID SourceAddress,
    PEPROCESS TargetProcess,
    PVOID TargetAddress,
    SIZE_T BufferSize,
    KPROCESSOR_MODE PreviousMode,
    PSIZE_T ReturnSize
);

Я использую это следующим образом:

PEPROCESS process;
NTSTATUS status;
unsigned int readValue;

// get notepad.exe process -> Notepad is opened already and this is the ID from Task Mgr
status = PsLookupProcessByProcessId((HANDLE)7252, &process);

if (!NT_SUCCESS(status))
{
    DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, "\n\n ## Lookup By Id failed. ##\n\n");
    if (status == STATUS_INVALID_CID)
    {
        DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, "\n\n ## Id could not be found. ##\n\n");
    }
    goto Exit;
}

SIZE_T cbBytesReturned;
status = MmCopyVirtualMemory(process, 0x00, PsGetCurrentProcess(), &readValue, sizeof(unsigned int), KernelMode, &cbBytesReturned);

if (!NT_SUCCESS(status))
{
    DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, "\n\n ## MemCopy failed. ##\n\n");
}
else
{
    DbgPrintEx(DPFLTR_IHVDRIVER_ID, DPFLTR_ERROR_LEVEL, "\n\n ## MemCopy DONE ##\n\n");
}

ObfDereferenceObject(process);

В настоящее время это не удается. Я предположил, что 0x00 указывает на первый байт памяти процесса, из которого я читаю. ИИ неправильный или это относительный, что означает, что process + 0x00 - это первая ячейка памяти?

1 ответ

Я не уверен, почему вы думаете, что ваш код будет работать, ваши входные значения для MmCopyVirtualMemory не верны.

  1. Вы передаете пустой указатель на второй параметр. Как ядро ​​Windows должно знать, где находится память, которую вы хотите скопировать из SourceProcess, если вы не указали правильный адрес?
  2. Вы передаете адрес указателя в локальную переменную в качестве четвертого параметра, но четвертый параметр должен быть адресом указателя, который действителен для целевого процесса (третий параметр). Предполагается, что адрес указателя, используемый для четвертого параметра, должен находиться там, где вы хотите поместить память, скопированную из SourceAddress (в виртуальной памяти SourceProcess), в TargetProcess.
  3. Для пятого параметра вы передаете размер целого без знака? Это тоже неверно.

Я считаю, что пятый параметр (BufferSize) должен указывать длину памяти, которую вы хотите скопировать из SourceAddress в TargetAddress. Если это так, убедитесь, что в TargetAddress достаточно места - возьмите это с крошкой соли.

Я предлагаю вам взглянуть на прототип функции, которым вы поделились в исходном посте, и еще раз проверить свой код, и попробовать еще раз, взяв мои комментарии здесь и после еще нескольких исследований рутины.

Помните, однако, что MmCopyVirtualMemory официально не задокументирована, и вы будете рисковать, используя его в любом исходном коде производственного уровня. Я настоятельно рекомендую вам пересмотреть ваши варианты, если это не просто образовательный эксперимент, потому что стабильный и документированный код, как правило, важная вещь.

Другие вопросы по тегам