C++ 缓冲区溢出到不同的exe';什么是记忆?或从远程桌面程序加载到csrss.exe?

C++ 缓冲区溢出到不同的exe';什么是记忆?或从远程桌面程序加载到csrss.exe?,c++,memory,visual-c++,memory-management,buffer-overflow,C++,Memory,Visual C++,Memory Management,Buffer Overflow,简短的问题形式: 我在谷歌上搜索了一下,但没有找到答案:是否有可能将溢出内存缓冲到另一个exe的内存中?和/或,是否可能从远程桌面会话上运行的exe溢出csrss.exe的内存 长话短说-我们的情况如下: 我们有一个服务器,它运行的远程桌面会话有24/7个程序运行——一个C++ .exe。更糟糕的是,C++ exe是用各种不安全的内存操作(原始的StrucPy、SpaFrTf等)编程的,你不必告诉我这是多么的坏,我完全同意。 最近,我们的服务器一直有蓝色屏幕的死亡,而DUMPFILE表明CSRS

简短的问题形式:

我在谷歌上搜索了一下,但没有找到答案:是否有可能将溢出内存缓冲到另一个exe的内存中?和/或,是否可能从远程桌面会话上运行的exe溢出csrss.exe的内存

长话短说-我们的情况如下:

我们有一个服务器,它运行的远程桌面会话有24/7个程序运行——一个C++ .exe。更糟糕的是,C++ exe是用各种不安全的内存操作(原始的StrucPy、SpaFrTf等)编程的,你不必告诉我这是多么的坏,我完全同意。

最近,我们的服务器一直有蓝色屏幕的死亡,而DUMPFILE表明CSRSS.exe正被我们的C++ exe(这将导致BSOD)终止,CSRSS.EXE也负责管理远程桌面会话。 所以我想知道是否有人知道一个应用程序的内存缓冲区溢出是否可能溢出到另一个应用程序的内存空间,或者远程桌面会话上的应用程序是否可能溢出到csrss.exe


任何帮助都将不胜感激!

简短回答不,不是

原因的简化解释。每个程序都在自己的虚拟地址空间中运行。该虚拟地址空间由页表控制,页表本质上是一个查找表,用于映射虚拟地址(可执行文件指针中的地址)物理内存地址。当操作系统切换到某个任务时,它会将正确的表交给运行该任务的cpu/核心。此表中未提及的任何物理地址都无法从程序中访问。属于另一个应用程序的物理地址不应出现在此表中,因此无法访问以下内存ng到另一个应用程序。当程序行为不正常并访问无效内存位置时,它将尝试使用表中未提及的虚拟地址。这将触发cpu上的异常/故障,通常在windows中报告为“访问冲突”

当然,OS和CPU都可以包含错误,所以不可能保证它不会发生。但是如果C++程序不正常,那么大部分时间都会被CPU捕获并报告为访问冲突而不会导致BSOD。如果你没有看到C++程序产生访问违规,我希望它会被B破坏。问题很可能是由错误的内存或错误的驱动程序引起的(驱动程序以更高的权限运行,可以做正常程序无法做的事情)

我想说的是,首先用memtest86这样的程序进行广泛的内存测试。顺便说一句,如果服务器是一个带有ECC内存的“真实”服务器,那么内存故障不应该是问题,因为系统应该报告这一情况

更新 不管内存访问如何发生下溢、溢出、未初始化指针。使用的虚拟地址要么映射到为程序保留的物理内存位置,要么根本没有映射。顺便说一句,检查是由CPU完成的操作系统只维护用于查找的表


然而,这并不意味着程序的每一个错误都会被检测到,因为只要它正在访问分配给它内存的地址,就CPU而言,访问是正常的。程序中的堆管理器可能会有不同的想法,但无法检测到这一点。因此,即使是地址空间末尾的缓冲区溢出也可以esn并不总是导致访问冲突,因为内存分配给程序的页面至少为4kB,堆管理器将这些页面细分为程序要求的较小的块。因此,您的小10字节缓冲区可以位于这样一个页面的开头,并且就cpu而言,向其写入1000字节是完全正确的d、 因为所有这些内存都是为供程序使用而设置的。但是,当您的10字节缓冲区位于页面末尾,并且下一个条目未分配给物理地址位置时,将发生访问冲突。

简短回答否否否

原因的简化解释。每个程序都在自己的虚拟地址空间中运行。该虚拟地址空间由页表控制,页表本质上是一个查找表,用于映射虚拟地址(可执行文件指针中的地址)物理内存地址。当操作系统切换到某个任务时,它会将正确的表交给运行该任务的cpu/核心。此表中未提及的任何物理地址都无法从程序中访问。属于另一个应用程序的物理地址不应出现在此表中,因此无法访问以下内存ng到另一个应用程序。当程序行为不正常并访问无效内存位置时,它将尝试使用表中未提及的虚拟地址。这将触发cpu上的异常/故障,通常在windows中报告为“访问冲突”

当然,OS和CPU都可以包含错误,所以不可能保证它不会发生。但是如果C++程序不正常,那么大部分时间都会被CPU捕获并报告为访问冲突而不会导致BSOD。如果你没有看到C++程序产生访问违规,我希望它会被B破坏。问题很可能是由错误的内存或错误的驱动程序引起的(驱动程序以更高的权限运行,可以做正常程序无法做的事情)

我想说的是,首先用memtest86这样的程序进行广泛的内存测试。顺便说一句,如果服务器是一个带有ECC内存的“真实”服务器,那么内存故障不应该是问题,因为系统应该报告这一情况

更新 不管内存访问如何发生下溢、溢出、未初始化指针