2014-03-30 73 views
1

我的應用程序被編譯爲32位,並且由於我在64位Windows 7上運行,因此我的目標(notepad.exe)爲64位。當我在notepad.exe的第一個線程上調用SetWindowsHookEx()時,DLL根本沒有被注入,但沒有返回錯誤。我知道它沒有被注入,因爲我在DLL_PROCESS_ATTACH上顯示帶有消息Attached的消息框,對於DLL_PROCESS_DETACH,我在消息框中顯示Detached消息。這些消息只會在我撥打LoadLibrary()時顯示一次,另一次是我的應用程序退出時顯示。從32位進程掛鉤64位進程時,SetWindowsHookEx()不會返回錯誤?

根據MSDN文檔here

因爲應用程序上下文中運行掛鉤,它們必須匹配 的應用程序的「位數」。如果32位應用程序在64位Windows上安裝了全局掛接,則將32位掛接注入到每個32位進程(通常的安全邊界適用)中。在64位 進程中,線程仍被標記爲「掛鉤」。但是,由於32位應用程序必須運行該鉤子代碼,系統將在鉤子應用程序的上下文中執行 掛鉤;具體來說,在 調用SetWindowsHookEx的線程上。這意味着掛鉤應用程序必須繼續泵送消息,否則可能會阻止64位進程的正常運行。

這是否意味着它成功掛鉤了我自己的進程而不是實際返回錯誤?

編輯:我的鉤子是WH_CBT類型。

+0

這個問題關鍵取決於鉤子的類型 –

+0

它沒有義務返回錯誤,它肯定會注入* some *進程。只是不是你想要的。這是64位操作系統上的缺陷,您需要使用64位DLL啓動64位版本的程序,以注入64位進程。 –

回答

1

您需要進一步的閱讀文檔:

對於指定的鉤子類型,線程鉤子先調用,那麼全球 掛鉤。請注意,可以在安裝了 鉤子的線程上調用WH_MOUSE,WH_KEYBOARD,WH_JOURNAL *,WH_SHELL, 和低級鉤子,而不是處理鉤子的線程。對於這些鉤子,如果32位鉤子在鉤子鏈中的64位鉤子之前,則它可能會調用32位和64位鉤子,即 。

總之它取決於鉤子類型,如果你的dll被注入到目標進程中。如果您只想監視鍵盤和鼠標事件,則無需將自己注入其他進程。 Windows會在你自己的進程中回調你的鉤子。

我懷疑你的鉤型是其中之一:

  • WH_MOUSE_LL
  • WH_KEYBOARD_LL

不會引起任何庫注入到目標進程。

+2

只有_LL掛鉤不使用注射。 –

+0

修正了一個。 –

1

該文檔的那一部分沒有明確說明的是,當SetWindowsHookEx未能將32位DLL注入64位進程而不是返回錯誤時,它會訴諸使用線程的消息循環,調用SetWindowsHookEx來執行鉤子程序,就像它在低級別的鼠標/鍵盤鉤子(WH_MOUSE_LL/WH_KEYBOARD_LL)中的工作方式一樣。

+0

這是超級怪異的。我看到'SetWindowsHookEx'成功(有點),同時試圖掛接一個32位的64位線程:返回值不是NULL,並且似乎是一個有效的'HHOOK',因爲'UnhookWindowsHookEx'運行得很好。但是(對於'WH_GETMESSAGE')我的鉤子程序永遠不會被調用。 – manuell