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

我有要求在任务pipe理器中隐藏进程。 这是针对Intranet的情况。 所以,一切都是合法的。 🙂

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

Update1 :大多数用户拥有pipe理员权限才能运行一些旧版应用程序。 所以,其中一个build议是隐藏在任务pipe理器中。 如果还有其他的方法来阻止用户杀死这个进程,那就太好了。

Update2 :删除对rootkit的引用。 不知为什么这个post看起来是负面的

有没有支持的方式来完成这一点。 进程列表可以在任何特权级别读取。 如果你希望隐藏一个甚至pipe理员的进程,那么这是双重的不受支持的。

为了使这个工作,你需要编写一个内核模式的rootkit来拦截对NtQuerySystemInformation的调用,这样SystemProcessInformation信息类就不能列出你的隐藏进程了。

拦截系统调用是非常困难的,64位的Windows内核不能做到这一点:试图修改系统调用表的结果,立即蓝屏。 在这些平台上将会非常困难

这里是一个rootkit的例子,它试图做类似的事情(有几个严重的问题)。

不要试图阻止它被杀 – 你不会去pipe理它。 相反,定期打电话回家的web服务。 当networking服务通知客户“保持沉默”时,它可以ping机器以查看是否仅仅是重新启动问题,并且发送电子邮件给pipe理员(或谁)以约束任何杀死stream程的人。

如果要阻止用户从任务pipe理器中杀死进程,则只需在进程上使用安全描述符即可拒绝对每个人的终止访问。 pipe理员在技术上仍然可以通过取得进程的所有权并重置DACL来终止进程,但是没有任何接口可以从任务pipe理器执行这些任务。 虽然Process Explorer可能有一个接口。

当您的进程启动时,使用当前进程句柄和DACL_SECURITY_INFORMATION使用DACL_SECURITY_INFORMATION 。 设置零ACL的DACL。 这将拒绝对所有人的访问,包括那些试图用任务pipe理器结束你的进程的人。

这里是一个例子,也改变了进程的所有者:

 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); 

不幸的是,这似乎不是有效的。 我仍然可以closures这个过程(尽pipe不是一个有限的用户)。 也许任务pipe理器正在取得所有权或调用其他特权来终止进程? 我似乎记得这在以前版本的Windows中工作(我正在testing2003),但我可能会误解。

我希望你不能。

更新:考虑到这种情况,我认为你可能会最好在不同的pipe理帐户下运行它。 这可能有助于提醒人们注意,他们不应该杀死这个过程。

或者,您可以编写一个小的“检查器”实用程序来检查应用程序是否正在运行,如果不是,它会自动启动它。 然后添加代码到应用程序来检查“checker”实用程序,做相同的。 这样,如果一个人被终止了,那么另一个人开始备份。 我似乎病毒是这样做的,而且似乎工作非常有效。

如果你只需要伪装进程,而不是完全隐藏进程,你可以将其重命名为winlogon.exe或svchost.exe,用户可能会忽略它。 但是,正如塞尔吉奥所说的那样,这是安全的,因为一个原因,这是一个不好的名声。

如果用户拥有适当的权限,防止用户杀死进程是另一个困难。 我知道的唯一方法是有多个进程相互监视,并重新启动任何被杀死的进程。 再次,这是一个阴暗的道路。

不知道为什么这没有build议,但inheritance人我的第一个答案在这个网站上。 而不是阻止用户杀死一个进程。 (需要rootkit挂钩。)您可以简单地禁用任务pipe理器与registryinput一起使用。

 public static void ToggleTaskManager(bool toggle) { Microsoft.Win32.RegistryKey HKCU = Microsoft.Win32.Registry.LocalMachine; Microsoft.Win32.RegistryKey key = HKCU.CreateSubKey(@"Software\Microsoft\Windows\CurrentVersion\Policies\System"); key.SetValue("DisableTaskMgr", toggle ? 0 : 1, Microsoft.Win32.RegistryValueKind.DWord); } 

有没有简单或支持的方式来做到这一点。 即使你写了一个rootkit来做这件事,那么未来的更新可能会很容易被打破。 我会重新检查一下你是否想要这样做。

正如上面提到的,最好的方法是2个任务,相互监视,我明白你不想浪费CPU,所以最好的方法是在closures任务之间build立一个事件。

我不完全确定如何设置钩子,但是,然后你不使用一个while循环,这会浪费CPU。

编写驱动程序 – 您可以使用ObRegisterCallbacks来注册过程对象访问通知。 当DesiredAccess包含您不喜欢的访问权限(如进程终止或写入进程内存)时,返回STATUS_ACCESS_DENIED。

http://msdn.microsoft.com/en-us/library/windows/hardware/ff558692(v=vs.85).aspx

你看过写一个服务吗? 这样服务就像本地系统一样运行,应用程序在用户的上下文中运行,服务可以确保事情仍然按照需要完成,而应用程序只是这个服务的一个接口。 杀死应用程序只会导致用户看不到任何通知,系统托盘图标等,但服务仍然在做它的工作。

很多人可能会知道如何做,但不会在这里发布。 在互联网上发布恶意代码是非常危险的。 谁知道你可能会处于危险之中。 问一些电脑工程师。 我会给你的程序结构虽然。

只需将您的程序的DLL注入explorer.exe。

你的进程不会只是显示出来,因为它不是作为一个程序运行的,而是在一个程序(explorer.exe)中运行的。 即使使用任何types的任务pipe理器,用户也不会看到该过程。

那么你只要求用户不要杀死这个过程呢? 你会花多less时间去做,因为同一家公司的员工显然是幼稚的行为。

要阻止进程被永久杀死,该进程所做的第一件事就是调用“atexit()”并让atexit()函数启动进程

我知道这个问题是旧的,但我刚才回答了一个重复的问题,其中包含一些不好的信息,那里不是在这里,所以我想我会链接到它。 请参阅我对重复问题的回答。 另外如果你真正的目标是阻止用户杀死进程,那么我所知道的工作很容易,虽然这有点骇人,我不知道这是否仍然有效,只是简单地命名你的应用程序lsass.exe任务pipe理器甚至不允许pipe理员用户closures进程。 对于这种方法,无论哪个用户启动进程或者可执行文件驻留在文件系统的哪个位置都没有关系,似乎windows只是检查进程是否被命名,然后不允许结束。

更新:我只是试图在Windows 7上执行lsass.exe技巧,它似乎已经修复,但我的猜测是,它仍然可以在Windows XP,甚至更早的服务包的XP以上的版本。 尽pipe在写这篇文章的时候这个问题已经不存在了,但我还是认为我会把它作为一个有趣的事实。