[123doc] - co-che-hook-trong-windows PDF

Title [123doc] - co-che-hook-trong-windows
Author Toàn Khánh
Course Wireshark lab
Institution Đại học Đà Nẵng
Pages 7
File Size 68.4 KB
File Type PDF
Total Downloads 46
Total Views 169

Summary

Download [123doc] - co-che-hook-trong-windows PDF


Description

MỤC LỤC

LỜI NÓI ĐẦU Trong thời buổi công nghệ hiện nay, việc sử dụng máy tính đã được phổ cập trên toàn thế giới. Khả năng của máy tính có thể làm được vượt xa so với con người về khả năng xử lí các số liệu, giúp cho nhân loại đạt được những thành tựu vượt trội mà trước khi máy tính xuất hiện con người không thể làm được. Vì vậy, việc hiểu rõ được các tính năng của máy tính giúp người dùng có thể khai thác hết được công năng và sử dụng máy tính một cách hiệu quả hơn. Cấu tạo của chiếc máy tính ngày càng được tối ưu hóa hơn. Từ những chiếc máy tính đầu tiên chỉ xử lí được những thao tác cơ bản và kích thước cồng kềnh cho đến những chiếc máy tính cá nhân nhỏ gọn cũng như các siêu máy tính có thể xử lí cho những hệ thống máy tính lớn. Tốc độ phát triển của máy tính ngày càng nhanh để đáp ứng những nhu cầu khám phá của con người. Các tính năng của máy tính ngày càng được tối ưu hóa và hiệu năng tốt hơn. Trong bài báo cáo này, chúng tôi đề cập đến một cơ chế quan trọng trong windows. Đó chính là cơ chế Hook. Hook là một trong những cơ chế quan trọng của window, nó được ứng dụng nhiều vào những vấn đề thiết thực khác nhau. Một trong những ứng dụng phổ biến nhất mà mỗi người Việt chúng ta đều biết đến đó chính là những bộ gõ văn bản Tiếng Việt ví dụ như vietkey, unikey, …

CHƯƠNG 1: HOOK LÀ GÌ? Trước khi tìm hiểu về Hook, chúng ta nhặc lại một chút về quá trình xử lý thông điệp của hệ điều hành Windows. Quá trình xử lý thông điệp của Windows diễn ra như sau: Đầu tiên từ các hành động của người dùng như là click chuột, nhấn phím,… thì hệ điều hành sẽ chuyển các hành động tương ứng thành các thông điệp (message). Rồi sau đó Windows đẩy các message này vào hàng đợi của hệ thống (system queue) và từ system queue các message được chuyển vào hàng đợi của ứng dụng (application queue). Từ lúc này các ứng dụng sẽ lấy các message này trong hàng đợi ứng dụng của mình để xử lý (thông qua các vòng lặp chờ thông điệp – message loop).

1.1: Hook là gì? Hook là cơ chế mà nhờ đó một hàm có thể chặn sự kiện (message, mouse actions, keystrokes) trước khi chúng được gửi đến hàng đợi của ứng dụng. Các hàm này có thể thực hiện một số thao tác trên sự kiện, và trong một vài trường hợp có thể định nghĩa lại hoặc hủy bỏ sự kiện mà nó chặn được. Một điểm quan trọng cần lưu ý là các hàm này được gọi bởi chính Windows chứ không phải bởi ứng dụng của chúng ta.

Windows hỗ trợ nhiều loại Hook khác nhau, mỗi loại nhắm đến việc chặn bắt một loại thông điệp cụ thể nào đó. Ví dụ, một ứng dụng có thể sử dụng WH_KEYBOARD để giám sát sự di chuyển của thông điệp bàn phím trong hệ thống. Nhờ loại Hook này mà một chương trình có thể can thiệp vào và tạo ra khả năng gõ tiếng Việt khi soạn thảo văn bản. Một loại Hook khác là WH_MOUSE cho phép theo dõi các thông điệp liên quan đến hoạt động của con chuột. Hook có thể xem là tính năng mạnh mẽ nhất của Windows, nó cho phép ta đặt bẫy đối với các sự kiện. Bằng cách sử dụng Hook, ta có thể điều hướng ứng dụng tới một thủ tục mới bất kể khi nào mà sự kiện được quan tâm xuất hiện và bất kể sự kiện đó thuộc tiến trình của bạn hay thuộc tiến trình khác.

