Является ли 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 — это первая ячейка памяти?

0

Решение

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

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

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

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

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]