c++ - 如何编辑随机内存?

标签 c++ pointers memory

<分区>

我要买一台新电脑,所以我和一个 friend 决定,我们想用我们电脑的内存来玩俄罗斯轮盘赌。一般前提是我们在内存中随机取一个位置并将其分配给一个随机值,然后看看谁的计算机故障/崩溃最快或最差。我所做的一切都不是一个好主意,因此不安全的做法是被接受的,甚至在这里受到鼓励。

这是我目前所拥有的:

#include <iostream>
#include <stdlib.h>
#include <time.h>

// use preprocessor to avoid losing this data during the running of the program
// 4GB RAM (4 * 2^32 bytes)
#define NUM_MEMORY_LOCATIONS 4294967296

int main()
{
    // Intializes random number generator
    time_t t;
    srand((unsigned) time(&t));

    while (true)
    {
        // 4GB RAM (2^32 bytes)
        /** generate a 31-bit number between 0b0 (0) and 0b111 1111 1111 1111 1111 1111 1111 1111 (4294967295) **/
        // generate a 15-bit number between 0b0 (0) and 0b111 1111 1111 1111 (32767)
        unsigned long int hi = rand() % 32768;
        // shift the bits
        hi <<= 16;
        // generate a 15-bit number between 0b0 (0) and 0b111 1111 1111 1111 (32767)
        unsigned long int med = rand() % 32768;
        // shift the bits
        med <<= 1;
        // generate a 1-bit number between 0b0 (0) and 0b1 (1)
        unsigned long int lo = rand() % 2;
        // combine to make final random number
        unsigned long int randNum = hi + med + lo;

        // select a random position in memory
        void * randomPointer = 0;
        randomPointer += randNum;

        // Something like this here to break my computer:
        //*randomPointer = 0;
    }
}

我不知道如何设置这个值,即使设置为 0。另外,我不确定应该使用哪种指针类型。 void 指针似乎不起作用,但我可能只是没有完全理解 c++ 中不安全内存管理的复杂性。

有人知道我该怎么做吗?任何帮助将不胜感激。

最佳答案

您不能用您的代码做到这一点:在 x86-64 系统上,您将遇到与您的可执行地址空间无关的每个地址的访问冲突。

操作系统负责决定哪些地址属于给定进程(它们经过 MMU 翻译过程,最终决定地址是否属于该进程),如果不通知处理器并根据对于操作系统,您可能会遇到访问冲突或段错误。

在 Linux 系统上,您通常会使用类似 ptrace 的内容来编辑另一个进程的内存。调试另一个进程。另一种可能性是编辑 /dev/mem .对于这两者,您都需要根访问权限。

在 Windows 系统上,您可以使用 ReadProcessMemoryWriteProcessMemory 或直接将您的代码注入(inject)您生成其地址的目标 (CreateRemoteThread) .

无论如何请记住您无法使用当前代码完成它的主要原因:现代操作系统在分页环境中运行您的应用程序,即它们提供了一个虚拟地址空间,不一定 (通常不)映射到物理地址。 因此您尝试做的是错误的,因为这些地址不会映射到物理位置。如果你真的想走那条路,你将不得不禁用或绕过分段机制、ring3/0 保护、分页、涉及 MMU 的翻译,并且可能要处理有关保留地址和 MMIO 注册间隔的大量其他问题。

关于c++ - 如何编辑随机内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25599701/

相关文章:

c - 地址重合(指针,C 编程)

c - C中的通用数组元素交换

linux - 如何制定自由策略?

将 [(K,[V])] 转置为 [(V,[K])] 时出现内存故障

c++ - va_list c++ 的问题

c++ - Mlt 框架 : Crashes while playing video

c++ - C++ atexit() 函数发生奇怪的崩溃

c++ - 在 C++ 中检测不安全的 const 引用绑定(bind)

c - 将 char* 设置为 NULL 段错误

java - 单个Linux服务器上部署多tomcat服务器,每个tomcat都有独立的JVM吗?