C ++:我可以用指针摆脱应用程序内存的界限吗?

时间:2010-06-04 16:36:09

标签: c++ memory pointers

如果我有一些像这样的愚蠢代码:

int nBlah = 123;
int* pnBlah = &nBlah;
pnBlah += 80000;
*pnBlah = 65;

我可以更改其他应用的内存吗?

你告诉我这是邪恶的,我知道。但我只是感兴趣 这不是简单的尝试。我不知道会发生什么。

由于

5 个答案:

答案 0 :(得分:15)

在C ++术语中,这是未定义的行为。实际发生的情况取决于许多因素,但最重要的是它取决于您使用的操作系统(OS)。在现代内存管理的操作系统上,您的应用程序将以“分段故障”(实际术语取决于操作系统)终止,以尝试访问进程地址空间之外的内存。然而,有些操作系统没有这种保护,你可以毫不犹豫地戳破并破坏属于其他程序的东西。如果您的代码在内核空间内,例如通常也是如此。在设备驱动程序中。

答案 1 :(得分:7)

不,这不是那么简单。 :)

现代操作系统使用虚拟内存

每个进程都提供一个完整的虚拟地址空间。

每个进程都有自己的所有地址“视图”(在32位系统上从0x00000000到0xffffffff)。进程A和B都可以写入相同的地址,而不会影响彼此,因为它们不访问物理内存地址,而是访问虚拟地址。当进程尝试访问虚拟地址时,操作系统会将其转换为其他物理地址以避免冲突。

实际上,操作系统会跟踪每个进程的分配内存页表。它跟踪已分配给进程的地址范围,以及它们映射到的物理地址。如果进程尝试访问未分配给它的地址,则会出现访问冲突/分段错误。如果您尝试访问 分配给您的流程的地址,您将获得自己的数据。因此,仅通过输入“错误”地址就无法读取其他流程数据。

答案 2 :(得分:6)

在现代操作系统下,您无法访问实际内存,而是访问4gb(32位以下)的虚拟内存空间。底部2gb供您使用,顶部2gb为操作系统保留。

这并不反映RAM中的实际内存字节。

每个app都获得相同的虚拟地址空间,因此没有直接的方式来访问另一个进程的内存空间。

答案 3 :(得分:2)

我认为这会引发0x00000005,Windows上的访问冲突

答案 4 :(得分:0)

现代操作系统有各种方法来防止写入其他程序的内存空间的这些漏洞。你的代码不会以任何方式工作,我不这么认为。

有关详细信息,请阅读缓冲区溢出攻击以及它们在Windows XP SP2发布之前如何给予Microsoft地狱。