簡體   English   中英

一個進程可以覆蓋另一個進程的內存嗎?

[英]Can one process overwrite the memory of another process?

我的項目由3個流程組成。 進程1是進程2和3的“服務器”,並實現共享內存。 進程2隨應用程序錯誤隨機崩潰,試圖訪問它自己的內存,已經以某種方式損壞。

錯誤是:內存位置某些地址的指令無效,有些地址不好。

我將在哪里開始查看以及在過程1中我將查找哪些類型的內容,以查看它是否覆蓋了進程2的內存?

謝謝。

無意中覆蓋了另一個進程的內存(沒有它的合作)? 不*,因為你必須“意外”正確地做很多事情。 (您必須“意外”打開進程的句柄,並“意外”調用WriteProcessMemory 。)

故意地? 是的,使用WriteProcessMemory函數。

*如果您正在共享內存,則出現錯誤的可能性會急劇上升。

如果進程主動嘗試,則進程只能覆蓋另一個進程的內存。 調試就是一個例子,共享內存是另一個例子。 意外寫入另一個進程的代碼或數據區域是不太可能的。

所以問題是,最有可能的是,進程2的錯誤。我的意思是,進程2甚至不共享其內存,對吧? 因此,進程1不可能覆蓋它。

除非您作為內核的一部分運行,否則操作系統將阻止進程覆蓋其他進程的內存。 使用像valgrind這樣的內存調試器來跟蹤任何內存訪問錯誤的原因。

編輯:你還可以包括使用操作系統調用來訪問另一個進程的內存的可能性,但正如大家所說,你很可能沒有這樣做。 在共享內存中傳遞指針是最可能的錯誤,但我仍然建議使用像valgrind這樣的工具。

共享內存中的數據結構是否包含任何絕對指針? 這不僅是一個壞主意,因為絕對指針在其他進程中沒有意義,但是一個進程可以說服其他進程通過其內存進行瘋狂編寫。

通常,內存管理單元可以防止任何進程直接覆蓋/破壞其他進程的內存。 共享內存(包括文件映射)和WriteProcessMemory函數是一般規則的例外。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM