好久没更新博客了,今天是扒衣见君节,难得闲下来就来说说一个最近有趣的发现吧.


首先废话不多说,直接上代码吧

     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就能让你的控制台程序失去响应的更多相关文章

  1. Console.WriteLine 不会输出到unity控制台

    1,Console.WriteLine() 是输出到控制台程序(console application)的命令 2,Unity中控制台是一个独立的程序,要想输出到Unity控制台需要使用Debug.L ...

  2. 第一个输出程序 Console.WriteLine

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  3. asp.net页面中的Console.WriteLine结果如何查看

    其实用Console.WriteLine("xxxxx"),在asp.net Web程序,在输出窗口是不会输出结果的,应该用Debug.WriteLine("xxxxx& ...

  4. Redirecting Console.WriteLine() to Textbox

    I'm building this application in Visual Studio 2010 using C#. Basically there are 2 files, form1.cs ...

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

    镇场诗: 大梦谁觉,水月中建博客.百千磨难,才知世事无常. 今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ 为什么 ...

  6. C# Winform里面用Console.WriteLine输出到哪了

    C# Winform里面用Console.WriteLine输出也不会报错 显示在 VS IDE 的视图→输出窗口,且只在 Debug 环境下此语句执行. 如果是 Release 环境,在 Win32 ...

  7. Console.WriteLine()与MessageBox.Show()的区别

    Console.WriteLine(); 将当前行终止符写入标准输出流 在学习控制台应用程序时经常用,输出到控制台 MessageBox.Show();  显示可包含文本.按钮和符号(通知并指示用户) ...

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

    格式项都采用如下形式: {index[,alignment][:formatString]} 其中"index"指索引占位符,这个肯定都知道: ",alignment&q ...

  9. 看到Console.WriteLine($"string")写法,一时间不理解$的用途

    参了网上资料,原来它是C# 6.0的语法糖. C# 6.0 新加上的功能:   Null-Conditional Operator 大概就是,简洁代码量,缩短一些关于为null的判断~ 旧写法: pu ...

随机推荐

  1. Hibernate —— HQL、QBC检索方式

    一.HQL 检索方式 以双向的一对多来测试 HQL 检索方式.以 Department 和 Employee 为例. 建表语句: CREATE TABLE department ( dept_id ) ...

  2. 50个新的汉化Demo!纯前端 Wijmo 放大招

    Wijmo 是为企业应用程序开发而推出的一系列包含 HTML5 和 JavaScript 的开发控件,包含 Wijmo 5 . Wijmo 3 及面向企业级应用的控件金融图表.FlexSheet 和 ...

  3. hibernate中表关系为多对多时,如何只删除中间表数据

    先说问题:我遇到的问题是,在用户和用户组对象关系中他们是多对多关系.所以中间是成在一张中间表的.经理要求当逻辑删除对象数据时,必须删除中间表中的数据. hibernate是面向对象操作sql语句的,如 ...

  4. 容器--TreeMap

    一.概述 在Map的实现中,除了我们最常见的KEY值无序的HashMap之外,还有KEY有序的Map,比较常用的有两类,一类是按KEY值的大小有序的Map,这方面的代表是TreeMap,另外一种就保持 ...

  5. POJ 2115 C Looooops扩展欧几里得

    题意不难理解,看了后就能得出下列式子: (A+C*x-B)mod(2^k)=0 即(C*x)mod(2^k)=(B-A)mod(2^k) 利用模线性方程(线性同余方程)即可求解 模板直达车 #incl ...

  6. Singleton

    1.//懒汉模式 //天生线程不安全,但是效率高 public class Singleton { private static Singleton singleton; private Single ...

  7. [翻译]用 Puppet 搭建易管理的服务器基础架构(3)

    我通过伯乐在线翻译了一个Puppet简明教程,一共分为四部分,这是第三部分. 本文由 伯乐在线 - Wing 翻译,黄利民 校稿.未经许可,禁止转载!英文出处:Manuel Kiessling.欢迎加 ...

  8. karma与webpack结合

    一.必备插件 1.babel:es6的语法支持 2.karma:测试框架 3.jasmine:断言框架 4.webpack:打包工具 5.karma-webpack:karma调用webpack打包接 ...

  9. “.”(十六进制值 0x00)是无效的字符解决方案

    自从我们的项目数据层从读取数据库改为读取接口服务后,经常会出现一些类似于的错误.我们的数据结构如下所示 <type><![CDATA[gp]]></type> &l ...

  10. ASP.NET MVC 简介

    1. ASP.NET MVC 是什么? ASP.NET MVC是微软官方提供的以MVC模式为基础的ASP.NET Web应用程序(Web Application)框架,它由Castle的MonoRai ...