我需要在任务管理器中隐藏进程.它适用于Intranet场景.所以,一切都是合法的.:)
请随意分享您拥有的任何代码(最好使用C#)或任何其他技术或与此路线相关的任何问题.
Update1:大多数用户具有管理员权限,以便运行一些旧版应用程序.因此,其中一个建议是将其隐藏在任务管理器中.如果还有其他方法可以阻止用户杀死进程,那就太棒了.
Update2:删除对rootkit的引用.不知何故,这篇文章看起来很消极.
不要试图阻止它被杀 - 你不会去管理它.相反,让它定期呼叫家庭网络服务.当webservice注意到客户端"静默"时,它可以ping机器以查看它是否只是一个重启问题,并向管理员(或任何人)发送一封电子邮件来管理任何已经杀死该进程的人.
没有支持的方法来实现这一目标.可以在任何权限级别读取进程列表.如果您希望隐藏进程甚至是管理员,那么这是双重支持的.
要使其工作,您需要编写内核模式rootkit来拦截对NtQuerySystemInformation的调用,以便SystemProcessInformation信息类无法列出您的隐藏进程.
拦截系统调用是很难做安全,以及64位Windows内核走自己的方式来防止这种是可能的:试图修改瞬间蓝色屏幕上调用表的结果.在这些平台上,这将非常困难
这是一个试图做类似事情的rootkit的例子(并且有几个严重的问题).
如果要阻止用户从任务管理器中删除该进程,您只需在进程上使用安全描述符即可拒绝终止对每个人的访问.管理员在技术上仍然可以通过获取进程的所有权并重置DACL来终止进程,但是没有任何接口可以从任务管理器执行上述任一操作.Process Explorer可能有一个接口.
进程启动时,使用SetKernelObjectSecurity并DACL_SECURITY_INFORMATION
使用当前进程句柄.设置ACL为零的DACL.这将拒绝所有人的访问权限,包括那些试图通过任务管理器结束您的流程的人.
以下是一个更改进程所有者的示例:
SECURITY_DESCRIPTOR sd; ACL dacl; SID_IDENTIFIER_AUTHORITY ntauth = SECURITY_NT_AUTHORITY; PSID owner; assert(InitializeAcl(&dacl, sizeof dacl, ACL_REVISION)); assert(AllocateAndInitializeSid(&ntauth, 1, SECURITY_LOCAL_SYSTEM_RID, 0,0,0,0,0,0,0, &owner)); assert(InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION)); assert(SetSecurityDescriptorDacl(&sd, TRUE, &dacl, FALSE)); assert(SetSecurityDescriptorOwner(&sd, owner, FALSE)); assert(SetKernelObjectSecurity(GetCurrentProcess(), DACL_SECURITY_INFORMATION | OWNER_SECURITY_INFORMATION, &sd)); assert(FreeSid(owner) == NULL);
不幸的是,它似乎没有效果.我仍然可以关闭该过程(尽管不是有限的用户).也许任务管理器正在取得所有权或调用其他一些权限来杀死进程?我似乎记得在以前版本的Windows中工作(我正在测试2003),但我可能会弄错.
我希望你不能.
更新:鉴于该方案,我认为您可能最好在不同的管理员帐户下运行它.这可能有助于提醒人们他们不应该杀死这个过程.
或者,您可以编写一个小的"检查器"实用程序来检查应用程序是否正在运行,如果不是,它会自动启动它.然后将代码添加到应用程序以检查执行相同操作的"检查程序"实用程序.这样,如果一个终止,则另一个启动它.我似乎病毒就是这样做的,它似乎非常有效.
编写驱动程序-您可以使用ObRegisterCallbacks注册过程对象访问通知。当DesiredAccess包含您不喜欢的访问权限(例如进程终止或写入进程内存)时,返回STATUS_ACCESS_DENIED。
http://msdn.microsoft.com/zh-CN/library/windows/hardware/ff558692(v=vs.85).aspx