Ring0 下快速关机和重启

心血来潮,把“一秒关机+快速重启”程序逆向了一下。在网上流传了一种方法来达到一秒关机,打开任务管理器,按住 Ctrl 键不放,然后点击菜单栏上的“关机”。

从逆向“一秒关机.exe”来看,程序是调用 NtShutdownSystem 函数,NtShutdownSystem 函数是微软未公开的 Native API 函数之一,它不通知系统服务和程序,直接强制关闭系统。NtShutdownSystem 函数的原型如下:

NTSYSAPI
NTSTATUS
NTAPI
NtShutdownSystem(SHUTDOWN_ACTION);

再来看看 SHUTDOWNACTION 的定义结构,如下:

typedef   enum   _SHUTDOWN_ACTION   {
ShutdownNoReboot,         //关机不重启
ShutdownReboot,             //关机并重启
ShutdownPowerOff          //关机并关闭电源
}SHUTDOWN_ACTION;

知道函数结构后,实现起来就非常容易了,完整的代码如下:

//by:乱雪
//2009.8.30
#include <ntddk.h>
//函数原型
NTSYSAPI
NTSTATUS
NTAPI
NtShutdownSystem(SHUTDOWN_ACTION);
//SHUTDOWN_ACTION的结构
typedef   enum   _SHUTDOWN_ACTION   {
ShutdownNoReboot,         //关机但不重启
ShutdownReboot,             //关机并重启
ShutdownPowerOff          //关机并关闭电源
}SHUTDOWN_ACTION;
NTSTATUS DriverEntry(IN PDRIVER_OBJECT theDriverObject,
                     IN PUNICODE_STRING theResgistryPath)
{
    NtShutdownSystem(ShutdownNoReboot); //调用 NtShutdownSystem,关机;快速重启直接用 ShutdownReboot
    return STATUS_SUCCESS;
}

然后用 Windows XP x86 Checked Build Environment 编译成 .sys 驱动文件,扔到虚拟机上,用 INSTDRV.EXE 一类的加载驱动的工具加载并且启动,马上系统就在瞬间关闭了。

其实在 Ring3 级下实现也非常简单,首先获得进程权限,然后导入 NTDLL.DLL,最后调用 NtShutdownSystem 函数即可。