WriteProcessMemory ERROR_PARTIAL_COPY 299 - PullRequest
       0

WriteProcessMemory ERROR_PARTIAL_COPY 299

5 голосов
/ 26 сентября 2010

Я пытаюсь записать в память другого процесса, я открываю его с разрешением 38h (VM_OPERATION, VM_READ, VM_WRITE), затем я использую VirtualProtectEx с разрешением 4h (PAGE_READWRITE), но я также попробовал PAGE_EXECUTEREADWRITE - та же ошибка позже.

Затем я вызываю ReadProcessMemory и успешно считываю значение адреса исправления. Но когда я пытаюсь записать этот адрес с помощью WriteProcessMemory, я получаю код ошибки 299 - ERROR_PARTIAL_COPY.

Кто-нибудь знает, как это решить?

РЕДАКТИРОВАТЬ: РЕШЕНО - буфер не был передан для записи в качестве ссылки, а в качестве значения

1 Ответ

0 голосов
/ 06 января 2019

WriteProcessMemory выдает ошибку ERROR_PARTIAL_COPY 299, поскольку третий аргумент, lpBuffer, должен быть указателем.В частности, указатель на локальный буфер, который содержит данные, которые вы намереваетесь записать в целевой процесс.Если, например, буфер, скажем, целое число вроде:

int x = 5;

Тогда вы бы использовали &x в качестве аргумента lpBuffer.& - это оператор "address of`, который возвращает указатель на переменную.

Обычно, если вы не передадите указатель для этого аргумента, вы получите ошибку компилятора. Независимо от того, ERROR_PARTIAL_COPY означает, что не всебайты из исходного буфера были записаны в целевой процесс. Это может произойти по нескольким причинам, особенно если аргумент lpBuffer не указывает на адрес выделенной памяти с правильными разрешениями. То же самое происходит, если вы испортили второй аргумент WriteProcessMemory.

Использование VirtualProtectEx для получения разрешений на запись на целевую страницу памяти также рекомендуется, как я здесь:

void PatchEx(HANDLE hProcess, char* dst, char* src, int size)
{
    DWORD oldprotect;
    VirtualProtectEx(hProcess, dst, size, PAGE_EXECUTE_READWRITE, &oldprotect);
    WriteProcessMemory(hProcess, dst, src, size, NULL);
    VirtualProtectEx(hProcess, dst, size, oldprotect, &oldprotect);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...