微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

你可以使用mingw编译的程序访问其他程序的内存吗?

我在Windows 8.1上编写了这个非常简单的程序,并使用Mingw的gcc进行编译。 我用“test.exe> t.txt”和“test.exe> t1.txt”运行它,输出是不同的(即使它使用虚拟地址)。 它跑了一段时间,然后坠毁。 我决定testing这个,因为我正在阅读一本关于操作系统的书。

它读取其他程序的内存吗? 这不是不应该发生? 我可能误解了一些东西

#include <stdio.h> int main(int argc,char *argv[]){ int r = 0; int p[4] = {1,5,4,3}; for(r=0; p[r]!=1111111111111111; r++){ p[2] = p[r]; printf("%dn",p[2]); } return 0; }

谢谢。

Linux 2.6.x中的线程dynamic优先级是如何计算的?

一次可以打开多less个TCP套接字?

Linux编程接口中的信号处理程序示例

系统调用通常如何实现

网上法官的安全问题

在两个进程之间的通信中是否只有一个Unix域套接字?

按值传递std :: function <bool(int)>

为什么物理地址在运行中是相同的?

如何获得每个进程的准确cpu使用率和进程空闲cpu时间

任何人都可以告诉我如何以及他们如何在标题栏上5button而不是3最大,resize,在Windows中closures?

SadSeven,我假设你正在故意读完数组的结尾。 你所看到的并不是其他程序内存,它是程序内存中未初始化的内存。

每个程序都在自己的虚拟内存空间中运行,操作系统的虚拟内存管理器负责处理这个问题。 你不能从你的程序访问另一个程序存储器(除非你使用共享内存,但你必须这样做)

你还没有初始化p[3]以外的任何东西。 C语言不能保证当你试图访问没有被数据激发的地址时会发生什么。 你可能会看到一堆垃圾,但垃圾是不是由你写的程序定义的。 这可能是任何事情。

在崩溃之前您正在访问的地址仍属于当前进程,它只是存在于堆栈和堆之间的单元化内存。

该进程可能由于分段错误而崩溃,当进程试图访问不属于它的内存时发生。 当它试图在自己的记忆之外访问时,这将是一个点。

你看到的输出是从阅读自己的记忆。 当它到达没有分配给进程的内存时,它会崩溃。

编辑:

为了使计算机病毒变得更难,程序的起始地址在每次运行时都会有所不同 。 所以如果你多次运行它,你应该会得到不同的输出。 在Windows中,地址空间布局不是随机的所有程序 。

你的程序超过了一个本地(自动)变量,这意味着它将遍历栈帧 。 堆栈帧包含局部变量,函数参数,保存的寄存器,函数调用的返回地址,以及指向前一个堆栈帧结束的指针。 如果变量都具有相同的值,则任何差异都将由存储器地址不同来解释。 可能还有其他原因,我不知道,因为我不是在Windows内存布局的专家。

在你的代码中, for循环是错误的。

for(r=0; p[r]!=1111111111111111; r++)

它试图从r的值4开始访问超出限制的内存。 结果是未定义的行为 。

它可以运行良好,直到r是1997 ,它可能会在r值4崩溃,甚至可能开始播放歌曲在你的播放列表2015 r值。 r值3后行为不能保证。

每个进程在其单独的4GB虚拟地址空间内运行,尝试超出边界读取将不会读取另一个进程的内存。 它会从自己的地址空间读取垃圾。 现在,你一直在问为什么输出是不同的,ASLR随机化了一个可执行文件的关键部分,从而在一个进程的实例中给出了不同的入口点和堆栈地址,因此即使是多次运行的相同进程也会有不同入口点

阅读有关ASLR的: http : //en.wikipedia.org/wiki/Address_space_layout_randomization阅读有关虚拟内存: http : //en.wikipedia.org/wiki/Virtual_memory

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