我有一个需求,需要在任务管理器中隐藏一个进程。它是针对企业内部网络的场景,所以一切都是合法的。:)
请随意分享您拥有的任何代码(最好使用C#)或任何其他技术或在使用此方法时可能遇到的任何问题。
更新1:大多数用户都拥有管理员权限,以便运行一些旧应用程序。因此,建议之一是将其隐藏在任务管理器中。如果有其他方法可以防止用户终止进程,那将是很好的。
更新2:删除rootkit的提及。某种程度上使这篇文章看起来很消极。
我有一个需求,需要在任务管理器中隐藏一个进程。它是针对企业内部网络的场景,所以一切都是合法的。:)
请随意分享您拥有的任何代码(最好使用C#)或任何其他技术或在使用此方法时可能遇到的任何问题。
更新1:大多数用户都拥有管理员权限,以便运行一些旧应用程序。因此,建议之一是将其隐藏在任务管理器中。如果有其他方法可以防止用户终止进程,那将是很好的。
更新2:删除rootkit的提及。某种程度上使这篇文章看起来很消极。
不要试图阻止进程被终止 - 你无法做到。相反,让进程定期向一个 Web 服务呼叫。当 Web 服务注意到客户端“变得沉默”时,它可以 ping 该计算机以查看是否只是重新启动问题,并向经理(或其他人)发送电子邮件以管理谁杀死了该进程。
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),这个方法是可行的,但我可能记错了。
assert()
,当定义了NDEBUG
时代码将会失败(当定义了该宏时,它被定义为空)。assert()
并不能替代错误检查。 - quantumassert()
使我的意思明确,这就是重点;它并不是要被粘贴到任意代码库中而没有理解。此外,您可以使用强制在所有构建中使用assert()
的头文件。 - Chris Smith我希望你做不到。
更新:鉴于情况,我认为你最好在不同的管理员帐户下运行它。这可能有助于提醒人们不要终止该进程。
或者,您可以编写一个小的“检查器”实用程序来检查应用程序是否正在运行,如果没有,则自动启动它。然后添加代码到应用程序中,以检查执行相同操作的“检查器”实用程序。这样,如果其中一个被终止,另一个将重新启动它。我看过病毒也是这样做的,这似乎非常有效。
编写驱动程序 - 您可以使用ObRegisterCallbacks注册进程对象访问通知。 当DesiredAccess包含您不喜欢的访问权限(例如进程终止或写入进程内存)时,返回STATUS_ACCESS_DENIED。
http://msdn.microsoft.com/zh-cn/library/windows/hardware/ff558692(v=vs.85).aspx
我不确定为什么还没有人提出这个建议,但这是我在这个网站上的第一个答案。 与其防止用户杀死进程(需要rootkit hooking),你可以通过注册表输入来简单地禁用任务管理器的使用。
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);
}
tasklist.exe
、taskkill.exe
或 ProcessMonitor
呢?仅仅阻止任务管理器似乎并不是防止关闭进程的好方法。 - Oliver正如上面提到的,最好的方法是两个任务相互监控,我理解你不想浪费CPU,所以最好的方式是在这两个任务之间建立一个事件,当其中一个关闭时触发。
我不太确定如何设置钩子,但这样就不需要使用while循环来浪费CPU了。