1. 程式人生 > >180108 逆向-Windows訊息機制(鍵盤訊息)

180108 逆向-Windows訊息機制(鍵盤訊息)

1625-5 王子昂 總結《2018年1月8日》 【連續第465天總結】
A. Windows訊息系統-鍵盤訊息
B.

鍵盤訊息

概述

應用程式從系統接收到的關於鍵盤的訊息可以分為兩類:擊鍵和字元。
物理層面上,對於某個按鍵(例如A),會發出“按下”和“彈起”兩種訊息,即擊鍵訊息
邏輯層面上,對於某個按鍵(例如A),按下以後會發出字元訊息’A’

對於可以產生顯示字元的擊鍵,Windows不僅給程式傳送擊鍵訊息,而且會發送字元訊息
而對於不產生字元訊息的擊鍵,例如Shift、Alt等組合鍵、Esc、F1等功能鍵,都只會產生擊鍵訊息

擊鍵訊息

當按下某個按鍵時,Windows把WM_KEYDOWN或WM_SYSKEYDOW訊息放入有輸入焦點的視窗的訊息佇列中
當彈起某個按鍵時,Windows同樣把WM_KEYUP或WM_SYSKEYUP訊息放入佇列中
有時會出現按住某個鍵不放的情況,此時Windows會把一系列的WM_KEYDOWN或WM_SYSKEYDOW放入佇列中,直到釋放把KEYUP放入佇列

WM_SYSKEYDOW和WM_SYSKEYUP用於系統擊鍵

系統擊鍵

系統擊鍵表示該擊鍵對於Windows系統比對於應用程式更重要,例如Alt+F、Alt+TAB等

幾乎所有會影響使用者程式的訊息都會先通過使用者視窗過程函式
如果使用者不處理且該訊息為系統擊鍵訊息,則進入DefWindowProc預設視窗過程函式處理
如果是非系統擊鍵訊息則被忽略

如果使用者自己的應用程式要處理系統擊鍵訊息,那麼使用者視窗過程函式處理後仍然可以交給DefWindowProc預設視窗過程函式來處理,當然也可以不轉交

因此使用者程式是可以遮蔽系統擊鍵訊息的,例如Alt+F4

但:Alt+Tab、Alt+Esc等訊息不會發送給視窗,它們是Windows作業系統處理的訊息,因此不會被使用者程式遮蔽

虛擬鍵碼

虛擬鍵碼儲存在WM_KEY系列訊息的wParam引數中,代表發生操作的鍵
虛擬鍵碼是相對於由硬體產生的掃描碼而言的,不同的鍵盤可能會有不同的掃描碼
但Windows接收到的是虛擬鍵碼,(應該是由驅動進行的轉換),從而遮蔽硬體之間的差異

掃描碼的原理是
—5V—
-|-|-|-|-1
-|-|-|-|-1
-|-|-|-|-0
-|-|-|-|-1
1 1 0 1

列線一端接著5V高電平,行線則不斷髮出掃描訊號:1110->1101->1011->0111
假設按下(2, 2),行線掃描到1101時,列線另一端的接收器會接收到1101(1代表高電平,0代表低電平)
此時根據掃描訊號和接收訊號就可以定位出被按下的鍵

lParam資訊

lParam資訊的32位分為6個域
0-15位為重複計數
16-23位為OEM掃描碼
24-28位為拓展標誌
29位為環境程式碼
30位為鍵的先前狀態
31位為轉換狀態

擊鍵訊息時很少用到lParam

字元訊息

字元訊息通常是由TranlateMessage將擊鍵訊息轉換而來的,分為WM_CHAR和WM_SYSCHAR
轉換過後的MSG結構體中,wParam從原來的虛擬鍵碼變為ASCII碼或Unicode碼,由註冊視窗時的函式RegisterClassA/RegisterClassW決定

C. 明日計劃
複習~
看書~
滑鼠訊息