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 關注
- 1462 瀏覽
添加回答
舉報