你们信不信一句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     }

有兴趣的童鞋可以建个控制台程序跑一下,看看会不会程序失去响应.我这边是在WIN7SP1下测试的.如果还有用老掉牙XP的可以测试一下结果发上来看看.



为什么会挂掉呢?

关键就在于这个ASCII代码7,请看下图的ASCII码表.


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控制台程序的,有对应其他语言环境的可以试试看.

时间: 2024-10-14 06:52:44

你们信不信一句Console.WriteLine就能让你的控制台程序失去响应的相关文章

第一个输出程序 Console.WriteLine

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks; namespace _01个程序{ class Program { static void Main(string[] args) { Console.WriteLine("************************"); // WriteLine输出字符并将

Console.WriteLine的小用法

我在一开始使用Console.WriteLine的时候,经常采用的是拼接字符串的形式来构建输出. 但是Console.WriteLine具有扩展的方法来对内容进行输出,类似于我们常用的String.Format. static void Main(string[] args) { //generic list List<int> ListGeneric = new List<int> { 5, 9, 1, 4 }; //timer for generic list sort Sto

C#中Console.WriteLine()函数输出格式详解

格式项都采用如下形式: {index[,alignment][:formatString]} 其中"index"指索引占位符,这个肯定都知道: ",alignment"按字面意思显然是对齐方式,以","为标记: ":formatString"就是对输出格式的限定,以":"为标记. alignment:可选,是一个带符号的整数,指示首选的格式化字段宽度.如果“对齐”值小于格式化字符串的长度,“对齐”会被忽略,

C#总结(1)-从抚摸“Console.WriteLine”开始的逐渐深入

看笔记上的时间是在2016.2.5号开始学习C#语言的,直至今天不到一个月的时间,跟培养计划上比,足足慢了一 半,也是够”呵呵“的了,乐观点,要把基础打好: 从这篇博客开始总结这段时间C#的学习,时间问题,只能每天一点,断断续续的进行了. 初识: 此阶段可以说是零基础认识期间,知道了C#仅仅是一种编程语言,需要".Net\Dotnet"这样的一种平台,一种技术,此外还得需要一个合适的"IDE"比如"Visual Studio 2012"这样的软件

浅析System.Console.WriteLine()

浅析System.Console.WriteLine() Writeline()函数的功能向 StreamWriter 类写入指定字符串和一行字符,共有19个重载,其与Write()函数的主要区别在于它输出字符串后换行,而Write()不换行.现在,通过WriteLine()的通用版本(即WriteLine(string format,object arg0,object arg1,object arg2,object arg3,__arglist))来深入理解其实现细节. 首先,我们来看一下源

浅谈Console.WriteLine();

     今日看<老粱故事汇>,介绍日本已逝巨星高仓健,才初步对此人有所了解.老高一生演绎了许多经典的影幕形象,男主角都收获了真挚的爱情--可现实生活中,真实的老高,却一辈子只经历过一次婚姻,在离婚后终究不能从失败的婚姻中走出,最终孤老一生--所以,看事物,看人,不能光看表面,要有一双发现的眼睛,看到他的本质--      借此机会,讲一个C#中用于输出的最常见不过的语句的一个注意事项-- 谈到Console.WriteLine();我想大多数人会想到占位符,诚然,占位符的使用,对于输出一段字

C#里面Console.Write()和Console.WriteLine()有什么区别?

Console.Write()和Console.WriteLine()都是System.Console提供的方法,两着主要用来将输出流由指定的输出装置(默认为屏幕)显示出来.两着间的差异在Console.WriteLine()方法是将要输出的字符串与换行控制字符一起输出,当次语句执行完毕时,光标会移到目前输出字符串的下一行.至于Console.Write()方法,光标会停在输出字符串的最后一个字符后,不会移动到下一行.比如说Console.WriteLine("a");Console.

WriteLine(ls.ToString());Console.WriteLine(ls);输出结果相同,为什么要加 .ToString()

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace Test05 7 { 8 class Program 9 { 10 static void Main(string[] args) 11 { 12 int shj1 = 45; //声明整型变量shj1,并赋值为45 13 int shj2 = 5; //声明整型变量shj2,并赋值

VS2015使用技巧 为什么我们可以输入cw后按两下tab键出现console.writeline

因为代码段的存在.那么如何查看代码段都有啥呢? 1. 2. 3.存储cw的文件中写了啥? <?xml version="1.0" encoding="utf-8"?> <CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet"> <CodeSnippet Format="1.0.0"> &l