2017-06-12 110 views
4

我正在用C#和C++/CLI編寫一個應用程序,並且有暫停進程的代碼。但是,我想阻止它們被另一個進程(如Process Explorer)解除掛起。是否有可能獲得獨佔的進程句柄或以其他方式阻止其他應用程序執行此操作?如果是這樣,怎麼樣?獲取獨佔進程句柄

+0

最好的方向,我可以給你會看在[進程安全和訪問權限(https://msdn.microsoft.com/en-us/library/windows/desktop/ms684880 MSDN文檔(V = vs.85)的.aspx)。您可能可以修改正在暫掛的進程的ACL,以防止其他進程暫停它。然後,當您想取消暫停時,您需要再次修改ACL,取消暫停,然後再次限制ACL。但是,具有足夠高權限的其他進程(例如'SeDebugPrivilege',您的應用程序可能也需要它們)可能仍會覆蓋您的限制。 – ozeanix

+0

對於它的價值,只需爲自己的應用程序獲取「SeDebugPrivilege」可能是一個相當大的挑戰!我的回憶是,你的應用程序需要以'SYSTEM'用戶的身份運行,纔能有足夠的權限來修改它自己的權限列表。 – ozeanix

+1

@ozeanix,如果你做得對,就不要這樣做。任何以管理員權限運行的進程都可以啓用調試權限。 (好吧,在默認配置中,無論如何。) –

回答

3

這是不可能的用戶模式。

這在令牌已經啓用SE_DEBUG_PRIVILEGE可以打開進程/線程處理所有訪問(僅當它不是受保護的進程)的任何進程。

從內核模式可以用ObRegisterCallbacks和過濾進程/線程嘗試開放註冊自己的回調。說否認手柄打開或刪除PROCESS_SUSPEND_RESUME,從DesiredAccessTHREAD_SUSPEND_RESUMETHREAD_RESUMEOB_PRE_CREATE_HANDLE_INFORMATION。但這並不妨礙另一個內核模式的代碼調用導出api PsResumeProcess

一般來說,對象句柄部分支持獨佔訪問。在OBJECT_ATTRIBUTES中尋找OBJ_EXCLUSIVE標誌(這總是作爲第3參數傳遞給任何打開/創建對象調用 - ZwOpenProcess),但如果在創建對象時設置了OBJ_EXCLUSIVE標誌,則這將僅適用於否則你得到STATUS_INVALID_PARAMETER或者如果句柄已經被另一個進程打開,你得到了STATUS_ACCESS_DENIED。但因爲進程總是創建沒有OBJ_EXCLUSIVE標誌 - 你並不能打開它獨佔處理(我已經沒有說在csrss.exe有關進程會話已存在打開句柄到您的過程)

0

您可以注入代碼到另一個運行處理和修補由NTDLL導出的NtResumeProcess和NtResumeThread例程。導出的例程將執行系統調用,但是您可以在發生此轉換之前攔截並將執行重定向到您自己的回調例程以應用過濾 - 返回STATUS_ACCESS_DENIED或其他適當的NTSTATUS錯誤代碼以阻止該操作。

這不會阻止其他人雖然繞過了手動系統調用你的補丁。你最好的選擇是ObRegisterCallbacks,然後剝離PROCESS_SUSPEND_RESUME給除你以外的任何來電者。

通過運行時字節打補丁第一種方法是很好的,因爲用戶模式掛鉤是不是一個問題,只要它做好。也有用於實現這一點的開源庫,Microsoft也擁有自己的API hooking庫MS Detours。 ObRegisterCallbacks方法將需要一個內核模式設備驅動程序,因此需要支持內核模式軟件簽名的數字簽名(並且對於啓用了安全引導的系統的支持,您需要一個擴展驗證簽名只發給真正註冊的公司,價格很高)。

祝你好運。