2017-06-12 31 views
1

我明白,在過去的C語言中,你可能會搞砸指針和內存分配,並可能意外地損壞其他正在運行的程序或操作系統本身以外的程序,並導致系統崩潰。這需要重新啓動才能繼續進行程序開發。通過操作系統安全性,使用C編程變得更容易並執行禁用?

系統安全性改進是否阻止了這種情況的發生?

在過去的MSDOS和Windows 3.1/95/98/Me和MacOS之前的版本10(通常在搶先式多任務成爲所有事情的常態之前)系統安全性一般不存在。程序可以隨時隨地在任何地方寫數據。

但是現在,隨着更現代化的系統設計和流程安全性,程序通常被系統安全阻止,無意或有意破壞其他任何東西。

現代處理器的執行禁用功能也可能有助於防止意外跳到隨機存儲器位置並在處理器機器代碼中運行任何內存位置。

那麼,如何用C語言編寫現代程序而不嘗試破解操作系統安全性呢?

你還能設法意外崩潰整個系統嗎?我認爲這是不可能的。內核或其他系統安全步驟進入並暫停動作。

你可以破壞你的登錄環境,並且必須註銷並重新登錄嗎?我認爲這也是被阻止的,因爲進程通常不應該訪問其他進程內存空間,即使在你自己的登錄安全環境中也是如此。

一般來說,現在使用C編程似乎比以前更容易,因爲現在這些系統保護功能到處都是使用,以防止您在自己和系統中拍攝腳部。

+1

那麼,普通用戶程序受系統保護 - 但是如果你寫e。 G。設備驅動程序,您很快就會回到以前的狀態 - 試想一下,在中斷服務程序中解引用空指針... – Aconcagua

回答

4

在你意外做的事情上,它肯定比MS-DOS的日子更容易。我記得一個破壞內存磁盤緩存的bug。在那之後我很幸運有什麼可以留下。

現在,除非你正在編寫運行在內核中的C代碼,否則這是不可能的。除非您正在積極嘗試利用缺陷,否則也不會崩潰操作系統。

其他各種各樣的東西,比如NX位和其他一些嘗試圍繞C程序建立一個安全圍欄,它們確實會讓您的程序崩潰得更快,並且更靠近發生錯誤的地方。但是他們並沒有接近通過簡單分隔地址空間獲得的勝利水平。他們的目的是積極嘗試開發更難的東西,而且他們在這方面比在發現事故或錯誤時要好得多。

從整體上破壞與操作系統截然不同的登錄環境也通常在統計上不太可能。雖然如果你的程序正在做複雜的文件操作,你可能會有一個錯誤,弄亂了用戶的文件。

而且,實際上沒有使操作系統崩潰,您可能會意外導致資源耗盡。雖然這通常可以從中恢復,但它在進行時非常不舒服。您的系統變得越來越慢,甚至可能無法啓動進程。 Linux對此有一些保護。如果你把你的開發環境放在一個cgroup中,你可以完全防止它。

當然,任何積極的漏洞都可以做,你可以錯誤地做。但是,我正在談論偶然做這些事情的統計可能性。

也許最大的改進,因爲獨立的地址空間是一樣Valgrind工具,監視您的程序上即時的出界外acesses或訪問釋放的內存等。

MS-DOS和早期的Windows作爲具有高質量C開發環境的通用計算機使用並且也具有這種混雜的內存,這些都很奇怪。 Windows需要很長時間才能實現,而且平臺上的編程實踐仍然有點奇怪。

3

簡答:是的。

在使用虛擬內存並保持數據和代碼分離的計算機上,寫入災難性錯誤要難得多,因爲您會得到硬件異常(將操作系統轉換爲更柔和的東西)。所以你不能有跑掉的錯誤來覆蓋你自己的可執行代碼,或者有失控的代碼開始執行數據段中的隨機「操作碼」。該錯誤仍然會在那裏,並且需要修復。但是這將會變得不那麼神祕,並且幾乎沒有災難性。

沒有這些安全功能的計算機需要程序員更多的關心和測試。

崩潰整個系統仍然是可能的,但主要是這是因爲操作系統和API的錯誤。 Windows中偶爾出現的「死亡藍屏」仍然是一件事情。通過一些努力,你也可以通過使用100%的CPU或分配過量的堆內存來延遲整個計算機,將其變成無用的。