數據執行防止
數據執行防護 (DEP) 是系統層級記憶體保護功能,從 Windows XP 和 Windows Server 2003 開始,內建於作系統中。 DEP 可讓系統將一或多個記憶體頁面標示為非可執行檔。 將記憶體區域標示為非可執行檔表示無法從記憶體的該區域執行程序代碼,這會使惡意探索緩衝區滿溢變得困難。
DEP 可防止程式代碼從數據頁執行,例如預設堆積、堆疊和記憶體集區。 如果應用程式嘗試從受保護的數據頁執行程序代碼,就會發生記憶體存取違規例外狀況,如果未處理例外狀況,則會終止呼叫進程。
DEP 不是針對所有惡意探索的全面防禦;它是另一個工具,可用來保護應用程式。
數據執行預防的運作方式
如果應用程式嘗試從受保護的頁面執行程式碼,應用程式會收到例外狀況,狀態代碼 STATUS_ACCESS_VIOLATION。 如果您的應用程式必須從記憶體頁面執行程式碼,則必須配置並設定適當的虛擬 記憶體保護 屬性。 配置記憶體時,必須標示為 PAGE_EXECUTE、PAGE_EXECUTE_READ、PAGE_EXECUTE_READWRITE或 PAGE_EXECUTE_WRITECOPY。 呼叫 malloc 和 HeapAlloc 函式所進行的堆積配置是非可執行的。
應用程式無法從預設進程堆積或堆疊執行程序代碼。
DEP 會根據開機組態數據中的無執行頁面保護原則設定,在系統開機時設定 DEP。 應用程式可以藉由呼叫 getSystemDEPPolicy 函式 來取得目前的原則設定。 視原則設定而定,應用程式可以呼叫 SetProcessDEPPolicy 函式來變更目前進程的 DEP 設定。
程序設計考慮
應用程式可以使用 VirtualAlloc 函式,搭配適當的記憶體保護選項來配置可執行記憶體。 建議至少設定應用程式集 PAGE_EXECUTE 記憶體保護選項。 產生可執行程式代碼之後,建議應用程式設定記憶體保護,以不允許寫入已配置的記憶體。 應用程式可以使用 VirtualProtect 函式,不允許對已配置的記憶體進行寫入存取。 不允許寫入存取可確保進程位址空間可執行區域的最大保護。 您應該嘗試建立可能使用最小可執行位址空間的應用程式,以將暴露在記憶體惡意探索中的記憶體數量降到最低。
您也應該嘗試控制應用程式的虛擬記憶體配置,並建立可執行的區域。 這些可執行區域應該位於記憶體空間低於非可執行區域的記憶體空間中。 藉由在非可執行區域下方尋找可執行文件區域,您可以協助防止緩衝區溢位到記憶體的可執行文件區域。
應用程式相容性
某些應用程式功能與 DEP 不相容。 執行動態程式代碼產生的應用程式(例如 Just-In-Time 程式代碼產生),且未明確標示具有執行許可權的產生的程式代碼,可能會在使用 DEP 的電腦上發生相容性問題。 寫入至 Active Template Library (ATL) 7.1 版和更早版本的應用程式可以嘗試在標示為非可執行文件的頁面上執行程式代碼,這會觸發 NX 錯誤並終止應用程式:如需詳細資訊,請參閱 SetProcessDEPPolicy。 執行與 DEP 不相容之動作的大部分應用程式都必須更新,才能正常運作。
少數可執行檔和連結庫可能包含圖像檔之數據區段中的可執行程序代碼。 在某些情況下,應用程式可能會在數據區段中放置一小段程式代碼(通常稱為 Thunks)。 不過,除非區段已套用可執行檔屬性,否則 DEP 會將映射檔的區段標示為非可執行檔。
因此,數據區段中的可執行程式碼應該移轉至程式代碼區段,或包含可執行程式代碼的數據區段應明確標示為可執行檔。 可執行文件屬性 IMAGE_SCN_MEM_EXECUTE應該新增至包含可執行程式代碼之區段標頭之對應區段標頭的 特性 字段。 如需將屬性新增至區段的詳細資訊,請參閱連結器隨附的檔。
相關主題
如何在 Windows XP SP2 中設定記憶體保護