返回首页

{S0}简介
RtlSetProcessIsCritical又是一个无证的功能隐藏在Windows内核。它是为数不多的没有一个KERNEL32相当于之一。然而,微软一直没有文件这个功能的一个很好的理由 - 它不应该在任何应用程序用于任何目的。我简直无法想象一个情况下,这个功能实际上,有用。因此:
声明:我不是负责在您的计算机上调用此函数的任何副作用。这可能会导致极端的系统不稳定。为quot;的例子是只提交证明,conceptqu​​ot。背景
RtlSetProcessIsCritical不把你的进程到系统中的关键地位。这意味着,这一进程现在是quot; criticalquot; Windows上运行,这也意味着,在你的进程终止,Windows本身以及终止。当一个系统关键进程结束/终止,停止代码是CRITICAL_PROCESS_DIED(0xEF)过程中退出,并CRITICAL_OBJECT_TERMINATION(0xF4)如果进程异常终止。技术上,尽管这可以被用来quot; protectquot;对终止它的人的过程中,我建议您找到其他方法,这样做,因为如果用户终止因意外或一个过程的一个关键过程崩溃时是至关重要的,系统将即刻崩溃,以及。这将是非常恼人的用户。
也可以看到这种类型的行为,如WINLOGON.EXE,CSRSS.EXE,Services.exe中,SMSS.EXE和LSASS.EXE进程。所有这些过程被称为调用RtlSetProcessIsCritical。
进程是否是至关重要的,或没有可使用类ProcessBreakOnTermination(0x1D)调用ZwQueryProcessInformation。另外,此功能仅在5.1和更高NTDLL版本。使用代码
RtlSetProcessIsCritical功能定义如下:

NTSTATUS 

RtlSetProcessIsCritical (

    BOOLEAN bNew,    	// new setting for process

    BOOLEAN *pbOld,    	// pointer which receives old setting (can be null)

    BOOLEAN bNeedScb);    	// need system critical breaks

这意味着调用RtlSetProcessIsCritical(TRUE,NULL,FALSE),将一个过程中的关键,而另一RtlSetProcessIsCritical(FALSE,NULL,FALSE)调用将返回到正常的过程。临界状态时,终止或结束的任何方式的过程中通常会导致一个BSOD(如果蓝屏启用),或将导致系统重新启动。
获得这个函数从内核很简单。首先,我们定义一个函数原型:{C}
然后,我们获得NTDLL.DLL的开放处理,以获得使用{A}的功能:
HANDLE ntdll = LoadLibrary("ntdll.dll");

RtlSetProcessIsCritical SetCriticalProcess;



SetCriticalProcess = (RtlSetProcessIsCritical)

    GetProcAddress((HINSTANCE)ntdll, "RtlSetProcessIsCritical");

在此之后,我们可以简单地调用合适的参数SetCriticalProcess。
更详细和评论的例子是在Example.zip下载。
注意:此功能的使用需要在调用进程的SE_DEBUG_NAME特权。这可以很容易地得到使用,一个这样的例子可以看到示例的源代码。 兴趣点
我不能确定其他的编译器,但我很旧的MSVC 6.0编译器,我得到一个错误,说明quot; ESP的值是不正确保存跨函数调用... quot;,该方案还默认释放模式下退出之前崩溃。如果您更改了优化禁用(调试),这些问题消失。我猜一些VC 6.0的优化工作不正常。历史
我可能将无法更新此,除非有一个关键的缺陷在代码的任何地方。V1.0 - 2009年10月30日,日

回答

评论会员:jlkdaslkfjd 时间:2012/01/25
听说改名CSRSS.EXE的应用程序,以防止这种情况的发生..

我想一个过程,是重要的,足以防止终止。

关键的是刚刚蓝屏不方便。

你如何保护被终止的过程,并使其返回"访问被拒绝"或没有消息,而
评论会员:。hxhl95 时间:2012/01/25
通常这只是恶意软件,需要做的... ...但仅供参考试图寻找到挂钩TerminateProcess(用户模式或内核模式将您的具体情况)
评论会员:gillardg 时间:2012/01/25
您好,
这可能是有用的,在我的一些项目,壳

是有可能导出功能,并使其从DOTNET项目调用
评论会员:游客 时间:2012/01/25
??黄邵V​​oon
错误",ESP的值是不正确保存跨函数调用... ..."通常是由于调用约定使用,是从实际调用约定的不同,为什么DUN您尝试WINAPI,而不是_stdcall? WINAPI是调用Win32 API的公约。在此Windows 7机器,我现在打字,我没有一个C编译器尝试示例代码或WINAPI。不当投是一个非常危险的工具,因为它沉默的编译器
评论会员:!hxhl95 时间:2012/01/25
糟糕... ...我的错误。感谢您指出这一点,我已经改变了的函数声明和示例代码。问题是我已经声明返回类型为void的函数,而应该已经NTSTATUS(这是一个长期)

然而,因为RtlSetProcessIsCritical是一个内核函数,正确的声明是NTAPI。但NTAPI定义为__stdcall的我的编译器,因此无论是三(NTAPI,WINAPI或__stdcall)将正常工作。
评论会员:GreMiGen 时间:2012/01/25
RtlSetProcessIsCritical应宣布为__cdecl。
调用过程,恢复ESP的值,以清理堆栈。
我退出我的功能(RET为0x00000000)访问冲突错误时,编译源...
评论会员:PeterMoon 时间:2012/01/25
我只是写来突出你的观点....效果设置过程作为关键的是,如果进程停止,那么系统必须!

,任何人都"敢",使用此功能... ...明智地使用它... ...
评论会员:BartoszWojcik 时间:2012/01/25
伟大的发现,我只是希望新的恶意软件将不会使用它往往{S2}

Bartosz Wójcik | {A3}
评论会员:莫罗Leggieri 时间:2012/01/25
这就是为什么用户不应该为在计算机上的管理员
登录