我可以读取任何内存值吗

Can I read any memory value

本文关键字:内存 任何 读取 我可以      更新时间:2023-10-16

我只是想知道我是否可以通过提供内存中的任何值的地址来读取它(在我的情况下是随机的)。我知道它不会起作用,但我试过了:

int e = 10;
int* p = &e;
p = 0x220202;

这甚至不会编译。那么,有没有一种方法可以用C++或任何其他编程语言读取我电脑内存中的东西。

那么,有没有办法读取我电脑内存中的

如果你参考了你电脑的整个内存:,你就不能——至少在现代桌面/主流操作系统上不是这样。您只能从进程的地址空间读取内存。

看看虚拟内存。简而言之:你的指针指的是"虚拟"地址,而不是真实地址。计算机中的特殊硬件将这些地址转换为真实地址。操作系统定义如何进行映射。这样,每个进程都有自己独特的地址空间。每当操作系统的调度程序切换到另一个进程时,它就告诉硬件切换到相应的转换表。由于这种机制,您可以在进程之间实现隔离,这是一件非常好的事情:如果一个编程不当的应用程序访问无效内存,那么只有有问题的进程会崩溃,而系统的其他部分不会受到影响。

想想看:如果没有这种隔离,每次测试指针算术时,你可能都需要重新启动计算机。。

您可以读取操作系统分配给进程的任何值。

在您的例子中,您需要先将一个整数类型转换为指针,然后再进行赋值:

p = (int*) 0x220202; // now p points to address 0x220202
int value = *p;  // read an integer at 0x220202 into 'value'

请注意,不是地址可以访问——有些区域是只读的,在某些平台上,指针也必须正确对齐(即指向32位整数的指针应该在4字节边界上对齐)。

如果用p = (int *)0x220202替换p = 0x220202,则代码将编译。您将无法仅通过提供地址来访问任何内存。您只能访问此进程地址空间内的内存。这意味着你的操作系统只会阻止你访问另一个exe的内存。

必须将0x220202强制转换为int*

写入:

p = (int*)0x220202 ;

这将进行编译,但在运行程序时很可能会崩溃。

您将得到一个运行时错误,因为此内存不在程序的范围内

#include <iostream>
using namespace std;
int main() {
    int * p = (int *) 0x220202;
    int i = *p;
    cout << i;
    return 0;
}