資料執行保護(Data Execution Prevention,簡稱DEP)作業系統中的一項安全功能,旨在防止惡意程式碼利用緩衝區溢位漏洞執行。它透過將記憶體的某些區域標記為不可執行,從而防止從這些區域執行程式碼。這適用於所有程式,包括第三方程式,而不僅僅是Windows系統元件和服務。。根據設定,DEP的保護範圍和嚴格程度會有所不同。
1. **為所有程式和服務啟用DEP**:這種模式被稱為“AlwaysOn”,它為所有程式和服務啟用了DEP保護,不允許任何程式從受保護的記憶體區域執行程式碼。這種模式提供了最大程度的保護,但可能會影響一些舊版軟體的相容性。在64位作業系統上,預設情況下DEP就是以這種方式啟用的。
2. **僅為基本Windows程式和服務啟用DEP**:這種模式被稱為“Option”,它只對Windows系統元件和服務啟用DEP保護,而對其他第三方應用程式則不啟用。這樣既可以保護系統關鍵元件不受惡意程式碼的侵害,又能避免影響大多數第三方應用程式的正常執行。這是DEP的預設設定,在一些舊的Windows版本中,可以透過系統屬性中的“資料執行保護”選項卡進行配置。
為所有程式和服務啟用DEP與僅為基本Windows程式和服務啟用DEP的主要區別在於保護範圍和潛在的相容性問題。當您選擇“為所有程式和服務啟用DEP”時,DEP將會對計算機上執行的所有程式進行監控,以確保它們安全地使用系統記憶體,從而提供更高階別的安全保護。然而,這也可能導致一些較舊的或不相容的程式出現問題或無法執行。
相反,選擇“僅為基本Windows程式和服務啟用DEP”則僅對Windows系統元件和服務提供保護,這可以減少對第三方程式的干擾,但相應地降低了對某些潛在威脅的防護。這種模式通常足以滿足大多數使用者的需求,同時保持系統的穩定性和相容性。
在“僅為基本Windows程式和服務啟用DEP”的配置下,DEP僅對關鍵的Windows系統元件和服務提供保護,但這種模式可以被應用程式動態關閉。這意味著,如果第三方程式確定它們不會受到緩衝區溢位攻擊的影響,或者它們需要執行某些特定的記憶體操作,它們可以選擇關閉DEP。然而,這可能會使這些程式容易受到攻擊,然後可能會傳播到計算機上的其他程式和檔案
資料執行保護開啟步驟如下:
1. **開啟系統屬性**:
- 在Windows搜尋欄中輸入“系統”,然後開啟它。
2. **進入高階系統設定**:
- 在系統屬性視窗中,點選“高階”選項卡,然後點選“設定”按鈕旁邊的“效能”部分。
3. **開啟資料執行保護選項**:
- 在效能選項視窗中,點選“資料執行保護”選項。
4. **選擇DEP策略**:
- 在資料執行保護視窗中,可以選擇以下選項之一:
- 僅為基本Windows程式和服務啟用DEP。
- 為所有程式和服務啟用DEP。
5. **應用更改**:
- 選擇適當的選項後,點選“應用”按鈕來儲存更改。
6. **重啟計算機**:
- 為了使更改生效,需要重啟計算機。
7. **驗證DEP狀態**:
- 開啟“命令提示符”(以管理員身份)。
- 輸入命令 `wmic OS Get DataExecutionPrevention_SupportPolicy` 並按Enter鍵。
- 系統將返回一個數字,代表DEP的當前狀態:
- **0**:所有程序都禁用DEP。
- **1**:所有程序均啟用DEP。
- **2**(預設):僅對Windows系統元件和服務啟用DEP。
8. **驗證DEP狀態是否生效**:
執行包含故意製造緩衝區溢位的程式碼,例如使用不安全的gets函式。如果DEP生效,嘗試執行該程式時,程式應該會因違反DEP規則而被作業系統終止
快取區溢位程式碼示例:
#include <stdio.h> #include <stdlib.h> int main() { // 宣告一個大小為256的字元陣列 char buffer[256]; // 透過gets函式填充buffer,這是一個危險操作,因為它不檢查邊界 printf("請輸入一些文字:"); gets(buffer); // 嘗試執行buffer中的程式碼 // 如果DEP生效,此操作將導致程式被作業系統終止 ((void (*)())buffer)(); return 0; }