1.2: Các mô hình Hook. Có 2 kiểu mô hình Hook là: - Local Hook: là kỹ thuật Hook dùng để bẫy sự kiện ngay trong tiến trình cài đặt. - Remote Hook: là kỹ thuật Hook cho phép bẫy các sự kiện thuộc tiến trình của ứng dụng khác. Trong mô hình này lại tồn tại hai kiểu Hook khác: Thread-specific : kiểu Hook này sẽ bẫy sự kiện của một luồng cụ thể. System-wide : bẫy sự kiện của tất cả các luồng trong tất cả các tiến trình đang thi hành trong hệ thống. Hook là một kỹ thuật xử lý thông điệp rất mạnh cho phép chúng ta can thiệp sâu vào các tiến trình khác nhau, nhưng nó làm ảnh hưởng tới tốc độ của hệ thống, nhất là Hook system-wide, vì tất cả các sự kiện của hệ thống sẽ được định hướng tới một hàm nào đó, rõ ràng điều này làm hệ thống chậm đi đáng kể. Vì thế ta chỉ nên Hook những thông điệp thật cần thiết và kết thúc việc Hook ngay khi không dùng đến nữa.

1.3: Thành phần của Hook. 1.3.1: Chuỗi Hook. Hệ thống có khả năng hỗ trợ nhiều kiểu hook khác nhau, mỗi kiểu lại được quy định một cách thức truy nhập khác nhau trong kỹ thuật điều khiển thông điệp. Do vậy, hệ thống duy trì một chuỗi các hook cho mỗi một kiểu hook khác nhau. Một chuỗi hook là một danh sách các con trỏ đặc biệt, nó được trỏ tới các hàm CallBack gọi là hook procedure (thủ tục hook). Như vậy khi một sự kiện xuất hiện, hệ thống sẽ chuyển sự kiện đó tới các thủ tục hook được tham chiếu bới chuỗi hook theo thứ tự lần lượt. Vì thế phải thực hiện xong thủ tục này mới được gọi thủ tục kế tiếp. 1.3.2: Thủ tục Hook. Thủ tục hook sẽ là nơi thực hiện các thao tác sau khi bắt được một sự kiện mong muốn. Các thủ tục hook phụ thuộc vào các kiểu hook khác nhau mà có cấu trúc, chức năng khác nhau. Có thủ tục chỉ có thể điều khiển thông điệp, một số khác có thể sửa đổi thông điệp, dừng tiến trình của thông điệp, ngăn cản thực hiện hook tiếp theo hoặc đưa tới cửa sổ cuối cùng … Thủ tục hook có dạng chung như sau: Code : LRESULT CALLBACK HookProc( int nCode, WPARAM wParam, LPARAM lParam ); Trong đó: - HookProc: là tên đại diện của thủ tục hook được cài đặt.

- nCode : Đây là mã hook, nó quyết định toàn bộ hoạt động của thủ tục hook, mã hook phụ thuộc vào kiểu hook và mỗi kiểu hook được gán cho một ký tự để thiết lập mã hook. - wParam, lParam: Hai tham số này chứa các thông tin về thông điệp được hook và nó phụ thuộc vào mã hook (nCode). Để dễ dàng sử dụng hook, Windows cung cấp một giao diện API cho các lập trình viên với các hàm sau: - SetWindowsHookEx để cài đặt thủ tục hook vào trong chuỗi hook. - UnhookWindowsHookEx để gỡ bỏ hook khi không còn cần đến nó nữa. - CallNextHookEx: Thủ tục hook sẽ quyết định có hay không đi tới các thủ tục tiếp theo trong chuỗi hook, để từ một thủ tục đưa tới các thủ tục tiếp theo, ta sử dụng hàm CallNextHookEx. Chú ý rằng, với thủ tục hook nếu chỉ xử lý các hook xảy ra trong tiến trình đơn thì không cần cài đặt thủ tục hook trong thư viện liên kết động (DLL). Tuy nhiên, với thủ tục hook xử lý sự kiện của tất cả các tiến trình thì bắt buộc phải cài đặt hook trong thư viện liên kết động (DLL) để tất cả các tiến trình có thể sử dụng thủ tục trong thư viện đó. 1.3.3: Kiểu Hook. Mỗi một kiểu Hook cho phép ứng dụng điều khiển thông điệp theo những cách khác nhau trong kỹ thuật điều khiển thông điệp (message-handling mechanism). Dưới đây là những kiểu hook khác nhau : Code : a. WH_CALLWNDPROC và WH_CALLWNDPROCRET Hook b. WH_CBT Hook c. WH_DEBUG Hook d. WH_FOREGROUNDIDLE Hook e. WH_GETMESSAGE Hook f. WH_JOURNALPLAYBACK Hook g. WH_JOURNALRECORD Hook h. WH_KEYBOARD_LL Hook i. WH_KEYBOARD Hook j. WH_MOUSE_LL Hook k. WH_MOUSE Hook l. WH_MSGFILTER và WH_SYSMSGFILTER Hook m. WH_SHELL Hook

