Я пытаюсь использовать следующий код из режима ядра в драйвере:
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 — это первая ячейка памяти?
Я не уверен, почему вы думаете, что ваш код будет работать, ваши входные значения для MmCopyVirtualMemory не верны.
Я считаю, что пятый параметр (BufferSize) должен указывать длину памяти, которую вы хотите скопировать из SourceAddress в TargetAddress. Если это так, убедитесь, что в TargetAddress достаточно места — возьмите это с крошкой соли.
Я предлагаю вам взглянуть на прототип функции, которым вы поделились в исходном посте, перепроверить код и попробовать еще раз, взяв мои комментарии здесь и после еще нескольких исследований рутины.
Помните, однако, что MmCopyVirtualMemory официально не задокументирована, и вы будете рисковать, используя его в любом исходном коде производственного уровня. Я настоятельно рекомендую вам пересмотреть ваши варианты, если это не просто образовательный эксперимент, потому что стабильный и документированный код, как правило, важная вещь.
Других решений пока нет …