大家信不信一句Console.WriteLine就能讓你的控制檯程序失去響應

很久沒更新博客了,今天是扒衣見君節,可貴閒下來就來講說一個最近有趣的發現吧.函數


首先廢話很少說,直接上代碼吧測試

 1     class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             var bytes = new byte[4096];
 6             for (int i = 0; i < bytes.Length; i++)
 7             {
 8                 bytes[i] = 7;
 9             }
10 
11             Console.WriteLine(Encoding.ASCII.GetString(bytes));
12             string line = Console.ReadLine();//你已經死了 這部分是沒有機會跑到了............
13             while (line != "ok")
14             {
15                 Console.WriteLine(line);
16                 line = Console.ReadLine();
17             }
18         }
19     }

有興趣的童鞋能夠建個控制檯程序跑一下,看看會不會程序失去響應.看回復中的信息,貌似WIN8.1和WIN10都沒這個問題.我這邊是在WIN7SP1下測試會失去響應的.若是還有用老掉牙XP的能夠測試一下結果發上來看看.spa


爲何會掛掉呢?code

關鍵就在於這個ASCII代碼7,請看下圖的ASCII碼錶.blog


ASCII的7表明BELL,也就是讓主板上的蜂鳴器叫一聲,就和你電腦剛剛開機時候的滴一聲同樣.因此輸出ASCII的7就會讓主板蜂鳴器叫一聲,不過如今都是WINDOWS接管了,不是當年DOS年代了,蜂鳴器這部分由beep.sys這個驅動文件接管了,WIN7下的beep.sys會從聲卡發聲,XP下的beep.sys仍是老樣子走主板蜂鳴器的.題外話,當初機器狗病毒也會修改這個beep.sys,畢竟權限是ring0的,拿最高權限和殺毒軟件幹才是硬道理……
因此咱們用Console.WriteLine輸出ASCII代碼7的時候,等因而調用了系統函數去發聲,而不單單是在控制檯上打印文本.當咱們輸出大量的ASCII代碼7的時候,就會不斷的去調用這個系統函數,你會發現進程中有個負責DComLaunch的svchost進程基本上進入死循環狀態,而你的控制檯程序,在系統函數調用結束以前是不會再有響應了……進程


 

這玩意能幹什麼呢?
說了這麼多,那麼這個問題有什麼利用價值呢?其實利用價值仍是挺大的,不少作服務類程序的人很喜歡直接上手開一個控制檯程序,還喜歡把異常信息之類的打印在控制檯上,若是你直接顯示了用戶的輸入,那麼我只要發一堆ASCII代碼7過來,你的服務基本上就掛了……
雖然我只是在C#裏面作了測試,可是不表示其餘的語言就沒有影響了,畢竟都是作成WINDOWS控制檯程序的,有對應其餘語言環境的能夠試試看.博客

相關文章
相關標籤/搜索