CHƯƠNG 2: CƠ CHẾ, PHẠM VI VÀ CÀI ĐẶT HOOK 2.1: Cơ chế hoạt động của Hook. Hook procedure là một loại callback function (hàm hồi quy). Hệ thống sẽ gọi các hàm này khi các sự kiện, thông điệp tương ứng với loại hook. Mỗi loại hook có một hook procedure khác nhau nhưng đều có cùng tham số như cú pháp bên dưới. Với mỗi hook procedure khác nhau thì việc xét các giá trị tham số cũng khác nhau.

Như đã nói ở trên, có nhiều loại hook (như chuột, bàn phím) và hệ điều hành luôn duy trì một danh sách các hook procedure cho mỗi loại đó. Mỗi danh sách các Hook procedure này được gọi là hook chain. Bản chất của hook chain là một dãy các con trỏ hàm trỏ đến các Hook procedure. Khi hệ thống thực một sự kiện nào đó, nó sẽ tìm kiếm trong hook chain tương ứng với sự kiện đó. Nếu một hook procedure phù hợp được tìm thấy, hệ thống sẽ thực hiện nó và chỉ lấy lại quyền điều khiển sau khi hook chain kết thúc. Vì thế khi một hook procedure thực hiện xong, nó phải thực hiện việc chuyển quyền điều khiển cho hook procedure kế tiếp trong hook chain. Tuy nhiên cơ chế này còn tùy thuộc vào loại hook. Như một số loại hook chỉ có thể theo dõi các thông điệp, vì vậy cho dù hook procedure có chuyển quyền điều khiển cho hook procedure kế tiếp hay không, hệ thống vẫn sẽ tự động làm việc này.

2.2: Phạm vi của Hook. Dựa theo lọai hook bạn có thể cài đặt hook procedure có phạm vi cục bộ (local hook/thread hook) hoặc toàn cục (global hook). Tất cả các loại hook đểu có thể được cài đặt để trở thành global hook, một số cho phép chọn lựa phạm vi hook dựa vào các tham số trong hàm cài đặt (SetWindowsHookEx). Phân biệt đặc điểm của hai loại hook này (theo phạm vi ảnh hưởng): – Local hook (thread hook): chỉ có ảnh hưởng trong phạm vi một thread. – Global hook: có ảnh hưởng trong toàn hệ thống. Trường hợp này, hook procedure phải được chứa trong một thư viện DLL.

2.3: Cài đặt Hook. 2.3.1: Cài đặt Hook Ta có thể cài đặt thủ tục hook vào chuỗi hook bằng việc gọi hàm SetWindowsHookEx và chỉ ra kiểu hook đang gọi thủ tục, việc cài đặt hook có thể thực hiện trên mọi tiến trình trong hệ thống. Nếu sử dụng hook toàn cục thì phải đặt trong thư viện liên kết động (DLL). Ứng dụng muốn sử dụng thư viện liên kết động phải lấy được handle của thư viện đó. Để nhận Handle của thư viện liên kết động ta có thể sử dụng hàm LoadLibrary với tham số là tên của thư viện. Sau khi có được Handle của DLL, ta sẽ lấy địa chỉ của thủ tục hook trong thư viện liên kết động thông qua hàm GetProcAddress. Sau khi đã có thủ tục hook, sử dụng hàm SetWindowsHookEx để cài đặt thủ tục hook vào trong chuỗi hook. 2.3.2: Giải phóng Hook. Như đã nói thì hook nên được bỏ đi nếu như không cần thiết nữa bằng cách sử dụng hàm UnhookWindowsHookEx. Với thread-specific hook, việc sử dụng hàm UnhookWindowsHookEx sẽ giải phóng thủ tục hook. Tuy nhiên với hook toàn tục (system-wide hook) thì hàm này không thể trả tự do cho hàm DLL. Việc gọi hàm LoadLibrary sẽ gọi trong ngữ cảnh của tất cả các tiến trình, tuy nhiên hàm FreeLibrary thì không thể thực hiện với các tiến trình khác. Vì vậy, không có cách nào để giải phóng DLL. Hệ thống chỉ có thể giải phóng DLL khi tất cả các tiến trình liên kết tới DLL đó phải kết thúc hoặc gọi FreeLibrary.

