【问题标题】:WriteProcessMemory C++写进程内存 C++
【发布时间】:2014-01-31 17:39:17
【问题描述】:

刚刚粘贴了必要的内容,即使我的日志显示 WriteProcessMemory() 成功,内存地址也没有被写入。此外,我还仔细检查了我的内存地址是否正确。谢谢你的帮助。

char* offsets[][3] = {
    { "0x3E264", "0", "char[1]" },
    { "0x45848", "Auto-Mine", "char[10]" },
    { "0x458C0", "Auto-Build", "char[10]" },
    //to be continued...
};

HANDLE scHandle = OpenProcess(PROCESS_VM_WRITE | PROCESS_VM_OPERATION, FALSE, ID);
if (scHandle == NULL) {
    log << "ERROR: OpenProcess() returned " << GetLastError() << endl;
    return false;
}
DWORD bytesOut;
for (int a = 0; a < 9; a++) {
    if (WriteProcessMemory(scHandle, (LPVOID)(wDetectorBaseAddress + (int)strtol(offsets[a][0], NULL, 0)), offsets[a][1], strlen(offsets[a][1]) + 1, &bytesOut))
    {
        log << "WriteProcessMemory() to address " << wDetectorBaseAddress << " + " << (int)strtol(offsets[a][0], NULL, 0) << " = " << wDetectorBaseAddress + (int)strtol(offsets[a][0], NULL, 0) << " with '" << offsets[a][1] << "'; " << bytesOut << " bytes were written" << endl;
    }
    else
    {
        log << "ERROR: WriteProcessMemory() returned " << GetLastError() << endl;
        return false;
    }
}
CloseHandle(scHandle);

【问题讨论】:

  • 为什么这个标签是C?
  • 你怎么知道它不起作用?
  • 在作弊引擎中检查前后内存地址 - 没有变化。

标签: c++ winapi


【解决方案1】:

您需要使用PAGE_EXECUTE_READWRITE 调用VirtualProtect,然后才能写入进程的内存。写入后需要恢复原来的保护。

另一件事是,你怎么知道这些地址总是相同的?你能确认它永远不会改变吗?

注意:您可能还必须在写完后致电FlushInstructionCache

【讨论】:

  • 我还有一个问题。我在没有VirtualProtect的情况下在Delphi中使用类似的代码(WriteProcessMemory在循环中,字节在每一步中都被写入)并且它在那里工作。为什么?
  • 我不知道为什么它会在 delphi 而不是 c++ 中工作,但我知道如果你试图写入进程的内存,如果内存不可访问,你必须调用虚拟保护所以delphi 代码在写入其他进程时可能会有奇怪的行为。这对你有用吗?
  • 我稍后会通知您。这个问题是给我朋友的。在delphi中,我将它用于另一个进程。他将其用于同一进程(注入第一个 dll 然后使用 WriteProcessMemory)所以也许这就是问题所在
猜你喜欢
  • 2013-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多