CustomBSOD 文档预览
← 返回主页

CustomBSOD_v2

一个 Windows 内核驱动与配套的用户态应用程序,让你完全自定义蓝屏(BSOD)的显示内容——修改颜色、替换文本字符串,并为 Windows 7 到 Windows 11 定制崩溃界面的外观。

⚠本程序可能被 PatchGuard 检测到!

本程序使用 Inline Hook 技术,会修改 ntoskrnl 的 .text 段。 PatchGuard 会定期扫描 ntoskrnl 的 .text 段。 一旦检测到任何异常,它就会触发一次蓝屏,即使你并没有手动触发蓝屏。

架构总览

功能特性

功能描述
自定义停止代码文本用你自己的消息替换默认的 bugcheck 停止代码字符串
背景颜色将蓝屏背景改为任意颜色
前景 / 文字颜色为崩溃界面设置自定义的文字颜色
修改蓝屏文字修改蓝屏上显示的文字
修改二维码修改二维码,使其显示你自己的图片
显示字符串在屏幕上显示你自己的字符串
显示图像在屏幕上显示你自己的图片
彩虹蓝屏通过 Hook 或回调函数实现不断变色的蓝屏
VGA 模式支持支持 VGA 文本模式下的 80x25 与 80x50 模式,并支持闪烁与彩虹模式(仅 Windows 7)
手动触发 BugCheck为测试目的触发一次受控的系统崩溃

支持的 Windows 版本

系统版本构建号范围状态
Windows 76.1支持
Windows 8 / 8.16.2 – 6.3支持
Windows 1019045+支持
Windows 1126100+支持

工作原理

1. 函数定位(内核)

驱动通过字节特征码扫描,在运行时定位未公开的 Windows 内核内部函数。这样可以避免使用硬编码偏移——硬编码偏移在不同 Windows 版本上会失效。

定位到的关键函数:

  • KeBugCheckEx —— 导出函数
  • KeBugCheck2 —— 由 KeBugCheckEx 内部调用的函数
  • KiDisplayBlueScreen —— 用于渲染蓝屏的函数
  • BgpFwDisplayBugCheckScreen —— 由 KiDisplayBlueScreen 内部调用的函数,用于真正渲染蓝屏
  • BcpDisplayCriticalString —— 该函数用于渲染文字,例如 ":("
  • BcpDisplayCriticalStringCentered —— 与 BcpDisplayCriticalString 差不多,但它在 Windows 11 25H2 版本之后才出现
  • BgpClearScreen —— 该函数渲染蓝屏的背景
  • BgpTxtDisplayCharacter —— 该函数用于在蓝屏上渲染单个字符
  • BgpGxDrawRectangle —— 该函数用于写入 显存,最终会调用 DpiSystemDisplayWrite
  • KiSendFreeze —— 该函数用于冻结当前未发生蓝屏的其他 CPU
  • KiSetDebuggerOwner —— 该函数将当前处理器设置为调试器所有者
  • DpiSystemDisplayWrite —— (未使用) DpiSystemDisplayWrite 是更底层的函数,用于直接写入显存。它位于 dxgkrnl.sys

函数调用图:

2. Inline Hook

驱动在已定位的函数上安装基于跳板的 Inline Hook:

原始函数
被 Hook 后的函数
函数开头字节
JMP 跳板
函数主体……
跳板
后续代码
原始函数开头
JMP 跳回主体

已安装的 Hook:

  • 停止代码文本 —— 将 KeGetBugMessageText 调用打补丁,替换为用户定义的文本
  • 背景颜色 —— 将 BgpClearScreen 调用打补丁,使用自定义背景颜色
  • 前景颜色 —— 将 BgpTxtDisplayCharacter 调用打补丁,使用自定义前景 / 背景颜色(文字)
  • 修改文字 —— 将 BcpDisplayCriticalString 或 BcpDisplayCriticalStringCentered 调用打补丁,使用自定义文本
  • 二维码 —— 将 BgpFwDisplayBugCheckScreen 调用打补丁,使用自定义图片

3. 用户态 GUI

CustomBSOD_v2 应用程序提供基于 WinForms 的界面。

启动流程:

  1. 检查是否启用了 testsigning 模式(加载未签名驱动的必要条件)
  2. 将内嵌的驱动二进制提取到磁盘
  3. 创建驱动服务注册表项并加载驱动
  4. 显示主窗口

玩得开心!