我正在用C#和C++/CLI編寫一個應用程序,並且有暫停進程的代碼。但是,我想阻止它們被另一個進程(如Process Explorer)解除掛起。是否有可能獲得獨佔的進程句柄或以其他方式阻止其他應用程序執行此操作?如果是這樣,怎麼樣?獲取獨佔進程句柄
獲取獨佔進程句柄
回答
這是不可能的用戶模式。
這在令牌已經啓用SE_DEBUG_PRIVILEGE
可以打開進程/線程處理所有訪問(僅當它不是受保護的進程)的任何進程。
從內核模式可以用ObRegisterCallbacks
和過濾進程/線程嘗試開放註冊自己的回調。說否認手柄打開或刪除PROCESS_SUSPEND_RESUME
,從DesiredAccess
THREAD_SUSPEND_RESUME
和THREAD_RESUME
在OB_PRE_CREATE_HANDLE_INFORMATION
。但這並不妨礙另一個內核模式的代碼調用導出api PsResumeProcess
。
一般來說,對象句柄部分支持獨佔訪問。在OBJECT_ATTRIBUTES
中尋找OBJ_EXCLUSIVE
標誌(這總是作爲第3參數傳遞給任何打開/創建對象調用 - ZwOpenProcess
),但如果在創建對象時設置了OBJ_EXCLUSIVE
標誌,則這將僅適用於。否則你得到STATUS_INVALID_PARAMETER
或者如果句柄已經被另一個進程打開,你得到了STATUS_ACCESS_DENIED
。但因爲進程總是創建沒有OBJ_EXCLUSIVE
標誌 - 你並不能打開它獨佔處理(我已經沒有說在csrss.exe
有關進程會話已存在打開句柄到您的過程)
您可以注入代碼到另一個運行處理和修補由NTDLL導出的NtResumeProcess和NtResumeThread例程。導出的例程將執行系統調用,但是您可以在發生此轉換之前攔截並將執行重定向到您自己的回調例程以應用過濾 - 返回STATUS_ACCESS_DENIED或其他適當的NTSTATUS錯誤代碼以阻止該操作。
這不會阻止其他人雖然繞過了手動系統調用你的補丁。你最好的選擇是ObRegisterCallbacks,然後剝離PROCESS_SUSPEND_RESUME給除你以外的任何來電者。
通過運行時字節打補丁第一種方法是很好的,因爲用戶模式掛鉤是不是一個問題,只要它做好。也有用於實現這一點的開源庫,Microsoft也擁有自己的API hooking庫MS Detours。 ObRegisterCallbacks方法將需要一個內核模式設備驅動程序,因此需要支持內核模式軟件簽名的數字簽名(並且對於啓用了安全引導的系統的支持,您需要一個擴展驗證簽名只發給真正註冊的公司,價格很高)。
祝你好運。
- 1. 獲取進程主線程的句柄
- 2. 從瀏覽器進程獲取句柄
- 3. 通過PID獲取進程句柄
- 4. 獲取進程表格的句柄c#
- 5. 獲取正在運行的進程給定的進程句柄
- 6. 按進程名稱獲取進程句柄
- 7. Win32API - 如何從進程句柄獲取進程的文件名?
- 8. 如何從進程ID獲取進程句柄?
- 9. 找出哪個進程在USB設備句柄上獨佔鎖定
- 10. 如何從win32進程獲取線程句柄列表?
- 11. 如何在Windows中獲取進程獨佔鎖定文件夾?
- 12. 從進程得到句柄
- 13. lldbinit中的進程句柄
- 14. Qt句柄進程終止
- 15. 獲取VB.NET中PID進程的所有子窗口的句柄
- 16. 從pid或句柄獲取進程名稱
- 17. 獲取當前進程中所有句柄的名稱
- 18. 如何獲取本地COM服務器的進程句柄?
- 19. 通過窗口句柄獲取未知進程的名稱?
- 20. 獲取給定進程的文件句柄
- 21. C# - 嘗試獲取進程的句柄時訪問被拒絕
- 22. 獲取窗口句柄
- 23. 從MemoryMappedFile獲取Win32句柄
- 24. 從DataGridViewTextBoxCell獲取句柄IntPtr?
- 25. 獲取控制檯句柄
- 26. 獲取pagefile.sys的句柄
- 27. 從句柄中獲取ContextMenu?
- 28. 獲取Windows句柄的WNDPROC
- 29. 如何獲取Windows中當前進程的所有子進程的句柄?
- 30. 獲取所有窗口句柄和給定進程名稱的相應標籤句柄
最好的方向,我可以給你會看在[進程安全和訪問權限(https://msdn.microsoft.com/en-us/library/windows/desktop/ms684880 MSDN文檔(V = vs.85)的.aspx)。您可能可以修改正在暫掛的進程的ACL,以防止其他進程暫停它。然後,當您想取消暫停時,您需要再次修改ACL,取消暫停,然後再次限制ACL。但是,具有足夠高權限的其他進程(例如'SeDebugPrivilege',您的應用程序可能也需要它們)可能仍會覆蓋您的限制。 – ozeanix
對於它的價值,只需爲自己的應用程序獲取「SeDebugPrivilege」可能是一個相當大的挑戰!我的回憶是,你的應用程序需要以'SYSTEM'用戶的身份運行,纔能有足夠的權限來修改它自己的權限列表。 – ozeanix
@ozeanix,如果你做得對,就不要這樣做。任何以管理員權限運行的進程都可以啓用調試權限。 (好吧,在默認配置中,無論如何。) –