2009-11-18 16 views
1

如您所知,/GS是Visual C++編譯器或鏈接器選項。[c#]如何指定/ GS,選項到C#應用程序?

  1. 我可以在c#編譯器或鏈接器中指定/ GS嗎?

  2. c#應用程序默認啓用這些標誌嗎?

    [編輯]:更改問題內容:

    2a。這些功能在C#應用程序中默認啓用(通過Visual C++中的這些編譯器選項) ?

  3. 有沒有辦法找出一個.exe/.dll文件是用這些標誌構建的嗎?

在此先感謝。

回答

2

我猜你試圖做一個代碼審計/運行靜態分析工具,以確保security/SDL best practices被跟蹤。如果您繼續閱讀...

有一個名爲Binscope的工具,可用於檢查您的本機/ C++二進制文件是使用/ GS,/ SafeSEH,/ NXCOMPAT和/ DYNAMICBASE編譯的。這些是特定於C++的選項,使攻擊者難以利用緩衝區溢出。 (Binscope還檢查其他一些東西)

Binscope在C#/託管二進制文件中檢查的唯一情況是,它們是否使用強名稱。對於C#而言,最接近binscope的是FxCop,它將詳細說明託管的.Net代碼中的一系列潛在問題。爲了安全起見,修復FxCop產生的任何安全警告,並且您正在路上。

/analyze標誌使Visual Studio對您的本機代碼執行一些靜態分析,並讓您知道它是否發現任何可疑內容。 C#/ .Net等價物是FxCop的安全部分。

+0

感謝您的幫助。 BinScope真的幫了我。 – whunmr 2009-11-18 09:41:51

4

C#中不存在這些選項,因爲C#生成託管代碼,而C++生成本機代碼(機器語言代碼)。被管理的代碼被稱爲「可驗證的」,因爲它比C/C++有更嚴格的檢查,並以C++和本地代碼無法實現的類型安全性。 (這些檢查與使用C++/CLI編寫的託管代碼無關)。

其中大部分原因是由於本機代碼直接在硬件上運行,託管代碼在.NET運行時(CLR)內運行。

,請允許我一個

  1. 走過去的一個選項/分析 - 我不是所有熟悉這個選項,但看list of what it checks,沒有這些錯誤是可能的或有問題託管代碼。例如,第一個警告C6031不是問題,因爲託管代碼會拋出一個異常,當它不成功時不會被忽略。
  2. /GS - 託管代碼(忽略unsafe)不能直接訪問內存並且不受緩衝區溢出的影響。你會得到一個異常,而不是溢出到其他內存中。
  3. /DynamicBase - 託管代碼生成稱爲中間語言(IL)的字節,並在運行時動態編譯爲本地代碼(JIT),因此它沒有固定的地址空間來隨機化。
  4. /SafeSEH - 託管代碼具有自己的異常機制,不使用SEH。
+0

感謝您的深入分析。 – whunmr 2009-11-18 09:45:29

相關問題