Windows C++ 程序中的访问冲突总是会立即崩溃吗?
Posted
技术标签:
【中文标题】Windows C++ 程序中的访问冲突总是会立即崩溃吗?【英文标题】:Would an access violation in a Windows C++ program crash immediately always? 【发布时间】:2017-03-21 14:50:47 【问题描述】:我一直明白,如果您在任何平台的 C++ 程序(或其他任何程序)中发生访问冲突,违规程序会立即崩溃。有人告诉我,在 Windows 中并非总是如此。是对的吗?还是会像我想象的那样总是立即崩溃?
【问题讨论】:
Catching access violations on Windows的可能重复 访问未由您的程序分配的内存是未定义的行为。未定义的行为是未定义的 - 任何事情都可能发生。program would crash immediately
这不是真的。内核模式处理异常。首先,如果调试器已连接,它会首先要求调试器处理异常。如果调试器未处理(或未附加)- 异常通过 KiUserExecptionDispatcher
传递给应用程序。应用程序可以通过 VEH 或 SEH 处理它。如果仍未处理 - 作为最后机会再次将异常发送到调试器(如果附加)。如果仍未处理 - 处理异常端口发送。如果和这里没有处理 - 进程终止
事实上,访问冲突相当普遍。它们用于动态增长堆栈。堆栈末尾有一个保护页。当您需要该页面时,因为您正在调用另一个函数,Windows 通过分配额外的内存并将保护页面移动到更高的位置来修复访问冲突。也可能有其他原因 - 共同的主题是这不是 C++ 行为。
【参考方案1】:
我不知道有哪些处理器会因访问冲突导致强制崩溃。
访问冲突始终是错误(而不是陷阱)。操作系统可以允许进程设置异常处理程序(从中断向量中调用),以便纠正错误。
【讨论】:
【参考方案2】:不,如果确实如此,攻击者对缓冲区溢出所能做的最糟糕的事情就是拒绝服务。
举一个具体的例子,Windows 95 是不正确的一个 Windows 版本,其内存模型被称为“危险内存模型”。该平台上的所有 Win32 程序都获得相同的选择器,为 DOS、32 位程序、16 位程序以及内核和驱动程序保留内存空间区域,并且只能访问内存的较低部分(NULL指针引用)实际上会使程序崩溃。
【讨论】:
以上是关于Windows C++ 程序中的访问冲突总是会立即崩溃吗?的主要内容,如果未能解决你的问题,请参考以下文章
编写从 C++ 应用程序链接的 Delphi DLL:访问 C++ 接口成员函数会导致访问冲突
WindowsError:异常:使用从 C++ 到 Python 的 ctypes 创建 DLL 时出现访问冲突或 Windows 错误 193