You are on page 1of 12

Lập trình trên môi trường Windows

KỸ THUẬT LẬP TRÌNH HOOK

Nội dung
• Lập trình sự kiện • Giới thiệu kỹ thuật Hook • Minh họa cách lập trình Hook

1

Lập trình sự kiện Giới thiệu kỹ thuật lập trình Hook • Hook là gì ? • Mục tiêu của Hook ? • Các loại Hook • Thủ tục Hook (Hook procedure) • Chuỗi Hook (Hook chain) 2 .

… • …cho phép ứng dụng có thể cài đặt một hàm giám sát vào quá trình lưu chuyển các thông điệp ứng dụng có thể chặn và xử lý các thông điệp trước khi nó đến được cửa sổ/ứng dụng đích Giới thiệu Giớ thiệ Hook là gì ? 3 .Giới thiệu Giớ thiệ Hook là gì ? • Hook là một cơ chế trong lập trình sự kiện.

điều Giá sá bà phí cá dụ tiế Việ điề khiển thiết bị bằng bàn phím.… • Giám sát mouse: Click’n See Giá sá Click’ • Theo dõi việc sử dụng các ứng dụng.… khiể thiế bị bà phí m. Capture screen việ sử cá dụ • Ứng dụng dạy học bằng máy tính (CBT – Computerdụ dạ họ bằ má tí Computerbased Training) • … 4 . hàm cài đặt phải được lưu trong một DLL Giới thiệu Giớ thiệ Mục tiêu của Hook • Giám sát bàn phím: các ứng dụng gõ tiếng Việt.Giới thiệu Giớ thiệ Hook là gì ? • Có 2 cách cài đặt Hook: – Cài đặt cục bộ (Thread Hook): hàm giám sát được cài vào sau Thread message queue có tác dụng giám sát tất cả các thông điệp trong một tiểu trình hay một ứng dụng cụ thể – Cài đặt toàn cục (Global Hook): hàm giám sát được cài vào sau System message queue có tác dụng giám sát tất cả các thông điệp trong toàn hệ thống • Với Global Hook.