Giải pháp đặt ra cho vấn đề này là xây dựng hàm cài đặt ngay trong thư viện DLL. Bằng việc liên kết tới DLL, ứng dụng có thể cài đặt hook. Và ngay trong DLL cũng phải có hàm giải phóng hook để giải phóng khi không cần đến nữa. –

CHƯƠNG 3: KHẢ NĂNG VÀ ỨNG DỤNG CỦA HOOK 3.1: Khả năng của Hook. Hook cung cấp các khả năng mạnh cho các ứng dụng chạy trên nền Windows, các ứng dụng này có thể dùng hook để : Xử lý hoặc định nghĩa tất cả các thông điệp cho dialog box, message box, scroll bar, hoặc menu của một ứng dụng. (Sử dụng hook WH_MSGFILTER). Xử lý hoặc định nghĩa tất cả các thông điệp cho dialog box, message box, scroll bar, hoặc menu của hệ thống. (Sử dụng hook WH_SYSMSGFILTER). Xử lý hoặc định nghĩa tất cả các thông điệp (bất chấp là thông điệp gì) của hệ thống mỗi khi GetMessage hoặc PeekMessage được gọi. (Sử dụng hookWH_GETMESSAGE). Xử lý hoặc định nghĩa tất cả các thông điệp (bất chấp là thông điệp gì) của hệ thống mỗi khi SendMessage được gọi. (Sử dụng hook WH_CALLWNDPROC). Thu (Record) và phát lại (Playback) các sự kiện keyboard và mouse . (Sử dụng hook WH_JOURNALRECORD, WH_JOURNALPLAYBACK). Xử lý , định nghĩa hoặc hủy bỏ tất cả các sự kiện bàn phím.(Sử dụng hookWH_KEYBOARD). Xử lý , định nghĩa hoặc hủy bỏ tất cả các sự kiện chuột (Sử dụng hookWH_MOUSE). Tận dụng các khả năng trên, các ứng dụng có thể sử dụng hook để : - Cung cấp phím trợ giúp F1 hỗ trợ menu, dialog box và message box (Sử dụng hook WH_MSGFILTER). - Cung cấp các tính năng thu và phát các sự kiện mouse và keyboard, thường được gọi là các macro. (Sử dụng hook WH_JOURNALRECORD, WH_JOURNALPLAYBACK). - Theo dõi các thông điệp để biết được thông điệp nào được gởi đến cửa sổ nào cũng như các hành động nào sẽ làm phát sinh thông điệp tương ứng. (Sử dụng hookWH_GETMESSAGE & WH_CALLWNDPROC). Chương trình Spy trong bộ Win32™ SDK của Windows NT đã rất thành công trong việc sử dụng hook để thực hiện tác vụ này. Giả lặp các tác vụ input của keyboard và mouse (Sử dụng hookWH_JOURNALPLAYBACK). Chỉ có hook mới có thể cho ta một phương pháp chắc chắn và tin cậy để thực hiện điều này. Nếu ta tiếp cận theo cách khác, gởi message chẳng hạn, Windows sẽ không cập nhật trạng thái của mouse cũng như keyboard, và điều này sẽ dẫn đến những hành động không mong muốn. Còn nếu như hook được sử dụng, các sự kiện sẽ được xử lý y hệt như sự kiện vật lý.

3.2: Ứng dụng của Hook. – Cho phép tạo ra các chương trình hỗ trợ gõ tiếng Việt như : Vietkey, Unikey… – Cho phép tạo ra các chương trình Test tự động phần mềm (bằng cách phát sinh các sự kiện phím, chuột giống như người dùng đang nhập vào). – Cho phép thay đổi giao diện các ứng dụng đang chạy.

– Cho phép xem phần trợ giúp của các ứng dụng bằng việc nhấn một phím nào đó, ví dụ như nhấn F1 chẳng hạn. – Và nhiều ứng dụng quan trọng khác.

CHƯƠNG 4: KẾT LUẬN...


Similar Free PDFs