我可以读取任何内存值吗
Can I read any memory value
我只是想知道我是否可以通过提供内存中的任何值的地址来读取它(在我的情况下是随机的)。我知道它不会起作用,但我试过了:
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;
}
- 尝试摆脱任何堆内存分配
- 为什么瓦尔格林德在不释放恶意内存后没有报告任何问题?
- c++ 编译器是否保护常量内存地址免受任何更改?
- 对于堆上的页面对齐内存分配是否有任何优化或不同的 API?
- 在没有任何锁的情况下加入另一个线程后是否需要内存围栏?
- 如果 RMW 操作没有任何变化,是否可以针对所有内存顺序对其进行优化
- 指针可以用于访问内存中的任何任意区域吗?
- 测量任何 Windows 可执行文件的内存使用情况和执行时间
- 内核模式驱动程序可以在任何进程上执行读取进程内存吗?
- 我可以在没有任何锁的情况下从不同的线程读取内存缓冲区吗?
- 友元函数将内存分配给数组成员是否有任何限制?
- 这些场景中的任何一个是否会造成内存泄漏
- 从字符串和向量移动以不拥有任何堆内存
- QaudioOutput代码是否有任何内存泄漏
- Do C 参考需要任何内存
- 没有任何数据成员的类会导致内存泄漏吗?
- 对于数据成员,如果包含对象已在动态内存中,则动态分配此变量(或不动态分配)之间是否有任何区别
- 是否有任何工具支持C++基于检查点的内存使用情况分析
- 当“std::vector”调整内存大小时,避免使用任何自动变量
- 此代码中是否有任何内存泄漏