• 沒有找到結果。

2.3 Win32 API

2.3.4 Hook

因為遠端桌面程式最在意的便是畫面變動的區塊,因此如何取得這些區塊,

就是這類程式相當重要的一部分。VNC 採用的方法是,監視任何和畫面相關的訊 息,並將範圍記錄下來,再進一步處理,這些在後面章節會詳細探討,現階段我 們要先研究 VNC 是如何取得想要的訊息---Hook[8]。

Hook 實際上是一個處理訊息的程式,屬於 Windows 的 API,通過使用者的 啟動後,它可以針對某些特定動作所產生的訊息做監視和處理,比如:OS 發送 WM_PAINT 的訊息給某個應用程式、使用者敲擊鍵盤、移動滑鼠,這些就被分 類為三種動作,因為 Windows 溝通都是透過訊息,因此每當特定的動作產生時,

都會伴隨著訊息,在訊息還沒送達目的應用程式之前,Hook 就會先捕獲該訊息,

亦即 Hook 前處理函數先得到控制權,此時對應 idHook 的前處理函數即可對該 訊息加工,也可以不作處理而繼續傳遞該訊息,還可以強制結束訊息的傳遞。前 處理函數會如何運作的部分我們在 3.4.1 節中會詳細再說明。

圖 2-2.Hook 示意圖

要實現 win32 的系統 Hook,必須調用 SDK 中的 API 函數 SetWindows- HookEx 來安裝這個 Hook 函數,這個函數的原型是:

HHOOK SetWindowsHookEx(

int idHook, //要安裝的 Hook 類型 (參考下面的 IdHook)

HOOKPROC lpfn, //Hook 前處理函數的指標,即攔截到指定系統訊息後 的前處理函數名稱,須定義在 DLL 中

HINSTANCE hMod, //應用程式實例的控制碼

DWORD dwThreadId; //要安裝 Hook 的 threadID ,指定被監視的 thread,如 果明確指定了某個 thread 的 ID 就只監視該 thread,此 時的 Hook 即為 thread hook;如果該參數被設置為 0,

則表示此 Hook 為監視系統所有 thread 的全局 Hook。

);

得到控制權的 Hook 前處理函數在完成對訊息的處理後,如果想要該訊息繼 續傳遞,那麼它必須調用另外一個 SDK 中的 API 函數 CallNextHookEx 將訊息 傳遞下去。Hook 預處理函數也可以通過直接返回 true 來丟棄該訊息,並阻止該 訊息的傳遞。每種類型的 Hook 是由系統來維護,最後安裝的 Hook 放在鏈的開 始,而最早安裝的 Hook 放在最後,也就是後加入的先獲得控制權。Hook 在使 用完之後需要用 UnHookWindowsHookEx()卸載,否則會造成麻煩。

Windows 總共提供了對應 13 種動作的 Hook,這裡僅列出一般較常用的 9 種,旁邊是要觸發 Hook 對應動作的說明。

●常用 idHook 參數整理如下:

WH_CALLWNDPROC //視窗 hook,當系統向目標視窗發送訊息時將觸發 WH_CALLWNDPROCRET //視窗 hook,當視窗處理完訊息後將觸發

WH_CBT //當 Windows 啟動、產生、釋放(關閉)、最小

VNC Server 在程式中啟用了三個 Hook,分別是上面 WH_CALLWNDPROC、

WH_GETMESSAGE、WH_SYSMSGFILTER,並且在 SetWindowsHookEx()

第三章

Server 整個完整架構先進行初步介紹,對整個邏輯有點概念;3.2 節中說明 Server 是如何不斷接收不同 Client 的連線要求;3.3 節討論從 Server 和 Client 一開始連 入。由以上兩種方式取得最後可能變動範圍後,在最新資料的 mainbuffer 和前 一狀態的 backbuffer 中,詳細比對這些可能範圍,取得真正有變動的區域資料並 壓縮,再進一步傳送給 Client。