WriteProcessMemory() 错误 998

Posted

技术标签:

【中文标题】WriteProcessMemory() 错误 998【英文标题】:WriteProcessMemory() Error 998 【发布时间】:2017-02-05 13:42:47 【问题描述】:

我在C++ 中使用 writeprocessmemory 获得error 998 (access denied)。 我不知道我做错了什么。

这是我的一些代码:

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);

【问题讨论】:

现在写入可执行内存空间受到限制,这可以防止大量的漏洞利用类型。 我最近看到有人这样做,不是。 你想完成什么? "any1 srsly 我得尽快去" 这是一个巨魔吗?我不认为 Stack Overflow 是你想象的那样!! “我最近看到有人这样做,不是”肯定是。操作系统已经这样做了几十年。那是他们的工作。在当今病毒和漏洞不断涌现的世界中,如果没有此类保护,您的计算机将完全无用 【参考方案1】:

在您可以写入进程内存之前,您应该使用VirtualAllocEx 保留一些内存页面。

示例:

LPVOID lpRemoteAddress = VirtualAllocEx( hProcess, 0, 4096, MEM_RESERVE|MEM_COMMIT, PAGE_EXECUTE_READWRITE );
if( !lpRemoteAddress )

  return;

WriteProcessMemory( hProcess, lpRemoteAddress, .... /*your params here*/ )

【讨论】:

【参考方案2】:

您无权修改可执行内存。您必须通过以管理员身份运行程序并将对 WriteProcessMemory() 的调用封装为对 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() 错误 998的主要内容,如果未能解决你的问题,请参考以下文章

ReadProcessMemory WriteProcessMemory iOS

在 C++ 中使用带有多级指针和偏移量的 WriteProcessMemory()?

WriteProcessMemory 和类似函数是不是会使可能缓存的数据无效?

delphi XE Berlin ReadProcessMemory WriteProcessMemory

C ++ - ReadProcessMemory 到缓冲区,WriteProcessMemory(在同一缓冲区上具有新值)将缓冲区恢复为旧值

vc 无dll的代码注入