Доступ запрещен для функции WriteProcessMemory

#c #winapi

#c #winapi

Вопрос:

При вызове функции WriteProcessMemory она вызывает код системной ошибки — 5.

Я пробовал PROCESS_VM_OPERATION и PROCESS_VM_WRITE то, и другое, но это все равно не работает.

Вот код:

 int intToWrite = 123;

HANDLE hProcess = OpenProcess(PROCESS_VM_WRITE, FALSE, /*ProcessId*/);

if (WriteProcessMemory(hProcess, (LPVOID)0x..., amp;intToWrite, 4, 0) != 0)
{  
 std::cout << "Everything is fine. n";
} 
else
{
  std::cout << "The problem " << GetLastError() << " is in WPM function. n";
}
  

Вывод в консоль:

 The problem 5 is in WPM function
  

Итак, где именно моя ошибка в доступе?

Комментарии:

1. Документация вызывает PROCESS_VM_WRITE и PROCESS_VM_OPERATION . Вы не можете выполнить это. Настоятельно рекомендуется проверять возвращаемое значение OpenProcess .

2. @DavidHeffernan Я сделал, как вы сказали, но теперь это показывает эту проблему в функции WPM.

3. @Artemleschukov — начните с кода исправления здесь OpenProcess(PROCESS_VM_WRITE|PROCESS_VM_OPERATION , проверьте его возвращаемое значение и фактический код ошибки после сбоя api

4. @RbMm Оооо, это хорошо работает! Удивительно! Но что означает символ «I» между P_V_W и P_V_O?

5. побитовый ИЛИ

Ответ №1:

Недостаточно открыть процесс с доступом на запись, необходимо также убедиться, что записываемая память доступна для записи (VirtualProtectEx()).

Комментарии:

1. Нет. WPM позаботится об этом за вас.

2. @DavidHeffernan конечно, нет. «Примечания WriteProcessMemory копирует данные из указанного буфера в текущем процессе в диапазон адресов указанного процесса. Любой процесс, который имеет дескриптор с доступом PROCESS_VM_WRITE и PROCESS_VM_OPERATION к процессу, в который нужно записать, может вызвать функцию. Обычно, но не всегда, процесс с адресным пространством, в которое записывается, отлаживается. Вся область, в которую должна быть записана, должна быть доступна, и если она недоступна, функция завершается с ошибкой «.

3. Вы неправильно прочитали. Под доступным это просто означает, что адреса действительны для этого процесса. О защите заботится WPM. devblogs.microsoft.com/oldnewthing/20181206-00/?p=100415

4. @DavidHeffernan Тем не менее, лучше снять защиту со страниц самостоятельно, чтобы не полагаться на детали реализации.