使用DEP機制有助于防止計算機受到病毒和其他惡意程序的攻擊和破壞,DEP會讓計算機分配一部分內存用來存儲數據,分配另一部分內存供程序使用。DEP可以監控程序的運行,保證其可以安全使用內存,保護計算機避免黑客的侵襲。如果DEP發現有程序試圖從存儲數據的內存中執行指令,就會將其關閉并通知用戶。
根據操作系統設計原理,系統程序或某些應用軟件會被要求在特定的內存區域內運行,這個內存區域如果受到其他程序的破壞,會導致程序出錯,甚至系統崩潰。而DEP技術可以有效地防止這類情況發生。如果啟動了DEP保護機制,Windows就會自動關閉試圖執行溢出操作的程序。
DEP在程序執行時,將可執行代碼所占用的內存區域自動標記出來。支持DEP的CPU利用NX技術識別這些標記出來的區域。當DEP發現當前執行代碼沒有明確標記為可執行,就會禁止其執行。
這樣,當病毒和其他利用溢出技術進行攻擊的惡意程序自然無計可施。DEP之所以可以發揮作用,是因為幾乎沒有任何合法程序會在內存的堆棧段中存放執行代碼,而緩沖區溢出后執行的代碼又是放在堆棧段上的。DEP從實現的機制上看,分為軟件DEP和硬件DEP。對于前者來說,主要用來阻止針對SEH(Structure Exception Handler,異常處理結構體)發起的攻擊。
為了保證系統遇到這些錯誤時不至于崩潰,讓其可以穩定的運行下去,Windows會對運行在其中的程序提供補救的機會來處理錯誤,這就是系統的異常處理機制。而黑客程序會通過改寫SEH堆棧中的異常處理函數指針,并利用Windows存在各種漏洞來執行攻擊行為。
從Windows XP SP2版本開始,微軟提供了SEH驗證機制,在程序調用異常處理函數前對要調用的異常處理函數進行有效性校驗,當發現異常處理函數不可靠時將終止調用操作。這種軟件DEP機制和CPU無關,Windows利用軟件模擬實現DEP保護功能,對操作系統加以保護。硬件DEP才能稱得上真正意義上的DEP保護機制,這需要CPU的支持,對于AMD的CPU來說,稱為 NX(No-Execute Page-Protection)。對于Intel的CPU來說,稱為XD(Execute Disable Bit)。
雖然名稱不同,但是兩者的工作原理和保護功能是一致的。Windows通過在對應的內存頁中設置NX/XD屬性標志來禁止從這些內存頁中執行代碼。其實現方法是在內存的頁面表中針對特定的內存頁加入一個特殊的NX/XD標志位,來指示是否允許在該內存頁上執行指令。當該標識位設置為0時,表示允許在該頁面執行代碼,設置為1時則禁止在該頁面中執行指令。在系統屬性窗口中打開“高級”面板,在“性能”欄中點擊“設置”按鈕,在性能選項窗口中的“數據執行保護”面板(如圖1)中可以查看該機的CPU是否支持硬件DEP。如果在窗口底部顯示“您的計算機處理器支持基于硬件的DEP”內容,說明其支持DEP,否則的話,說明其不支持硬件DEP。

