Windows应用层蓝屏技术

蓝屏一般来说是操作系统内核或驱动程序发生错误时出现的保护电脑的现象,在本博客的按键触发电脑蓝屏一文中曾经介绍过如何通过键盘按键手动触发蓝屏,本文将延续这一话题,介绍在应用层通过一些非常规的API调用来达到使电脑蓝屏的目的。

1. 通过NtRaiseHardError引发蓝屏

HARDERROR_RESPONSE response = ResponseYes; 
BOOLEAN bEnable;
if(0 == RtlAdjustPrivilege(SE_SHUTDOWN_PRIVILEGE,TRUE,FALSE,&bEnable))
{
    NtRaiseHardError(0xC0000217, 0, 0, 0, 6, &response); 
}

2. 杀掉系统进程引发蓝屏

BOOLEAN bEnable;
if(RtlAdjustPrivilege(SE_DEBUG_PRIVILEGE,TRUE,FALSE,&bEnable) == 0) 
{
    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,CsrGetProcessId());// CsrGetProcessId作用为获得csrss.exe进程的PID
    TerminateProcess(hProcess, 0);
}

3. 将自己的进程设置为系统进程引发蓝屏

BOOLEAN bEnable;
if(RtlAdjustPrivilege(SE_DEBUG_PRIVILEGE,TRUE,FALSE,&bEnable) == 0)
{
    ULONG uTmp = 1;
    NtSetInformationProcess(GetCurrentProcess(),ProcessBreakOnTermination,&uTmp,sizeof(ULONG)); // 把自身进程设置为系统进程结束则蓝屏
    ExitProcess(0);
}

这里也可以调用RtlSetProcessIsCritical引发蓝屏,它是NtSetInformationProcess封装出来的一个API,调用方式:RtlSetProcessIsCritical(TRUE,NULL,FALSE)

4. 将自己的线程设置为系统线程引发蓝屏

BOOLEAN bEnable;
if(RtlAdjustPrivilege(SE_DEBUG_PRIVILEGE,TRUE,FALSE,&bEnable) == 0)
{
    ULONG uTmp = 1;
    NtSetInformationProcess(GetCurrentThread(),ThreadBreakOnTermination,&uTmp,sizeof(ULONG));  // 把自身线程设置为系统线程结束则蓝屏
    ExitProcess(0);
}

这里也可以调用RtlSetThreadIsCritical引发蓝屏,它是NtSetInformationProcess封装出来的一个API,调用方式:RtlSetThreadIsCritical(TRUE,NULL,FALSE)

最终实现代码:点击下载