資料執行防止
從 Windows XP 和 Windows Server 2003 開始,資料執行防護 (DEP) 是作業系統內建的系統層級記憶體保護功能。 DEP 可讓系統將一或多個記憶體分頁標示為非可執行檔。 將記憶體區域標示為非可執行檔表示無法從該記憶體區域執行程式碼,這會使緩衝區溢位的惡意探索變得困難。
DEP 可防止程式碼從資料頁執行,例如預設堆積、堆疊和記憶體集區。 如果應用程式嘗試從受保護的資料頁執行程式碼,就會發生記憶體存取違規例外狀況,如果未處理例外狀況,則會結束通話進程。
DEP 不是針對所有惡意探索的完整防禦;其用途是另一個可用來保護應用程式的工具。
資料執行防護的運作方式
如果應用程式嘗試從受保護的頁面執行程式碼,應用程式會收到狀態碼 STATUS_ACCESS_VIOLATION例外狀況。 如果您的應用程式必須從記憶體頁面執行程式碼,則必須配置並設定適當的虛擬 記憶體保護 屬性。 配置記憶體時,必須標示 PAGE_EXECUTE、 PAGE_EXECUTE_READ、 PAGE_EXECUTE_READWRITE或 配置記憶體PAGE_EXECUTE_WRITECOPY 。 呼叫 malloc 和 HeapAlloc 函式所進行的堆積配置是非可執行檔。
應用程式無法從預設進程堆積或堆疊執行程式碼。
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應該新增至對應區段標頭的 [特性 ] 欄位。 如需將屬性新增至 區段的詳細資訊,請參閱連結器隨附的檔。