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函数即可。