c++ 写入进程内存()错误998

pxyaymoc  于 2023-01-10  发布在  其他
关注(0)|答案(2)|浏览(257)

我正在获取error 998 (access denied),其中的writeprocessmemory位于C++中。我不知道我做错了什么。
下面是我的一些代码:

DWORD ProcessId;
        GetWindowThreadProcessId(WindowHandle, &ProcessId); //pID
        if (ProcessId) {}
        else {
            cout << "ERROR! Process ID Could not be received." << endl;
            return 0;
        }

        //Get the Process Handle
        HANDLE ProcessHandle = OpenProcess(PROCESS_ALL_ACCESS, false, ProcessId);
        if (ProcessId) {}
        else {
            cout << "ERROR! Process Handle could not be received." << endl;
            return 0;
        }

        //Get it done with.
        bool MemWritten = WriteProcessMemory(ProcessHandle, Address, &NewValue, sizeof(NewValue), NULL);

        //Close the process handle to prevent memory leak.
        CloseHandle(ProcessHandle);
ogq8wdun

ogq8wdun1#

您没有修改可执行内存的权限。您必须修改权限,方法是以管理员身份运行程序,并将对WriteProcessMemory()的调用 Package 为对VirtualProtectEx()的调用。

void PatchEx(BYTE* dst, BYTE* src, unsigned int size, HANDLE hProcess)
{
    DWORD oldprotect;
    VirtualProtectEx(hProcess, dst, size, PAGE_EXECUTE_READWRITE, &oldprotect);
    WriteProcessMemory(hProcess, dst, src, size, nullptr);
    VirtualProtectEx(hProcess, dst, size, oldprotect, &oldprotect);
}

使用这样的函数可以确保您始终将其更改为具有写权限。
WriteProcessMemory的文档和网络上的许多帖子经常指出,WPM在内部确实会首先更改内存,因此您不需要自己做这件事,并说这是多余的。
虽然在进行POC时这似乎是正确的,但当您开始大规模分发软件而没有首先调用VirtualProtect时,您将遇到问题。如果您希望100%确保WriteProcessMemory始终成功,请按照我们的说明进行操作。
参考:why doesn't WriteProcessMemory change the memory permissions for us

xn1cxnb4

xn1cxnb42#

在写入进程内存之前,应使用VirtualAllocEx保留一些内存页。
样品:

LPVOID lpRemoteAddress = VirtualAllocEx( hProcess, 0, 4096, MEM_RESERVE|MEM_COMMIT, PAGE_EXECUTE_READWRITE );
if( !lpRemoteAddress )
{
  return;
}
WriteProcessMemory( hProcess, lpRemoteAddress, .... /*your params here*/ )

相关问题