2017-08-24 42 views
-1

做一些DLL注入並需要摧毀某個窗口。但是,DestroyWindow只有在創建該窗口的相同線程調用它時纔有效。否則,它會失敗,出現錯誤5:訪問被拒絕。我想也許我可以欺騙它,通過獲取它的線程ID(DWORD dwTid = GetWindowThreadProcessId),然後將當前線程的線程ID設置爲它:__writefsdword(0x24, dwTid),但它仍然失敗,錯誤5,拒絕訪問。如何從遠程線程DestroyWindow?

經過一些谷歌搜索後,我還沒有找到答案。

順便說一句:我知道我可以發送WM_DESTROY然而,出於好奇心和需要解決的問題,我想知道如何與DestroyWindow做到這一點。

+5

您是否嘗試將WM_CLOSE發佈到窗口? 「 – Robinson

+0

」順便說一句:我知道我可以發送WM_DESTROY,但出於好奇和需要解決問題,我想知道如何使用DestroyWindow。「 - 包括WM_CLOSE。對不起,應該是更具體。 –

+0

我不確定你需要解決哪些問題,需要你以複雜的方式做一些簡單而直接的事情。也許你可以解釋你正試圖解決的問題,我們可以幫助你尋找解決方案嗎? – Basya

回答

5

要調用DestroyWindow(),您必須注入在創建窗口的線程上下文中運行的代碼。使用GetWindowThreadProcessId()來獲得窗口的擁有線程ID,然後使用SetWindowsHookEx()將消息掛鉤安裝到該線程中,然後最終發送/發送任何消息到窗口。當鉤子回調接收到消息時,它將在窗口線程的上下文中運行,因此可以在窗口上調用DestroyWindow()(將HWND提供給鉤子回調)。