如何防止自定义关机EXE被终止,程序关闭时触发Windows系统崩溃
实现方案
风险警告:以下操作会严重破坏系统稳定性,极易造成未保存数据丢失、系统永久损坏,仅可在专用测试设备上验证,绝对禁止在日常使用的个人设备中部署。
一、实现程序防停止、防崩溃
- 注册为Windows系统服务:使用
pywin32库的win32serviceutil模块将程序注册为系统服务,运行身份设为LocalSystem,该级别的服务进程无法被普通管理员从任务管理器直接终止。 - 双进程互保:编写两个独立进程,互相周期性检测对方存活状态,任意一个进程被终止,另一个进程立刻重新拉起对应程序,两个进程均注册为系统服务,避免被批量结束。
- 全量异常捕获:在代码最外层添加全局异常捕获逻辑,所有未处理异常仅打日志不抛出,避免代码BUG导致进程意外退出。
- 反调试检测:调用Windows原生API
IsDebuggerPresent实时检测是否有调试器附加,一旦检测到调试行为立刻主动重启进程,避免被逆向分析终止。 - 权限预申请:进程启动时主动调用
AdjustTokenPrivileges接口获取SeDebugPrivilege、SeShutdownPrivilege等高阶系统权限,避免因权限不足被系统强制终止。
二、实现程序被关闭时触发系统崩溃
你可以选择以下任意一种方式实现进程退出即系统崩溃,两种方式都需要管理员权限才能正常执行:
- 原生API调用方式:先调用
ntdll.dll的RtlAdjustPrivilege接口获取SeShutdownPrivilege权限,再调用NtRaiseHardError接口,传入参数0xC0000022、0、None、None、6,即可直接触发Windows蓝屏崩溃。
Python示例代码片段:import ctypes from ctypes import wintypes ntdll = ctypes.WinDLL('ntdll') RtlAdjustPrivilege = ntdll.RtlAdjustPrivilege RtlAdjustPrivilege.argtypes = [wintypes.ULONG, wintypes.BOOLEAN, wintypes.BOOLEAN, ctypes.POINTER(wintypes.BOOLEAN)] RtlAdjustPrivilege.restype = wintypes.LONG NtRaiseHardError = ntdll.NtRaiseHardError NtRaiseHardError.argtypes = [wintypes.LONG, wintypes.ULONG, wintypes.ULONG, ctypes.c_void_p, wintypes.ULONG, ctypes.POINTER(wintypes.ULONG)] NtRaiseHardError.restype = wintypes.LONG # 获取关机权限 enabled = wintypes.BOOLEAN() RtlAdjustPrivilege(19, True, False, ctypes.byref(enabled)) # 触发蓝屏 response = wintypes.ULONG() NtRaiseHardError(0xC0000022, 0, 0, None, 6, ctypes.byref(response)) - 命令行调用方式:直接执行
taskkill /f /im svchost.exe /t命令强制终止系统核心的svchost进程,Windows会在1-3秒内自动触发蓝屏崩溃,Python中可以直接用subprocess.run()执行该命令。
两种触发方式都需要注册到Python的atexit全局退出钩子中,确保无论是正常退出、异常退出还是被强制终止,都会先执行崩溃逻辑。
注意事项
- 若后续需要卸载该程序,必须先进入Windows安全模式,删除对应服务和EXE文件,正常模式下终止程序会直接触发系统崩溃,无法完成卸载操作。
- 所有逻辑都需要管理员权限运行,你已经配置了管理员快捷方式,注册服务时选择本地系统账户即可满足权限要求。
内容的提问来源于stack exchange,提问作者BruceWawe
相关产品推荐
相关产品推荐

