C# 应用程序在已部署 (.exe) 版本中因缓冲区溢出而崩溃,但在 Visual Studio 中则不然

Posted

技术标签:

【中文标题】C# 应用程序在已部署 (.exe) 版本中因缓冲区溢出而崩溃,但在 Visual Studio 中则不然【英文标题】:C# Application crashes with Buffer Overrun in deployed (.exe) version, but not in Visual Studio 【发布时间】:2011-01-28 17:13:52 【问题描述】:

我有一个 c# Windows Forms 应用程序,它可以在 Visual Studio 中完美运行,但在部署并从 .exe 运行时会崩溃。它因缓冲区溢出错误而崩溃......而且很明显,这个错误不是从我的代码中抛出的。相反,windows 必须检测到某种缓冲区溢出并从外部关闭应用程序。我认为没有特定的代码行导致它..它只是间歇性地发生。

是否有人对缓冲区溢出错误的可能原因有任何想法,以及为什么它只会在部署的应用程序中发生,而不是在使用 Visual Studio 运行时发生?

提前致谢, 本

【问题讨论】:

你试过不同的电脑吗? 你能提供确切的错误吗? 谢谢。是的,它发生在多台 PC 上。我刚刚在下面的评论中发布了错误。 【参考方案1】:

这是由行为不当的非托管 C/C++ 代码引起的错误。非托管 CRT 通过在堆栈帧中存储 cookie 来验证代码不会超出位于堆栈上的数组的末尾。当一个函数返回时,它会检查 cookie 是否仍然存在。如果不是,则假定某种恶意代码或 C/C++ 代码中的错误已经破坏了堆栈帧。公平的假设,这就是 90 年代后期大多数病毒感染的工作方式。

这是 C/C++ 代码中的错误的可能性约为 99.999%,机器受到攻击的可能性为 0.001%。您需要找到该 C/C++ 代码并联系编写该代码的程序员以修复错误。如果您不知道去哪里寻找,首先要怀疑任何类型的 ActiveX 控件或 COM 服务器。并将非托管模式下的调试器附加到程序的运行版本,以查看它加载了哪些 DLL。使用 Debug + Windows + Modules 并验证您是否可以考虑所有 DLL。

哦,崩溃详细信息将有助于本地化源代码。

【讨论】:

【参考方案2】:

你必须更具体。

通常你有一些错误的非托管代码。

【讨论】:

确切的错误是:MyApplication.exe 发生缓冲区溢出,损坏了程序的内部状态。按 Break 调试程序或按 Continue 终止程序。很难提供代码......我无法确定它在哪里崩溃!我正在向几乎每一行代码添加日志语句,但到目前为止我还没有检测到模式。 为什么不按错误状态“按中断调试程序”?为什么不尝试将应用程序附加到 Visual Studio 中的调试器(当然,您的应用程序应该在调试模式而不是发布模式下运行)?你在使用不安全的代码块吗?

以上是关于C# 应用程序在已部署 (.exe) 版本中因缓冲区溢出而崩溃,但在 Visual Studio 中则不然的主要内容,如果未能解决你的问题,请参考以下文章

如何将 C# 控制台应用程序部署为单个 exe? [复制]

HashAlgorithm.Create 在 C# ASP.NET Core 2 中因 PlatformNotSupportedException 而失败

C# Winforms 软件部署 (setup.exe) 后数据库连接会发生啥?

c++缓冲区溢出问题

IErrorInfo.GetDescription 在 asp.net c# 中因 E_FAIL(0x80004005) 而失败?

不要在已编译的 exe 上工作关键侦听器