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
Giới thiệu
Hook là gì ? • Hook là một cơ chế trong lập tr ình sự kiện,… • …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
Hook là gì ?
3
Giới thiệu
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, hàm cài đặt phải được lưu trong một DLL
Giới thiệu
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, điều khiể khiển thiế thiết bị bị bằng bà bàn phí phím,… m,… • Giám sát mouse: Click’n See • Theo dõi việc sử dụng các ứng dụng, Capture screen • Ứng dụng dạy học bằng máy tính (CBT – Computer based Training) • …
4
Giới thiệu
Các loại Hook • WH_KEYBOARD: Hook giá giám sá sát thông điệ điệp từ từ bàn phí phím: WM_KEYDOWN, WM_KEYUP • WH_MOUSE: Hook giá giám sá sát thông điệ điệp từ từ chuộ chuột • WH_GETMESSAGE: Hook giám sát thông điệp chung (keyboard, mouse, hay các message khác) • WH_CBT: Windows gọi hàm hook CBT tr ước khi tạo lập (create), kích hoạt (active), hủy (destroy), minimize, maximize, di chuyển (move), thay đổi kích thước (size),… của cửa sổ giao diện
Giới thiệu
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. Đây là một Global Hook • …
5
Giới thiệu
Thủ tục Hook • Thủ Thủ tục Hook (hook procedure): là là hàm dù dùng để để giá giám sá sát các thông điệ điệp mà mà ứng dụ dụng cà cài và vào hệ hệ thố thống • Dạng chung củ của Hook Procudure: LRESULT CALLBACK HookProc( int nCode, WPARAM wParam, LPARAM lParam); – nCode: xác định hành động cần xử lý. Giá tr ị của nCode tùy thuộc loại Hook – wParam, lParam: chứa thông tin của message
Giới thiệu
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. • 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
Giới thiệu
Chuỗi Hook • Chuỗi Hook (hook chain): là một dãy các thủ tục Hook được liên kết theo thứ tự độ ưu tiên thực hiện giảm dần • Hệ điề điều hà hành Windows quả quản lý cá các chuỗ chuỗi Hook riêng biệ biệt cho từng loại Hook • Khi có 1 thông điệp xảy ra, Windows sẽ gởi thông điệp đó đến thủ thủ tục Hook đầ đầu tiên trong chuỗ chuỗi Hook có có loạ loại tương ứng. Thông điệp sẽ được chuyển lần lượt đến các thủ tục Hook kế tiếp sau đó
Giới thiệu
Chuỗi Hook
Sơ đồ đồ Hook Chain
7
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
Các hàm thao tác với Hook • SetWindowsHookEx • CallNextHookEx • UnhookWindowsHookEx
8
Cách lập tr ình Hook
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
Cài đặt thủ tục Hook HHOOK SetWindowsHookEx( int hookMsg , HOOKPROC hookProc, HINSTANCE hIns, DWORD threadId); – hookMsg: loại
Hook – hookProc: con tr ỏ đến thủ tục Hook. Tr ường hợp Global Hook, thủ tục Hook phải lưu trong DLL; với Thread 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. Nếu là 0, Hook sẽ là Global
9
Cách lập tr ình Hook
Ví dụ cài đặt Hook V í d -time) ụ 1: cà cài đ ặt Keyboard Hook toà toàn cục (load SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)fnKeyboardProc, hInstDLL, 0); ụ 2: cà V í d cài đ ặt Keyboard Hook toà toàn cục (run(run-time) HOOKPROC fnKeyboardProc; static HINSTANCE hInstDLL; static HHOOK hHook; hInstDLL = LoadLibrary((LPCTSTR) “myKBDLL.dll"); fnKeyboardProc = (HOOKPROC)GetProcAddress(hInstDLL, “KeyboardProc"); hHook = SetWindowsHookEx(WH_KEYBOARD, fnKeyboardProc, hInstDLL, 0); ụ 3: cà V í d cài đ ặt Keyboard Hook cục bộ SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)fnKeyboardProc, NULL, GetCurrentThreadId());
Cách lập tr ình Hook
Ví dụ thủ tục Hook V í d ụ 4: Thủ tục hook cho Keyboard LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) { if (nCode >= 0 && nCode == HC_ACTION) { pMsg = (MSG *)lParam; if (pMsg(pMsg->message == WM_KEYDOWN) { char s[] = {LOBYTE(wParam),’ {LOBYTE(wParam),’\0’}; MessageBox(NULL, s, “Hook” Hook”, 0); } } return CallNextHookEx(hHook, nCode,wParam, lParam); }
10
Cách lập tr ình Hook
Chuyển đến thủ tục Hook kế tiếp • Sau khi thực hiện xong, thủ tục Hook sẽ gọi hàm CallNextHookEx để chuyển message đến thủ tục Hook kế tiế tiếp trong chuỗ chuỗi Hook LRESULT CallNextHookEx( HHOOK hHook, int code, WPARAM wParam, LPARAM lParam); – hHook: handle của Hook SetWindowsHookEx
(hiện hành) nhận về từ hàm
– code, wParam, 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
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
Cách lập tr ình Hook
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 đó, khi không sử dụng Hook nữa nên hủy bỏ Hook khỏi hệ thống BOOL UnhookWindowsHooks( HHOOK hHook); – hHook:
handle của hook cần hủy bỏ
HẾT – CẢM ƠN GIẢI ĐÁP THẮC MẮC
12