如何在C#中的“任务管理器”中隐藏进程?

我需要在任务管理器中隐藏一个进程。它用于Intranet方案。因此,一切都是合法的。:)


请随时分享您拥有的任何代码(最好是C#)或任何其他技术,或与此路线有关的任何问题。


Update1:大多数用户具有管理员权限才能运行某些旧版应用程序。因此,建议之一是将其隐藏在任务管理器中。如果还有其他方法可以防止用户终止该进程,那就太好了。


Update2:删除对rootkit的引用。不知何故使这篇文章看起来很消极。


料青山看我应如是
浏览 1407回答 3
3回答

郎朗坤

没有支持的方法来完成此操作。可以以任何特权级别读取进程列表。如果您希望甚至对Administrators都隐藏一个进程,那么双重支持。为了使它起作用,您需要编写一个内核模式rootkit来拦截对NtQuerySystemInformation的调用,以使SystemProcessInformation信息类无法列出您的隐藏进程。安全地拦截系统调用非常困难,并且64位Windows内核竭尽全力防止这种情况的发生:尝试修改syscall表会立即显示蓝屏。在那些平台上这将非常困难这是一个试图做类似事情的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)中可以使用的功能,但是我可能会误会。
打开App,查看更多内容
随时随地看视频慕课网APP