2015-05-04 162 views
2

據我所知,VirtualProtect函數更改內存頁面上的權限毫無疑問。當任何正在運行的進程能夠使用它時,這當然沒有直接的目的?當包括惡意軟件在內的任何進程都可以使用VirtualProtect時,VirtualProtect的意義何在?

例如,有人可以輕易地編寫一個使用VirtualProtectEx函數的惡意軟件,以繞開說明並造成嚴重破壞。另一方面,用戶可能有允許進程修改內存的正當理由(即遊戲作弊)。

+1

這假設攻擊者可以在他們正在攻擊的系統上運行代碼,VirtualProtect試圖停止。 –

+1

當沒有惡意軟件運行時,Windows受到保護,並且沒有允許惡意軟件運行的漏洞。如果我們從「惡意軟件已經在運行」的前提開始,那麼我們得出結論「惡意軟件可能會造成嚴重破壞」是無可置疑的。但前提是錯誤的。 – Dialecticus

回答

4

有人可以很容易地寫出那件惡意軟件,但他們如何獲得執行目標?

VirtualProtect允許我選擇性地使存儲器可執行。這意味着我可以將存儲不可信數據的緩衝區標記爲不可執行,並且存在允許不可信用戶修改我的函數的返回地址的安全漏洞,無法跳轉到該緩衝區並在那裏執行代碼,從而停止攻擊者自己執行VirtualProtect。

它也允許我使內存只讀。這意味着我可以將非信任緩衝區旁邊的區域標記爲只讀,並且緩衝區溢出不能覆蓋更多基本數據。因此,在我的應用程序中沒有遠程代碼,攻擊者沒有VirtualProtect。

一旦攻擊者以某種方式訪問​​系統,他可以使用VirtualProtect刪除相同安全級別的進程保護,但此時您已經丟失了。

+0

謝謝,非常有趣。我不明白爲什麼其他人認爲我的問題被嚴重問到。好吧! –

+0

@Mhmk我會認爲這是因爲一旦惡意軟件在系統上,由於安全性已經被破壞,所以關於安全性的推理是毫無意義的。 – Mgetz

+0

@Mgetz這個問題也適用於其他領域,比如注入遊戲祕籍。用戶可能想要修改遊戲的內存,但遊戲本身不希望作弊。我試圖提出的一點是,在類似情況下,安全性可能不是用戶的問題。 –

1

主要是爲了防止攻擊和允許JIT等。如果沒有VirtualProtect,則無法將頁面標記爲不可寫和可執行,反之亦然。這就是說,如果系統已經有惡意軟件,那麼問題可以這麼說already past the airtight door。在理想情況下,一個進程也可以使用ACL來防止另一個進程檢查其內存或更改其內存保護。這是安全播放的工作原理。

如果系統中已經存在惡意軟件,那麼您所做的任何操作都不會起作用,因爲惡意軟件可能處於內核模式。在這種情況下,它可以做任何喜歡的事情。

4

我已使用VirtualProtect來幫助追查不正確的內存訪問。

我分配了一頁內存,初始化它,然後標記爲Unreadable/Unwriteable,然後我們的超級單片程序中的另一個組件不正確地訪問了我的指針。只要該組件試圖寫入一個不可寫的頁面,我們就看到了訪問違規,並且我們知道違規方是誰。

(在此之前,我們只知道內存已被覆蓋......但我們不知道哪個組件正在執行)。