Lập trình C Windows
Lập trình C Windows Kỹ thuật lập trình Hook (phụ lục) Nguyễn Tri Tuấn Khoa CNTT – ĐH.KHTN.Tp.HCM Email: nttuan@ fit.hcmuns.edu.vn Nội dung Lập trình kiện Giới thiệu kỹ thuật Hook Minh họa cách lập trình Hook C4W - Hook - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 Lập trình kiện C4W - Hook - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 Spring 2004 Giới thiệu kỹ thuật Hook Hook ? Mục tiêu Hook ? Các loại Hook Thủ tục Hook (Hook procedure) Chuỗi Hook (Hook chain) C4W - Hook - Nguyen Tri Tuan - DH.KHTN Tp.HCM Giới thiệu kỹ thuật Hook – Hook ? Hook chế lập trình kiện,… …cho phép ứng dụng cài đặt hàm giám sát vào q trình lưu chuyển thơng điệp Æ ứng dụng chặn xử lý thơng điệp trước đến cửa sổ/ứng dụng đích C4W - Hook - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 Giới thiệu kỹ thuật Hook – Hook ? … (tt) C4W - Hook - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 Giới thiệu kỹ thuật Hook – Hook ? … (tt) Có cách cài đặt Hook: Cài đặt cục (Thread Hook): hàm giám sát cài vào sau Thread message Queue Ỉ có tác dụng giám sát tất thông điệp tiểu trình hay ứng dụng cụ thể Cài đặt toàn cục (Global Hook): hàm giám sát cài vào sau Systemd message Queue Ỉ có tác dụng giám sát tất thơng điệp tồn hệ thống Với Global Hook, hàm cài đặt phải lưu DLL C4W - Hook - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 Giới thiệu kỹ thuật Hook – Mục tiêu Hook ? Giám sát bàn phím: ứng dụng gõ tiếng Việt, điều khiển thiết bị bàn phím,… Giám sát mouse: Click’n See Theo dõi việc sử dụng ứng dụng, Capture screen Ứng dụng dạy học máy tính (CBT – Computer-based Training) … C4W - Hook - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 Giới thiệu kỹ thuật Hook – Các loại Hook ? WH_KEYBOARD: Hook giám sát thơng điệp từ bàn phím: WM_KEYDOWN, WM_KEYUP WH_MOUSE: Hook giám sát thông điệp từ chuột WH_GETMESSAGE: Hook giám sát thông điệp chung (keyboard, mouse, hay message khác) WH_CBT: Windows gọi hàm hook CBT trước 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 sổ giao diện C4W - Hook - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 Giới thiệu kỹ thuật Hook – Các loại Hook ? (tt) WH_JOURNALPLAYBACK: cho phép đưa message vào System message queue Ỉ sử dụng để giả lập hay thực lại dãy message bàn phím hay mouse (playback) Đây Global Hook WH_JOURNALRECORD: giám sát ghi nhận lại (record) thơng điệp từ chuột bàn phím Đây Global Hook … C4W - Hook - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 10 Giới thiệu kỹ thuật Hook – Thủ tục Hook (Hook procedure) Thủ tục Hook: hàm dùng để giám sát thông điệp mà ứng dụng cài vào hệ thống Dạng chung Hook Procudure: LRESULT CALLBACK HookProc( int nCode, WPARAM wParam, LPARAM lParam); nCode: xác định hành động cần xử lý Giá trị nCode tùy thuộc loại Hook wParam, lParam: chứa thông tin message C4W - Hook - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 11 Giới thiệu kỹ thuật Hook – Thủ tục Hook…(tt) Mỗi loại Hook cần có cách xử lý khác xây dựng Hook Procedure Có thể cài đặt nhiều Hook Procedure cách dùng hàm SetWindowsHook hay SetWindowsHookEx Hook Procedure cài sau ln nằm vị trí dãy thủ tục Hook C4W - Hook - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 12 Giới thiệu kỹ thuật Hook – Chuỗi Hook (Hook chain) Chuỗi Hook: dãy thủ tục Hook liên kết theo thứ tự độ ưu tiên thực giảm dần HĐH Windows quản lý chuỗi Hook riêng biệt cho loại Hook Khi có message xảy ra, Windows gởi message đến thủ tục Hook chuỗi Hook có loại tương ứng… …message chuyển đến thủ tục Hook sau C4W - Hook - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 13 Giới thiệu kỹ thuật Hook – Chuỗi Hook…(tt) Sơ đồ Hook Chain C4W - Hook - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 14 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 Hủy bỏ cài đặt Hook C4W - Hook - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 15 Minh họa cách lập trình Hook - Các hàm thao tác với Hook SetWindowsHookEx CallNextHookEx UnhookWindowsHookEx C4W - Hook - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 16 Minh họa 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 việc Cài đặt thủ tục Hook muốn giám sát message Hàm SetWindowsHookEx cài đặt thủ tục Hook vào điểm bắt đầu chuỗi Hook HHOOK SetWindowsHookEx( int hookMsg, HOOKPROC hookProc, HINSTANCE hIns, DWORD threadId); hookMsg: loại Hook hookProc: trỏ đến thủ tục Hook Trường hợp Global Hook, thủ tục Hook phải lưu DLL; với Thread Hook, thủ tục Hook chứa thread tương ứng hIns: handle module chứa thủ tục Hook threadId: ID thread Nếu 0, Hook Global C4W - Hook - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 17 Minh họa cách lập trình Hook - Cài đặt thủ tục Hook…(tt) Ví dụ 1: cài đặt Keyboard Hook tồn cục (load-time) SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)fnKeyboardProc, hInstDLL, 0); Ví dụ 2: cài đặt Keyboard Hook toàn cục (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); Ví dụ 3: cài đặt Keyboard Hook cục SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)fnKeyboardProc, NULL, GetCurrentThread()); C4W - Hook - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 18 Minh họa 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 >= && nCode == HC_ACTION) { pMsg = (MSG *)lParam; if (pMsg->message == WM_KEYDOWN) { char s[] = {LOBYTE(wParam),’\0’}; MessageBox(NULL, s, “Hook”, 0); } } return CallNextHookEx(hHook, nCode, wParam, lParam); } C4W - Hook - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 19 Lập trình Hook - Chuyển message cho thủ tục Hook Sau thực xong, thủ tục Hook gọi hàm CallNextHookEx để chuyển message đến thủ tục Hook chuỗi Hook LRESULT CallNextHookEx( HHOOK hHook, int code, WPARAM wParam, LPARAM lParam); hHook: handle Hook (hiện hành) nhận từ hàm SetWindowsHookEx code, wParam, lParam: giá trị thủ tục Hook truyền cho thủ tục Hook chuỗi Hook C4W - Hook - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 20 10 Lập trình Hook - Chuyển message cho thủ tục Hook kế tiếp… Thủ tục Hook khơng chuyển thơng điệp đến thủ tục Hook chuỗi Hook Lưu ý: việc khơng chuyển message gây lỗi nghiêm trọng cho hệ thống C4W - Hook - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 21 Lập trình Hook - Hủy bỏ cài đặt Hook Sử dụng kỹ thuật Hook làm giảm khả thực thi hệ thống Do đó, khơng sử dụng Hook nên hủy bỏ Hook khỏi hệ thống BOOL UnhookWindowsHooks( HHOOK hHook); hHook: handle hook cần hủy bỏ C4W - Hook - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 22 11 Cám ơn - Hỏi & Đáp C4W - Hook - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 23 12 ... Thủ t? ?c Hook…(tt) Mỗi loại Hook c? ??n c? ? c? ?ch xử lý kh? ?c xây dựng Hook Procedure C? ? thể c? ?i đặt nhiều Hook Procedure c? ?ch dùng hàm SetWindowsHook hay SetWindowsHookEx Hook Procedure c? ?i sau... message kh? ?c) WH_CBT: Windows gọi hàm hook CBT trư? ?c 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 sổ giao diện C4 W -... C? ?i đặt thủ t? ?c Hook Ví dụ thủ t? ?c Hook Chuyển message cho thủ t? ?c Hook Hủy bỏ c? ?i đặt Hook C4 W - Hook - Nguyen Tri Tuan - DH.KHTN Tp.HCM Spring 2004 15 Minh họa c? ?ch lập trình Hook - C? ?c