你的位置: iPc 首页 > 全部文章 > Windows, 应用技巧 > 阅读文章
Office    苹果中国    微软中国    VPS

蛋疼技术文:给电脑蓝屏换一种颜色!神马绿屏红屏的最喜欢了……

26
十二月

看到不是蓝色的蓝屏还是挺让人震惊的,就连我也一样。就目前TechEd听众的反应来看,我估计你们一会就要去弄出各种颜色的蓝屏向你的朋友炫耀去了。我最早在几年前看到Dave Solomon和Dan Pearson在一次分析崩溃转储的会议上这么搞过,这次我在Case of the Unexplained演讲结束的时候还让观众选蓝屏的颜色。不过注意了,我接下来要说的改颜色的方法是手动的,只在当次有效,所以很适合演示目的。不要错过我在文章结尾为大家准备的节日蓝屏图。

蓝屏

准备工作

我们要修改内核代码,首先就是要打开修改内存中的内核代码的功能。Windows在小于2GB内存的系统上用4KB的内存页来存储内核代码,这样比较方便设置合适的页保护属性。比如内核数据页应该允许读取和写入访问,而内核代码页就只应该允许读取和执行访问。为了提高虚拟地址翻译的速 度,Windows在资源充足的系统上使用大内存页(4 MB)。这就是说如果有代码和数据同时存储在一个内存页里,这个内存页就必须允许读取、写入和执行访问。所以为了确保你可以编辑内存页,你可以建议 Windows使用大内存页。如果你的系统是Windows XP或者Server 2003,并且内存小于256 MB,或者是Windows Vista或更高版本且内存小于2 GB,在HKLM\System\CurrentControlSet\Control\Session Manager\Memory Management下建立一个名为LargePageMinimum,类型为REG_DWORD,数据为1的注册表值:

clip_image001

为了让你不必在Windows自动重启前手忙脚乱地冲到朋友面前炫耀你的成果,你可以关闭自动重启。在Windows XP和Server 2003系统中,右键单击“我的电脑”,选择“高级”选项卡,单击“启动和故障恢复”中的“设置”按钮。在Windows Vista及更高版本中,右键单击开始菜单中的“计算机”选择“属性”,单击“高级系统设置”,选择“高级”选项卡,单击“启动和故障恢复”中的“设置” 按钮。最后,取消选择“自动重新启动”复选框:

clip_image002

如果你在用64位 Windows Vista或更高版本,你需要用调试模式启动系统,这样才可以用内核调试器的“本地调试”模式。你可以在开机的时候按F8然后选择“调试模式启动”或者在“系统配置”工具中选择“调试”复选框:

clip_image003

下面重启并以管理员身份运行调试器(如果开了UAC,以管理员身份运行)。在File菜单中打开“Symbol Search Path”对话框,输入这个字符串:srv*c:\symbols*http://msdl.microsoft.com/download /symbols(c:\symbols 可以是任意本地目录,用于给调试器存放缓存的符号),这样就可以将调试器符号路径指向微软符号服务器。下面在File菜单中打开“Kernel Debugging”对话框,单击“Local”选项卡,按“确定”按钮:

clip_image004

接下来的步骤会因你的系统版本而有所不同。

32位Windows XP和Windows Server 2003

这些系统上显示蓝屏的函数是KeBugCheck2。你要找的是这个函数把颜色值传递给填充屏幕背景的函数InbvSolidColorFill的地方。输入“u kebugcheck2”命令来显示函数开头,然后继续输入“u”命令显示更多的内存页,直到你看到对InbvSolidColorFill的调用为止。 (在输入一次“u”之后,你只要一直按回车就可以重复这个命令了)。你大概要显示30-40个内存页才能看到这个调用:

clip_image005

在这个调用之前,你会看到一个带有参数4的指令(“push 4”),如上图。选择地址行并按下Ctrl+C以复制这个指令的地址。接下来在调试器命令窗口中输入“eb ”,然后按Ctrl+V粘贴这个地址,然后输入“+1”,然后按回车。调试器会进入内存编辑模式,并从那个颜色代码的地址开始编辑。现在你可以选颜色了,1是红色,2是绿色,你还可以试试别的颜色。只要输入数字然后按两次回车就可以保存修改并退出编辑模式。退出后你的屏幕应该是这个样子:

clip_image006

64位Windows以及32位Windows Vista及更高版本

在这些版本的Windows里,画蓝屏的函数叫KiDisplayBlueScreen。输入“u kidisplaybluescreen”然后一直输入“u”命令显示函数的内存页,直到你找到对InbvSolidColorFill函数的调用为止。 在32位Windows上,你可以按上一节给出的方法来编辑颜色值。在64位系统上,InvbSolidColorFill前的那个指令是传递颜色的指 令,所以复制它的地址并输入“eb <地址>+4”进行编辑。调试器会进入内存编辑模式,然后你就可以修改它的值(比如1是红色,2是绿色):

clip_image007

查看结果

你现在可以准备让系统蓝屏了。如果你用的是64位系统,那可能已经蓝屏了。这是因为Kernel Patch Protection会发现这些修改,然后使系统蓝屏。这样做可以避免一些第三方软件厂商考虑用修改内核代码的方式实现某些功能。不过,系统最多可能会延迟7分钟才蓝屏。要想随时蓝屏,可以运行Notmyfault工具(你可以从《Windows Internals》的相关页面中下载到),然后按下“Do Bug”按钮(为避免数据丢失,请确保你保存了所有文件并关闭了其它程序):

clip_image008

然后你就会得到一个自选颜色的蓝屏了,比如我选的红屏:

蓝屏

节日蓝屏

为了增添节日气氛,我还要生成一个节日主题的蓝屏:不仅要修改背景色,还要修改文字颜色。在64位Windows Vista及更高版本下,找到紧跟InvbSolidColorFill函数调用的InvbSetTextColor,并找到将文字颜色传给该函数的指令 “move ecx, 0Fh”:

clip_image010

0Fh参数表示白色,但你可以用同样的方法改成别的颜色。使用“eb”命令,传入该指令的地址加1。在下图中我设置成了红色(也就是1):

clip_image011

这就是我弄出的很有喜庆气氛的蓝屏

蓝屏

节日快乐!
FlowerCode 译自 Mark’s Blog

关于本文