Является ли SourceAddress относительно SourceProcess в MmCopyVirtualMemory? - PullRequest
0 голосов
/ 12 июня 2018

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

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 Ответ

0 голосов
/ 21 июня 2018

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

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

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

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

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

...