圖1 查看DEP管理界面
即使不支持硬件DEP,Windows也可以使用軟件DEP模式來保護某些類型的攻擊。DEP針對溢出操作的源頭,有力的強化了內存管理機制。通過將內存頁設置為不可執行狀態,來阻止堆棧中Shellcode程序的運行,稱得上是最有力的緩沖溢出保護機制。
當然,我們在運行某些軟件時,需要對其進行一番了解,最好使用與DEP兼容的版本。運行這類程序,就會受到DEP的保護。最好不要輕易運行與DEP不兼容的程序,盡量降低潛在的風險。對于自己完全信任的程序,可以視情況關閉DEP,對于外來的不可知的程序,最好打開DEP保護功能。在上述“數據執行保護”面板中選擇“為除下列選定的程序之外的所有程序和服務啟用DEP”項,點擊“添加”按鈕,將自己信任的程序導入進來,之后重啟系統即可。
注意,DEP和防病毒軟件或防火墻軟件是不同,DEP并不是一種防病毒軟件,不能阻止病毒等惡意程序潛入系統,也不具備殺軟等安全軟件具有的病毒檢測和查殺功能,DEP是通過對程序進行監控,確定它們是否能夠安全地使用系統內存的技術。因此DEP是一種操作系統底層的安全機制,通過這種安全機制,可以防御病毒、蠕蟲等惡意程序利用緩沖區漏洞進行非法溢出操作,但是DEP并不會防御所有類型的病毒。
根據啟動參數的不同,DEP工作狀態分為Optin、Optout、AlwaysOn、AlwaysOff等模式。對于Optin模式來說,默認僅將DEP保護應用于Windows系統組件和服務,對其他程序不進行保護。但用戶可以通過應用程序兼容性工具,為選定的程序啟用DEP保護功能,在開發者使用Visual Studio 2008等工具編譯程序時,可以使用特定的鏈接選項,采用“/NXCOMPAT”參數執行編譯處理,這樣得到的程序將自動應用DEP保護機制。對于Optout模式來說,可以通過設置排除列表的方法,將不需要DEP保護的程序添加到排除列表中,其余的程序則啟用DEP保護功能。
對于AlwaysOn模式來說,針對所有的進程啟用DEP保護功能,在該模式下DEP不可以被關閉。只有在64位的操作系統上才可以使用AlwaysOn模式。對于AlwaysOff模式來說,對所有的進程都禁用DEP保護,在該模式下,DEP無法被動態開啟,該模式只能在特定的場合下才可以使用,例如為了避免DEP干擾程序的正常運行等。例如,對于Windows XP來說,可以在其系統盤根目錄下的“boot.ini”進行編輯,來切換DEP保護模式。在對應啟動型后面追加“/noexecute=optout”或 者“/noexecute=Optin”語句,來采用Optin或者Optout模式。如果使用了“AlwaysOff”參數,表示禁用DEP。對于Windows 7等系統來說,可以執行“bcdedit.exe /set {curent} nx AlwaysOn”命令,開啟DEP的AlwaysOn模式,在該命令中 使 用“Optin”、“Optout”、“AlwaysOff”等參數,可以激活對應的保護模式。
對于某些電腦來說,使用DEP保護機制可能會對某些程序或者整個系統的運行造成不利影響。例如,如果在開啟IE時,頻繁出現“已經關閉了此程序”的提示,導致IE無法順利運行的話,就說明和DEP機制存在沖突的問題。
為此可以在開機時進入主板BIOS設置界面,在其中找到和DEP配置相關 的 項 目(例 如“Execute Disable Function”等),設置為“Disable”項,關閉硬件DEP保護功能,就可以解決問題。在沒有DEP保護的情況下,必須為系統安裝強悍的殺軟來防御病毒、木馬等惡意程序的威脅。當然,也可以管理員身份打開CMD窗口,在其中執行“bcdedit.exe /set {curent} nx AlwaysOff”命令來關閉DEP功能。
當然,最好按照上述方法,將IE添加到DEP中的排除列表中,不讓DEP對IE進行管控,這樣可以很好的解決該問題。在一般情況下,DEP會監控系統程序和服務,使其安全的使用內存。DEP會單獨與CPU一起將某些內存區域標記為不可執行狀態。如果某個程序試圖從受保護的位置執行代碼,DEP就會將其關閉并通知用戶。即使其不是惡意代碼,也會被DEP強制關閉。在DEP提供給用戶的報告窗口中點擊“單擊此處”鏈接,在詳細信息界面中可以顯示出錯程序的名稱以及版本信息。用戶可以據此來分析該程序的安全性,并根據需要將其添加到DEP排除列表中即可。
當然,如果該程序已經提供了升級版本,并支持DEP保護機制,最好的辦法是對其升級,使其可以在DEP保護下正常運行。
DEP雖然擁有強大的保護功能,但也存在一些弱點,無法徹底阻止緩沖區溢出攻擊。例如,對于硬件DEP保護機制來說,需要CPU的支持才行,但并非所有的CPU都提供硬件DEP支持,一些較老的CPU是不支持硬件DEP的。因為兼容性的原因,Windows有時無法對所有的進程都開啟DEP保護功能。尤其對于一些第三方的DLL插件來說,可能不支持DEP,一旦開啟了DEP,很可能造成進程運行異常。使用老版本的應用程序兼容性工具,需要在數據頁面上產生可執行代碼,這就無法開啟DEP,否則很容易出現運行故障。
在編譯程序時,即使使用了“/NXCOMPAT”參數,也只能對Vista以上的版本有效,對于XP等老系統來說,這樣的設置會被忽略。當DEP運行在Optin或者Optout模式時,DEP是可以被動態關閉和開啟的,因為操作系統內置了一些API函數,可以控制DEP的工作狀態。如果一些惡意進程非法調用了這些API、函數,就可以關閉DEP保護功能,為系統帶來了潛在的安全隱患。實際上,微軟出于兼容性的需求,不能對所有的進程都開啟DEP功能。當然,對于64位系統來說,采用AlwaysOn模式可以避免該問題。DEP保護的目標是進程,當某個進程加載的DLL模塊中如果存在某個模塊不支持DEP的話,該進程就不會貿然開啟DEP,主要是為了避免異常的發生。
打開任務管理器,在“進程”面板中點擊菜單“查看”→“選擇列”項,選擇“數據執行保護”項。在進程列表中的“數據執行保護”列中可以查看不同進程是否支持DEP的情況,只有顯示“啟用”字樣,才表示對應的進程支持DEP。如果惡意程序攻擊沒有啟用DEP保護功能的進程,就很容易溢出成功。DEP之所以可以防止非法溢出,關鍵在于當其檢測到程序跳轉到非可執行頁執行指令話,就會拋出異常,執行異常處理程序。但是,如果惡意程序跳轉到已經存在的某個系統函數中,因為該函數是存在于可執行頁上的,DEP自然不會對其攔截。這樣,惡意程序就可以在該執行頁中找到其所需的指令,進而執行該指令,利用惡意程序自身提供的流程控制功能,可以執行完畢后自動返回。繼續執行其他操作。
為了順利運行,惡意程序甚至會直接調用相關的API函數,將DEP直接關閉。因為在Optout和AlwaysOn模式下,所有的進程默認開啟DEP。惡意程序可能調用某個系統函數,將Shellcode所在的內存位置設置為可執行狀態來避
開DEP對系統進行滲透。此外,惡意程序還會采取非法利用某個API函數來申請一段具有可執行屬性的內存區域,將Shellcode代碼復制到該區域來避開DEP控制。為降低攻擊難度,惡意程序會在進程的內存空間中尋找一段具有可讀可寫可執行的內存區域,將Shellcode代碼復制進來,對程序流程進行劫持,來非法執行Shellcode代碼。
此外,惡意程序的伎倆還包括非法利用.Net文件,將Shellceode代碼存放到.NET文件中的具有可執行屬性的段中,當這些段被映射到內存后,自然具有了一定的可執行特性,惡意程序轉入該區域后,就可以執行Shellcode代碼了。和.NET文件類似,Jave applet文件也會被加載到瀏覽器內存空間,這些Jave applet空間所在的內存空間也具有了可執行屬性,黑客只需將Shellcode代碼放到Jave applet文件中,就可以避開DEP的管控。