回覆列表
  • 1 # 使用者3607974917263

    本來想昨天寫的,發現已經有答案了,稍微補充一下細節。IDA 粗看了一下 VS2015 社群版帶的 spyxx_amd64,用的是 SetWindowHookEx 設定了全域性鉤子。實現程式碼在 .text:140037A64 __int64 __fastcall SetMsgHook(int),一共設定了三個 hook: WH_GETMESSAGE, WH_CALLWNDPROC, WH_CALLWNDPROCRET。三者都可以監視視窗訊息,它們的區別是:

    WH_GETMESSAGE:監視由 GetMessage 或 PeekMessage 獲取的訊息,但不能攔截或者修改訊息引數;WH_CALLWNDPROC 可以在視窗接收到訊息之前進行處理,修改引數,甚至丟棄訊息;WH_CALLWNDPROCRET 在視窗已經處理完了訊息的時候觸發。詳見:Hooks Overview (Windows)這三個 hook 對應的回撥函式在 spyxxhk_amd64.dll 中實現,分別對應 SpyxxGetMsgProc, SpyxxCallWndProc 和 SpyxxCallWndRetProc。這三個函式的具體實現非常相似,都是根據視窗的控制代碼獲取一些額外的資訊,如 ClassName / WindowLong / ProcessId / ThreadId 等,投遞訊息到日誌處理例程中。例如 SpyxxCallWndRetProc:SpyXX 透過設定鉤子來全域性捕獲訊息。如果已經知道目標視窗的控制代碼,可以簡單地替換 WNDPROC 來接管訊息,根據需要選擇是否丟棄訊息或者放行。具體實現是 GetWindowLong(hWnd, GWL_WNDPROC 獲取原始的回撥函式地址,接著 SetWindowLong 替換其為自定義的回撥函式,在回撥中使用 CallWindowProc 呼叫原始函式即可實現放行或修改 wParam / lParam。

  • 中秋節和大豐收的關聯?
  • 塑膠的耐溫值?