2011-12-29 58 views
0

我想打開進程重複句柄和使用GetThreadContext從線程句柄查詢信息,但我得到錯誤ERROR_INVALID_HANDLE或ERROR_GEN_FAILURE。有關這方面的信息似乎非常有限....通過DuplicateHandle的GetThreadContext?

processHandle = OpenProcess(PROCESS_DUP_HANDLE, FALSE, pid) 
DuplicateHandle(processHandle,handle.Handle,GetCurrentProcess(),&dupHandle,0,FALSE,DUPLICATE_SAME_ACCESS); 


      memset(&ctx,0x00,sizeof(ctx)); 
      GetThreadContext(dupHandle,&ctx); 
      printf("Error:%x", GetLastError()); 

任何人?

+1

難道'DuplicateHandle'成功嗎?什麼是'handle.Handle'? – 2011-12-29 00:55:52

+0

是DuplicateHandle成功,但CTX總是空....正如我上面貼GetThreadContext返回錯誤...... – VisaToHell 2011-12-29 01:19:30

回答

3

首先,如上面的建議,你應該傳遞線程句柄作爲參數,而不是進程句柄。

那麼,什麼CONTEXT結構您要求的一部分,由GetThreadContext API來填補?你離開零點那裏,應該有1個+標誌指示感興趣的數據:

CONTEXT ThreadContext = { CONTEXT_CONTROL }; 
if(GetThreadContext(ThreadHandle, &ThreadContext)) { 
    // ... 

參見代碼段,https://stackoverflow.com/a/199809/868014

+0

謝謝,它確實幫助設置標誌,似乎ESP值正確返回,但EIP始終是相同的值爲每個線程....某處內核... 0x7c90e514(我列舉Explorer.exe的手柄)示例代碼,我使用 - > forum.sysinternals.com/uploads/26792/handles.zip – VisaToHell 2011-12-29 10:19:41

+0

爲什麼不,如果線程處於部分閒置狀態,例如在'WaitForSingleObject'中,你可能想走棧看看實際的位置 – 2011-12-29 11:22:19

+0

嗯不要以爲它可能所有的線程返回相同的EIP,也有一些線程不會返回EIP ..也許沒有特權爲他們?我用無效的EIP嘗試SetThreadContext,它工作,explorer.exe崩潰戲劇性:) – VisaToHell 2011-12-29 12:07:42

2

GetThreadContext需要一個線程處理不是一個進程句柄。

+0

啊我很枚舉所有的句柄,我順利拿到所有句柄但GetThreadContext返回錯誤.... – VisaToHell 2011-12-29 01:44:50

+0

你如何獲得線程句柄?您是否嘗試過明確詢問您需要訪問重複內容? – 2011-12-29 02:13:08

+0

我使用此代碼示例枚舉句柄 - > http://forum.sysinternals.com/uploads/26792/handles.zip如果有人有工作代碼,請分享?這真的返回句柄和他們的名字,但我不能在線程處理GetThreadContext ..... – VisaToHell 2011-12-29 10:09:17