Hook là gì? 5 điều cần biết về hook là gì?
Hook là gì là một khái niệm còn khá xa lạ và mơ hồ đối với nhiều người sử dụng máy tính hiện nay. Tuy nhiên, hook luôn xuất hiện và tham gia vào các hoạt động khi chúng ta sử dụng đến các hệ điều hành trên máy tính. Bài viết dưới đây Tenten sẽ làm rõ hơn cho bạn về khái niệm hook là gì?
Hook là gì?
Đối với hệ điều hành Windows, khi người dùng thực hiện các click chuột hay gõ phím, … thì các thông điệp sẽ được tạo thành và được đưa vào hàng đợi. Từ đó, dữ liệu được phân tích và phân chia về các bộ phận tương ứng để xử lý và thực hiện các bước tiếp theo.
Sau đó, các thông điệp được trao lại cho từng ứng dụng cụ thể để xử lý.
Hook là một thuật toán tạo ra để có thể chặn các hoạt động như thao tác chuột hay bàn phím.
Trong đó, các hàm được chia theo nhiệm vụ như dùng để chặn một loại hoạt động riêng biệt là hook procedure hay Hook function hoặc Filter Function.
Trong đó, nếu hook procedure có thể hủy một hành động mà nó nhận được
Các mô hình Hook là gì?
Có 2 mô hình hook như sau:
- Local hook: có thể sử dụng để tác động đến các sự kiện khi nó đang trong quá trình cài đặt.
- Remote hook: dùng để xử lý các trường hợp còn lại. Theo đó, remote hook lại bao gồm 2 loại hook khác:
+ Thread-specific : được sử dụng để ngăn chặn một luồng cụ thể.
+ System-wide : để sử dụng ngăn chặn các luồng mà nó đang thi hành trong hệ thống.
Để có thể tác động hay can thiệp vào một quá trình hoạt động, bạn có thể sử dụng hook. Tuy nhiên, một bất lợi đó là nó sẽ tác động trực tiếp ngay tới tốc độ của hệ thống đó.
Các hoạt động được sử dụng bởi một hàm bất kì, khi bị tác động, nó sẽ làm hệ thống chậm đi một cách đáng kể. Vì thế ta chỉ nên sử dụng hook thực sự quan trọng và cần thiết, sau đó khi đã hoàn thành cần phải kết thúc hook ngay để không làm ảnh hưởng đến cả một quá trình..
Cơ chế của hook là gì?
Hiện nay có nhiều loại hook khác nhau. Các hệ điều hành cũng thực hiện duy trì hook procedure. Và mỗi danh sách các Hook procedure này được gọi là hookchain(chuỗi hook) . Chúng là một hàm có tác dụng để trỏ đến hook procedure.
Vì thế, đối với mỗi sự kiện khác nhau, hook sẽ được tìm kiếm và lựa chọn sao cho thật sự phù hợp.
Đương nhiên, khi 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, những điều trên cũng tùy thuộc vào từng loại hook. Không phải hook nào cũng có thể thực hiện được nhiệm vụ. Chẳng hạn, khi hook procedute chỉ có thể theo dõi mà không thể thực hiện tạm ngừng chương trình được.
Vì vậy cho dù hook procedure không chuyển quyền điều khiển cho hook procedure thì hệ thống cũng sẽ tự động thực hiện
Ngoài ra, vì sử dụng hook nên hệ thống sẽ bị chia ra hoạt động
Một lời khuyên đó là bạn chỉ sử dụng hook khi thực sự cần thiết, sau đó cần loại bỏ ngay để nó không ảnh hưởng đến các hoạt động khác.
Các loại hook là gì?
Có nhiều loại hook khác nhau, tùy theo vai trò mà nó được lựa chọn để sử dụng cho phù hợp
WH_CALLWNDPROC and WH_CALLWNDPROCRET : cho phép bạn theo dõi các thông điệp gởi đến các thủ tục cửa sổ (window procedure).
WH_CBT : hệ thống gọi thủ tục hook WH_CBT
WH_DEBUG : hệ thống gọi một thủ tục hook
WH_DEBUG trước khi gọi một thủ tục hook kết hợp với bất kỳ hook khác trong hệ thống.
WH_FOREGROUNDIDLE: cho phép bạn thực hiện các tác vụ ưu tiên thấp trong thời gian tác vụ đó đang ở chế độ foreground idle.
WH_GETMESSAGE : cho phép một ứng dụng theo dõi các thông điệp trả về bởi hàm GetMessage hoặc PeekMessage.
WH_JOURNALPLAYBACK: cho phép một ứng dụng chèn thêm các thông điệp vào hàng đợi thông điệp hệ thống.
WH_JOURNALRECORD: cho phép bạn giám sát và ghi lại các sự kiện đầu vào.
WH_KEYBOARD_LL : cho phép bạn theo dõi các sự kiện bàn phím trong hàng đợi ứng dụng.
WH_KEYBOARD : một ứng dụng theo dõi lưu lượng truy cập thông điệp của thông điệp. Trong đó, WM_KEYDOWN và WM_KEYUP được trả về bởi hàm GetMessage hoặc PeekMessage.
WH_MOUSE_LL : cho phép bạn theo dõi các sự kiện chuột trong hàng đợi ứng dụng.
WH_MOUSE : cho phép bạn theo dõi các thông điệp chuột được trả về bởi hàm GetMessage hoặc PeekMessage.
WH_MSGFILTER and WH_SYSMSGFILTER : cho phép theo dõi chính các thông điệp được xử lý bởi menu, scrollbar, dialog…
WH_SHELL.
Cách cài đặt hook là gì?
Để có thể sử dụng hook, bạn cần phải cài đặt nó. Lúc này, bạn cần tiến hành gọi hàm SetWindowsHookEx và chỉ ra kiểu hook đang gọi thủ tục.
Việc cài đặt này có thể được thực hiện trên mọi tiến trình của hệ thống
Ngoài ra, hook toàn cục phải đặt trong thư viện liên kết động mới có thể được sử dụng.
Cách để loại bỏ hook là gì?
Bạn có thể sử hàm UnhookWindowsHookEx để có thể tiến hành loại bỏ hook khi không cần thiết hay đã hoàn thành xong.
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 hàm system-wide hook thì no sẽ không có tác dụng trong việc gỡ cài đặt và trả tự do cho hàm DLL.
Do đó, khi đã sử dụng hàm hook đối với DLL thì sẽ không có cách nào để giải phóng được. 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.
Vì thế, bạn cần phải xây dựng và cài đặt ngay trong thư viện DLL để từ đó liên kết tới DLL bằng ứng dụng có thể cài đặt được hook. Cùng với đó, 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.
Hook là gì cùng với các chức năng của nó đã được làm rõ qua bài viết trên, Việc sử dụng hook khi cần thiết sẽ đạt được một số hiệu quả nhất định. Tuy nhiên, việc sử dụng nó cần được loại bỏ ngay khi vấn đề đã được xử lý vì nó tác động làm giảm đến tốc độ. Vì thế, bạn thực sự nên cân nhắc kỹ càng trước khi áp dụng hook vào trong chương trình của mình.
Các tìm kiếm liên quan đến chủ đề “Hook là gì”
Hook C# Hook game la gì Hook là gì trong lập trình Hooking C++ hook dll C# hook keyboard Hook dll
Bài viết liên quan
04 Nguyên nhân website wordpress lỗi trắng trang
Website bị cảnh báo chứa phần mềm độc hại, xử lý nhanh chóng với 2 bước
8 bước thiết kế website doanh nghiệp