你们信不信一句Console.WriteLine就能让你的控制台程序失去响应
好久没更新博客了,今天是扒衣见君节,难得闲下来就来说说一个最近有趣的发现吧.
首先废话不多说,直接上代码吧
class Program
{
static void Main(string[] args)
{
var bytes = new byte[];
for (int i = ; i < bytes.Length; i++)
{
bytes[i] = ;
} Console.WriteLine(Encoding.ASCII.GetString(bytes));
string line = Console.ReadLine();//你已经死了 这部分是没有机会跑到了............
while (line != "ok")
{
Console.WriteLine(line);
line = Console.ReadLine();
}
}
}
有兴趣的童鞋可以建个控制台程序跑一下,看看会不会程序失去响应.看回复中的信息,貌似WIN8.1和WIN10都没这个问题.我这边是在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控制台程序的,有对应其他语言环境的可以试试看.
你们信不信一句Console.WriteLine就能让你的控制台程序失去响应的更多相关文章
- Console.WriteLine 不会输出到unity控制台
1,Console.WriteLine() 是输出到控制台程序(console application)的命令 2,Unity中控制台是一个独立的程序,要想输出到Unity控制台需要使用Debug.L ...
- 第一个输出程序 Console.WriteLine
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- asp.net页面中的Console.WriteLine结果如何查看
其实用Console.WriteLine("xxxxx"),在asp.net Web程序,在输出窗口是不会输出结果的,应该用Debug.WriteLine("xxxxx& ...
- Redirecting Console.WriteLine() to Textbox
I'm building this application in Visual Studio 2010 using C#. Basically there are 2 files, form1.cs ...
- VS2015使用技巧 为什么我们可以输入cw后按两下tab键出现console.writeline
镇场诗: 大梦谁觉,水月中建博客.百千磨难,才知世事无常. 今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ 为什么 ...
- C# Winform里面用Console.WriteLine输出到哪了
C# Winform里面用Console.WriteLine输出也不会报错 显示在 VS IDE 的视图→输出窗口,且只在 Debug 环境下此语句执行. 如果是 Release 环境,在 Win32 ...
- Console.WriteLine()与MessageBox.Show()的区别
Console.WriteLine(); 将当前行终止符写入标准输出流 在学习控制台应用程序时经常用,输出到控制台 MessageBox.Show(); 显示可包含文本.按钮和符号(通知并指示用户) ...
- C#中Console.WriteLine()函数输出格式详解
格式项都采用如下形式: {index[,alignment][:formatString]} 其中"index"指索引占位符,这个肯定都知道: ",alignment&q ...
- 看到Console.WriteLine($"string")写法,一时间不理解$的用途
参了网上资料,原来它是C# 6.0的语法糖. C# 6.0 新加上的功能: Null-Conditional Operator 大概就是,简洁代码量,缩短一些关于为null的判断~ 旧写法: pu ...
随机推荐
- iOS滤镜实现之LOMO(美图秀秀经典LOMO)
LOMO追求鲜艳色彩,随意.自由的态度,是一种经常使用的滤镜,今天介绍一下iOS 中LOMO滤镜的实现 首先它有3张输入图像 1.我们要处理的图像.即我们要应用LOMO滤镜的图像 2 3 在gpuim ...
- MS SQL Server 数据库分离-SQL语句
前言 今天在在清理数据库,是MS SQL Server,其中用到分离数据库文件.在这过程中,出现了一个小小的问题:误将数据库日志文件删除了,然后数据就打不开了,除了脱机,其他操作都报错. 数据库分离 ...
- 无法为目标平台“Microsoft.Data.Tools.Schema.Sql.Sql120DatabaseSchemaProvider”创建扩展管理器
很久没写博客了,这段时间情绪不那么稳定,还是心态的问题... 就简单写个问题的解决方法吧,其实最近遇到的问题蛮多的,就拿这个解决过后又遇到的来写吧. 正如标题一样:VS2013 无法为目标平台“Mic ...
- jquery移除属性值
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 初学C++ 之 auto关键字(IDE:VS2013)
/*使用auto关键字,需要先赋初值,auto关键字是会根据初值来判断类型*/ auto i = ; auto j = ; cout << "auto i = 5" & ...
- PHP规范PSR2
为了尽可能的提升阅读其他人代码时的效率,下面例举了一系列的通用规则,特别是有关于PHP代码风格的.各个成员项目间的共性组成了这组代码规范.当开发者们在多个项目中合作时,本指南将会成为所有这些项目中共用 ...
- 高性能 TCP & UDP 通信框架 HP-Socket v3.2.3
HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...
- jQuery实现页面内锚点平滑跳转
平时我们做导航滚动到内容都是通过锚点来做,刷的一下就直接跳到内容了,没有一丝的滚动效果,而且 url 链接最后会有“小尾巴”,就像#keleyi,今天我就介绍一款 jquery 做的滚动的特效,既可以 ...
- arcgis地图数据集合
一.全国的ArcGIS地图SHP格式数据,覆盖的图层信息量基本齐全,除了ArcGIS之外,其他GIS软件(superMap和MapGIS.MapInfo等等)也是用之,适合为GIS开发提供数据素材. ...
- 关于举办 2015年 Autodesk 助力云应用项目开发活动通知
各位尊敬的Autodesk 合作伙伴,大家好! 相信您在过去的一年里应该对Autodesk最新的云服务技术有所了解,您是不是曾经闪现过一些很好的想法,却由于不确定是否真实可行,或担心没有技术支持来帮助 ...