3 回答
TA贡献1921条经验 获得超9个赞
没有支持的方法来完成此操作。可以以任何特权级别读取进程列表。如果您希望甚至对Administrators都隐藏一个进程,那么双重支持。
为了使它起作用,您需要编写一个内核模式rootkit来拦截对NtQuerySystemInformation的调用,以使SystemProcessInformation信息类无法列出您的隐藏进程。
安全地拦截系统调用非常困难,并且64位Windows内核竭尽全力防止这种情况的发生:尝试修改syscall表会立即显示蓝屏。在那些平台上这将非常困难
这是一个试图做类似事情的Rootkit的例子(有几个严重的问题)。
TA贡献1776条经验 获得超12个赞
如果要防止用户从任务管理器中终止进程,则可以仅在进程上使用安全描述符来拒绝终止对所有人的访问。从技术上讲,管理员仍然可以通过拥有该进程的所有权并重置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)中可以使用的功能,但是我可能会误会。
- 3 回答
- 0 关注
- 1406 浏览
添加回答
举报