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