分享方式:


/guard (啟用控制流程防護)

啟用控制流程防護安全性檢查的編譯器產生。

語法

/guard:cf
/guard:cf-

備註

選項 /guard:cf 會導致編譯程式分析間接呼叫目標的控制流程,然後在運行時間插入程式代碼來驗證目標。 默認為 /guard:cf off,且必須明確啟用。 若要明確停用這個選項,請使用 /guard:cf-

Visual Studio 2017 和更新版本:此選項會新增產生跳躍數據表之語句的 switch 防護。

/guard:cf指定控制流程防護 (CFG) 選項時,編譯程式和連結器會插入額外的運行時間安全性檢查,以偵測嘗試危害程序代碼。 在編譯和連結期間,程式碼中的所有間接呼叫都會經過分析,以尋找程式碼正確執行時所能到達的每個位置。 這項資訊會儲存在二進位編碼檔案標頭中的額外結構。 編譯器也會在程式碼的每個間接呼叫之前注入檢查,以確保目標是其中一個已驗證的位置。 如果在 CFG 感知作業系統上執行階段的檢查失敗,作業系統會關閉該程式。

常見的軟體攻擊,會利用在處理極端或未預期輸入方面的錯誤。 精心製作的應用程式輸入可能會覆寫包含可執行程式碼之指標的位置。 這項技術可用來將控制流程重新導向至攻擊者所控制的程序代碼。 CFG 執行時間檢查不會修正可執行檔中的數據損毀錯誤。 反而是讓攻擊者更難利用它們執行任意程式碼。 CFG 是一種緩和工具,可防止呼叫程式碼中非函式進入點的位置。 這類似於數據執行防止 (DEP)、 /GS 堆疊檢查和 /DYNAMICBASE /HIGHENTROPYVA 位址空間配置隨機化 (ASLR) 降低程式碼成為惡意探索向量的機會。

選項 /guard:cf 必須傳遞至編譯程式和連結器,才能建置使用 CFG 惡意探索風險降低技術的程序代碼。 如果您的二進位檔是使用單一 cl 命令建置,則編譯器會將選項傳遞給連結器。 如果您分別進行編譯和連結,則必須同時在編譯器和連結器命令設定選項。 /DYNAMICBASE 連結器選項也是必要的。 若要確認您的二進位檔有 CFG 資料,請使用 dumpbin /headers /loadconfig 命令。 具有 CFG 功能的二進位檔在 EXE 或 DLL 的特性清單中會有 Guard ,而防護旗標則包括 CF InstrumentedFID table present

此選項 /guard:cf/ZI [編輯後繼續偵錯資訊] 或 /clr [Common Language Runtime 編譯] 不相容。

使用 /guard:cf 編譯的程式代碼可以連結至未使用 選項編譯的連結庫和對象檔。 只有此程式代碼使用 選項連結 /guard:cf ,並在 CFG 感知作業系統上執行時,才具有 CFG 保護。 因為未使用 選項編譯的程式代碼不會停止攻擊,因此建議您在編譯的所有程式代碼上使用 選項。 CFG 檢查的運行時間成本很小,但編譯程式分析會嘗試將間接跳躍的檢查優化,這可證明是安全的。

在 Visual Studio 開發環境中設定這個編譯器選項

  1. 開啟專案的 [ 屬性頁 ] 對話框。 如需詳細資訊,請參閱 設定編譯程式和建置屬性

  2. 選取 [組態屬性>C/C++>Code 產生] 屬性頁。

  3. 選取 [控制流程防護] 屬性。

  4. 在下拉式清單控制項中,選擇 [是] 啟用控制流程防護,或選擇 [否] 將其停用。

另請參閱

MSVC 編譯器選項
MSVC 編譯器命令列語法