1

如您所知,/GS 是 Visual C++ 编译器或链接器选项。

  1. 我可以在 c# 编译器或链接器中指定 /GS 吗?

  2. 这些标志在 c# 应用程序中是否默认启用?

    [编辑]:更改问题内容:

    2a. 在 c# 应用程序中是否默认启用这些功能(通过 Visual C++ 中的这些编译器选项)?

  3. 有没有办法找出使用这些标志构建的 .exe/.dll 文件?

提前致谢。

4

2 回答 2

6

C# 中不存在这些选项,因为 C# 生成托管代码,而 C++ 生成本机代码(机器语言代码)。托管代码被称为“可验证”,因为它具有比 C/C++ 更严格的检查,并以 C++ 和本机代码无法做到的方式强制执行类型安全。(这些检查与用 C++/CLI 编写的托管代码无关)。

这在很大程度上是由于本机代码直接在硬件上运行而托管代码在 .NET 运行时 (CLR) 内运行。

请允许我一一浏览选项

  1. /analyze - 我对这个选项不是很熟悉,但是查看它检查的列表,这些错误都不可能出现,也不是托管代码中的问题。例如,第一个警告 C6031 不是问题,因为托管代码会在不成功时抛出一个无法忽略的异常。
  2. /GS - 托管代码(忽略unsafe)不直接访问内存并且不受缓冲区溢出的影响。你会得到一个异常而不是溢出到其他内存中。
  3. /DynamicBase - 托管代码生成称为中间语言 (IL) 的字节,并在运行时动态编译为本机代码 ( JIT ),因此它没有固定的地址空间来随机化。
  4. /SafeSEH - 托管代码有它自己的异常机制并且不使用 SEH。
于 2009-11-18T05:55:34.070 回答
2

我猜您正在尝试进行代码审核/运行静态分析工具,以确保遵循安全/SDL 最佳实践。如果您继续阅读...

有一个名为Binscope的工具可用于检查您的本机/C++ 二进制文件是否使用 /GS、/SafeSEH、/NXCOMPAT 和 /DYNAMICBASE 编译。这些是 C++ 特定的选项,使攻击者更难利用缓冲区溢出。(Binscope 还会检查其他一些东西)

Binscope 在 C#/托管二进制文件中唯一检查的是它们是否使用强名称。与 C# 的 binscope 最接近的是FxCop,它将详细说明托管 .Net 代码中的一系列潜在问题。为了安全起见,请修复 FxCop 产生的任何安全警告,然后您就可以使用了。

/analyze 标志使 Visual Studio 对您的本机代码进行一些静态分析,并让您知道它是否发现任何可疑之处。C#/.Net 等价物是 FxCop 的安全部分。

于 2009-11-18T05:12:15.233 回答