2010-11-07 18 views
0

如果您想停止進程被終止,則有一種方法是掛接到TerminateProcess(或NtTerminateProcess)。如果進程本身終止(例如,因爲您關閉了它的窗口),則提供給這些函數的句柄爲NULL,因此您可以使用GetCurrentProcess()& GetModuleFileNameEx()來找出正在終止的可執行文件。由於GetCurrentProcess()返回僞句柄,因此您可以毫無問題地訪問它。Hooking TerminateProcess&從Handle中獲取信息It Supplies

但是,如果一個進程正在終止另一個進程,則提供的句柄不是NULL。它表示正在終止的進程。問題是,你無法獲得有關該過程的信息。你可以簡單地返回一個代碼,說「拒絕訪問」,而不是調用原始的[Nt] TerminateProcess(),但是這個毛毯會阻止所有進程終止其他進程 - 這是一個壞主意。

該句柄必須表示有效的否則TerminateProcess將無法做任何有用的事情 - 但我甚至不能對它調用GetProcessId(),我得到ERROR_INVALID_HANDLE(或ERROR_ACCESS_DENIED)。我嘗試過從幫助和在線收集的各種方法,包括獲得調試權限(成功)和DuplicateHandle()(同樣的錯誤)和ZwQueryInformationProcess()以獲取ID(STATUS_ACCESS_DENIED)。我甚至無法枚舉進程,因爲它們返回ID,而我無法獲得ID,而OpenProcess()總是返回一個新的句柄,所以我無法比較句柄。

我只能假設句柄有PROCESS_TERMINATE,沒有別的。我知道Vista和更高版本保護了數字版權管理的流程,但我使用ProcessExplorer作爲我的豚鼠,所以它絕對不是媒體應用程序!

有誰知道我還能怎樣才能獲得有關從此句柄終止的進程的任何信息?

回答

1

這只是一個普通的流程句柄。問題是,你的鉤子函數在哪個進程中執行?如果它是調用進程,則句柄可以原樣用於GetProcessId或NtQueryInformationProcess。如果不是,您需要調用DuplicateHandle將句柄複製到您的過程中。

如果您獲取拒絕訪問錯誤,可能是因爲進程句柄只具有PROCESS_TERMINATE訪問權限。在這種情況下,使用DuplicateHandle通過PROCESS_QUERY_(LIMITED_)信息訪問「重新打開」該進程。

+0

我在問題中提到我已經嘗試過使用DuplicateHandle()(試圖獲得足夠的訪問權),但無濟於事。由於掛鉤被注入到每個進程中,並且只能捕獲與NTDLL相同的進程調用,因此應該只在應用程序的上下文中調用它。例如,如果ProcessExplorer終止一個應用程序,它將被映射到ProcessExplorer中的觸發代碼觸發,並且您是否會同意它應該是ProcessExplorer自己的上下文?它不能成爲目標應用程序,因爲這不會使TerminateProcess調用... – JTeagle 2010-11-08 13:14:29

+0

我應該說明我正在使用掛鉤的AppInit_DLLs方法,而不是系統範圍的掛鉤。我忘記澄清我的掛鉤代碼只在應用程序中執行,使得呼叫終止另一個。 – JTeagle 2010-11-08 13:17:04

+0

我提到有關句柄的原因是因爲您沒有指定如何完成掛鉤,並且您提到了無效的句柄錯誤。使用DuplicateHandle的問題究竟是什麼?也許你可以發佈一些代碼... – wj32 2010-11-08 19:32:38