hay các message khác) cá khá • WH_CBT: Windows gọi hàm hook CBT trước khi tạo lập gọ hà trướ tạ lậ (create).… của cửa sổ giao diện cử sổ diệ Giới thiệu Giớ thiệ Các loại Hook • WH_JOURNALPLAYBACK: cho phép đưa message vào System message queue sử dụng để giả lập hay thực hiện lại 1 dãy các message của bàn phím hay mouse (playback). Đây là một Global Hook • WH_JOURNALRECORD: giám sát và ghi nhận lại các thông điệp từ chuột và bàn phím.Giới thiệu Giớ thiệ Các loại Hook • WH_KEYBOARD: Hook giám sát thông điệp từ bàn phím: giá sá điệ từ phí WM_KEYDOWN. Đây là một Global Hook • … 5 . kích hoạt (active). thay đổi kích thước (size). kí hoạ hủ maximize. mouse. di chuyển (move). hủy (destroy). WM_KEYUP • WH_MOUSE: Hook giám sát thông điệp từ chuột giá sá điệ từ chuộ • WH_GETMESSAGE: Hook giám sát thông điệp chung giá sá điệ (keyboard. minimize. thay đổ kí thướ (size).… chuyể (move).

Giới thiệu Giớ thiệ Thủ tục Hook • Thủ tục Hook (hook procedure): là hàm dùng để giám sát Thủ là dù để giá sá các thông điệp mà ứng dụng cài vào hệ thống điệ mà dụ cà và hệ thố • Dạng chung của Hook Procudure: củ LRESULT CALLBACK HookProc( HookProc( int nCode. lParam: chứa thông tin của message Giới thiệu Giớ thiệ Thủ tục Hook • Mỗi loại Hook cần có cách xử lý khác nhau khi xây dựng thủ tục Hook. Giá trị của nCode tùy thuộc loại Hook – wParam. lParam). WPARAM wParam. • Có thể cài đặt nhiều thủ tục Hook bằng cách dùng hàm SetWindowsHook hay SetWindowsHookEx • Thủ tục Hook cài đặt sau sẽ luôn nằm ở vị trí đầu tiên trong dãy thủ tục Hook 6 . wParam. nCode. – nCode: xác định hành động cần xử lý. LPARAM lParam).

Thông điệp sẽ được chuyển lần lượt đến các thủ tục Thông điệ sẽ đượ chuyể lầ lượ đế cá thủ Hook kế tiếp sau đó kế tiế đó Giới thiệu Giớ thiệ Chuỗi Hook Sơ đồ Hook Chain đồ 7 .Giới thiệu Giớ thiệ Chuỗi Hook • Chuỗi Hook (hook chain): là một dãy các thủ tục Hook Chuỗ là cá thủ được liên kết theo thứ tự độ ưu tiên thực hiện giảm dần đượ kế thứ độ thự hiệ giả dầ • Hệ điều hành Windows quản lý các chuỗi Hook riêng biệt điề hà quả cá chuỗ biệ cho từng loại Hook ừ loạ t • Khi có 1 thông điệp xảy ra. Windows sẽ gởi thông điệp đó có điệ xả sẽ điệ đó đến thủ tục Hook đầu tiên trong chuỗi Hook có loại tương thủ đầ chuỗ có loạ ứng.

Minh họa cách lập trình Hook • Các hàm thao tác với Hook • Cài đặt thủ tục Hook • Ví dụ thủ tục Hook • Chuyển message cho thủ tục Hook kế tiếp • Hủy bỏ cài đặt Hook Cách lập trình Hook lậ trì Các hàm thao tác với Hook • SetWindowsHookEx • CallNextHookEx • UnhookWindowsHookEx 8 .

HOOKPROC hookProc.Cách lập trình Hook lậ trì Cài đặt thủ tục Hook • Một ứng dụng cần phải thực hiện việc Cài đặt thủ tục Hook khi muốn giám sát thông điệp • Hàm SetWindowsHookEx sẽ cài đặt thủ tục Hook vào điểm bắt đầu của chuỗi Hook Cách lập trình Hook lậ trì Cài đặt thủ tục Hook HHOOK SetWindowsHookEx( int hookMsg. DWORD threadId). HINSTANCE hIns. – hookMsg: loại Hook – hookProc: con trỏ đến thủ tục Hook. thủ tục Hook có thể chứa trong chính thread tương ứng – hIns: handle của module chứa thủ tục Hook – threadId: ID của thread. thủ tục Hook phải lưu trong DLL. Nếu là 0. với Thread Hook. Hook sẽ là Global 9 . Trường hợp Global Hook.

if (pMsg->message == WM_KEYDOWN) { (pMsgchar s[] = {LOBYTE(wParam). “KeyboardProc").dll"). static HHOOK hHook. hHook = SetWindowsHookEx(WH_KEYBOARD.’ MessageBox(NULL. Ví dụ 3: cài đặt Keyboard Hook cục bộ cà đặ cụ bộ SetWindowsHookEx(WH_KEYBOARD.’\0’}. nCode. hInstDLL = LoadLibrary((LPCTSTR) “myKBDLL. s. hInstDLL. 0). 0). {LOBYTE(wParam). 0). fnKeyboardProc. fnKeyboardProc = (HOOKPROC)GetProcAddress(hInstDLL. WPARAM wParam. Hook” } } return CallNextHookEx(hHook. Ví dụ 2: cài đặt Keyboard Hook toàn cục (run-time) cà đặ toà cụ (runHOOKPROC fnKeyboardProc. LPARAM lParam) { if (nCode >= 0 && nCode == HC_ACTION) { pMsg = (MSG *)lParam. (HOOKPROC)fnKeyboardProc. (HOOKPROC)fnKeyboardProc. “Hook”.wParam. hInstDLL.Cách lập trình Hook lậ trì Ví dụ cài đặt Hook Ví dụ 1: cài đặt Keyboard Hook toàn cục (load-time) cà đặ toà cụ (loadSetWindowsHookEx(WH_KEYBOARD. NULL. static HINSTANCE hInstDLL. } 10 . GetCurrentThreadId()). lParam). Cách lập trình Hook lậ trì Ví dụ thủ tục Hook Ví dụ 4: Thủ tục hook cho Keyboard Thủ LRESULT CALLBACK KeyboardProc(int nCode.

int code. thủ tục Hook sẽ gọi hàm thự hiệ thủ sẽ hà CallNextHookEx để chuyển message đến thủ tục Hook chuyể đế thủ kế tiếp trong chuỗi Hook tiế chuỗ LRESULT CallNextHookEx( CallNextHookEx( HHOOK hHook. hHook. – hHook: handle của Hook (hiện hành) nhận về từ hàm SetWindowsHookEx – code. LPARAM lParam). lParam: các giá trị của thủ tục Hook hiện tại truyền cho thủ tục Hook kế tiếp trong chuỗi Hook Cách lập trình Hook lậ trì Chuyển đến thủ tục Hook kế tiếp • Thủ tục Hook có thể không chuyển thông điệp đến thủ tục Hook kế tiếp trong chuỗi Hook • Lưu ý: việc không chuyển thông điệp có thể gây ra lỗi nghiêm trọng cho hệ thống 11 . wParam. lParam). wParam. WPARAM wParam. code.Cách lập trình Hook lậ trì Chuyển đến thủ tục Hook kế tiếp • Sau khi thực hiện xong.

– hHook: handle của hook cần hủy bỏ HẾT – CẢM ƠN GIẢI ĐÁP THẮC MẮC 12 . khi không sử dụng Hook nữa nên hủy bỏ Hook khỏi hệ thống BOOL UnhookWindowsHooks( HHOOK hHook).Cách lập trình Hook lậ trì Hủy bỏ cài đặt Hook • Sử dụng kỹ thuật Hook sẽ làm giảm khả năng thực thi của hệ thống • Do đó.