C ++写入内存函数与指针

时间:2016-04-18 14:10:00

标签: c++

使用像WriteProcessMemory这样的内存写入函数和写入内存的指针有什么区别?假设我有这个地址0x12345,我希望该地址的字节为0x15。我能做到这一点:

*(unsigned char*)0x12345 = 0x15;

我可以这样做:

unsigned char data = 0x15;
WriteProcessMemory(handle,(LPVOID)pointer, &data, sizeof(data), NULL);

一个人比另一个人有什么好处?

3 个答案:

答案 0 :(得分:2)

  

一个人比另一个人有什么好处?

指针由C ++标准指定,并受所有实现支持,而WriteProcessMemory是特定于窗口的,不可移植。

这两种方式完全不同。分配给解除引用的指针会写入一个字节,而WriteProcessMemory则允许写入任意数量的字节。如果需要一种从地址开始复制多个字节的标准方法,请参阅std::memcpy

另一个主要区别是WriteProcessMemory允许您写入另一个进程的内存。在C ++中没有标准的方法可以做到这一点。进程是操作系统提供的,C ++标准没有指定如何与它们进行交互。

TL; DR如果您只是写入当前进程本身的内存,则不应使用WriteProcessMemory

答案 1 :(得分:0)

根据C ++标准,指针不一定是(平面)地址。我认为将指针放在数组(或分配)或one-past-end或nullptr之外是未定义的行为(或至少取决于平台)。

答案 2 :(得分:0)

您不应该使用第一个实现。这可以给出未定义的行为。您提供的第二个功能是Windows特定功能,这是您应该使用的功能。请记住,此应用程序不是跨平台的。

如果您想在不同的平台上执行相同操作,则必须调整代码。例如,在Linux系统上,您将使用进程跟踪库:

  

http://man7.org/linux/man-pages/man2/ptrace.2.html