Tải bản đầy đủ (.docx) (7 trang)

cơ chế hook trong windows

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (98.75 KB, 7 trang )

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI
VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG
─────── * ───────

BÀI TẬP LỚN
MÔN: HỆ ĐIỀU HÀNH

ĐỀ TÀI: TÌM HIỂU CƠ CHẾ HOOK TRONG
WINDOWS

Giáo viên hướng dẫn :
Sinh viên thực hiện :
Lớp

Hà Nội, tháng 11 năm 2017


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



Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×