Trang chủ
Bài viết mới
Diễn đàn
Bài mới trên hồ sơ
Hoạt động mới nhất
VIDEO
Mùa Tết
Văn Học Trẻ
Văn Học News
Media
New media
New comments
Search media
Đại Học
Đại cương
Chuyên ngành
Triết học
Kinh tế
KHXH & NV
Công nghệ thông tin
Khoa học kĩ thuật
Luận văn, tiểu luận
Phổ Thông
Lớp 12
Ngữ văn 12
Lớp 11
Ngữ văn 11
Lớp 10
Ngữ văn 10
LỚP 9
Ngữ văn 9
Lớp 8
Ngữ văn 8
Lớp 7
Ngữ văn 7
Lớp 6
Ngữ văn 6
Tiểu học
Thành viên
Thành viên trực tuyến
Bài mới trên hồ sơ
Tìm trong hồ sơ cá nhân
Credits
Transactions
Xu: 0
Đăng nhập
Đăng ký
Có gì mới?
Tìm kiếm
Tìm kiếm
Chỉ tìm trong tiêu đề
Bởi:
Hoạt động mới nhất
Đăng ký
Menu
Đăng nhập
Đăng ký
Install the app
Cài đặt
Chào mừng Bạn tham gia Diễn Đàn VNKienThuc.com -
Định hướng Forum
Kiến Thức
- HÃY TẠO CHỦ ĐỀ KIẾN THỨC HỮU ÍCH VÀ CÙNG NHAU THẢO LUẬN Kết nối:
VNK X
-
VNK groups
| Nhà Tài Trợ:
BhnongFood X
-
Bhnong groups
-
Đặt mua Bánh Bhnong
CÔNG NGHỆ
Công Nghệ Thông Tin
Thủ Thuật Tin học
Kỹ thuật hook trong window
JavaScript is disabled. For a better experience, please enable JavaScript in your browser before proceeding.
You are using an out of date browser. It may not display this or other websites correctly.
You should upgrade or use an
alternative browser
.
Trả lời chủ đề
Nội dung
<blockquote data-quote="FRIENDLYBOY" data-source="post: 101188" data-attributes="member: 134052"><p><span style="font-family: 'arial'"><strong>Hook</strong> là kỹ thuật điều khiển thông điệp (message-handling) giúp cho ứng dụng có thể cài đặt một thủ tục để điều khiển luồng thông điệp và tiến hành xử lý các thông điệp đó trước khi thông điệp đó đi tới cửa sổ đích.</span></p><p><span style="font-family: 'arial'"></span></p><p><span style="font-family: 'arial'">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.</span></p><p><span style="font-family: 'arial'"></span></p><p><span style="font-family: 'arial'">Các mô hình Hook:</span></p><p><span style="font-family: 'arial'"></span></p><p><span style="font-family: 'arial'">- Local hook: là kỹ thuật Hook dùng để bẫy sự kiện ngay trong tiến trình cài đặt.</span></p><p><span style="font-family: 'arial'"></span></p><p><span style="font-family: 'arial'">- 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 :</span></p><p><span style="font-family: 'arial'"></span></p><p><span style="font-family: 'arial'">o Thread-specific : kiểu Hook này sẽ bẫy sự kiện của một luồng cụ thể.</span></p><p><span style="font-family: 'arial'"></span></p><p><span style="font-family: 'arial'">o 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.</span></p><p><span style="font-family: 'arial'"></span></p><p><span style="font-family: 'arial'">Thành phần của Hook:</span></p><p><span style="font-family: 'arial'"></span></p><p><span style="font-family: 'arial'">- Chuỗi Hook</span></p><p><span style="font-family: 'arial'"></span></p><p><span style="font-family: 'arial'">- Thủ tục Hook</span></p><p><span style="font-family: 'arial'"></span></p><p><span style="font-family: 'arial'">- Các kiểu Hook</span></p><p><span style="font-family: 'arial'"></span></p><p><span style="font-family: 'arial'">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ỉ hê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.</span></p><p><span style="font-family: 'arial'"></span></p><p><span style="font-family: 'arial'"><strong>Chuỗi Hook</strong></span></p><p><span style="font-family: 'arial'"><strong></strong></span></p><p><span style="font-family: 'arial'">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.</span></p><p><span style="font-family: 'arial'"></span></p><p><span style="font-family: 'arial'">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.</span></p><p><span style="font-family: 'arial'"></span></p><p><span style="font-family: 'arial'"><strong>Thủ tục Hook</strong></span></p><p><span style="font-family: 'arial'"><strong></strong></span></p><p><span style="font-family: 'arial'">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 …</span></p><p><span style="font-family: 'arial'">Thủ tục hook có dạng chung như sau:</span></p><p><span style="font-family: 'arial'"></span></p><p><span style="font-family: 'arial'">Code :</span></p><p><span style="font-family: 'arial'"></span></p><p><span style="font-family: 'arial'">LRESULT CALLBACK HookProc( int nCode, WPARAM wParam, LPARAM lParam );</span></p><p><span style="font-family: 'arial'"></span></p><p><span style="font-family: 'arial'">Trong đó:</span></p><p><span style="font-family: 'arial'"></span></p><p><span style="font-family: 'arial'">- HookProc: là tên đại diện của thủ tục hook được cài đặt</span></p><p><span style="font-family: 'arial'"></span></p><p><span style="font-family: 'arial'">- 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.</span></p><p><span style="font-family: 'arial'"></span></p><p><span style="font-family: 'arial'">- 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).</span></p><p><span style="font-family: 'arial'"></span></p><p><span style="font-family: 'arial'">Để 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:</span></p><p><span style="font-family: 'arial'"></span></p><p><span style="font-family: 'arial'">- SetWindowsHookEx để cài đặt thủ tục hook vào trong chuỗi hook.</span></p><p><span style="font-family: 'arial'"></span></p><p><span style="font-family: 'arial'">- UnhookWindowsHookEx để gỡ bỏ hook khi không còn cần đến nó nữa.</span></p><p><span style="font-family: 'arial'"></span></p><p><span style="font-family: 'arial'">- 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</span></p><p><span style="font-family: 'arial'"></span></p><p><span style="font-family: 'arial'">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 đó.</span></p><p><span style="font-family: 'arial'"></span></p><p><span style="font-family: 'arial'"><strong>Các kiểu Hook</strong></span></p><p><span style="font-family: 'arial'"><strong></strong></span></p><p><span style="font-family: 'arial'">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 :</span></p><p><span style="font-family: 'arial'"></span></p><p><span style="font-family: 'arial'">Code :</span></p><p><span style="font-family: 'arial'">a. WH_CALLWNDPROC và WH_CALLWNDPROCRET Hook</span></p><p><span style="font-family: 'arial'">b. WH_CBT Hook</span></p><p><span style="font-family: 'arial'">c. WH_DEBUG Hook</span></p><p><span style="font-family: 'arial'">d. WH_FOREGROUNDIDLE Hook</span></p><p><span style="font-family: 'arial'">e. WH_GETMESSAGE Hook</span></p><p><span style="font-family: 'arial'">f. WH_JOURNALPLAYBACK Hook</span></p><p><span style="font-family: 'arial'">g. WH_JOURNALRECORD Hook</span></p><p><span style="font-family: 'arial'">h. WH_KEYBOARD_LL Hook</span></p><p><span style="font-family: 'arial'">i. WH_KEYBOARD Hook</span></p><p><span style="font-family: 'arial'">j. WH_MOUSE_LL Hook</span></p><p><span style="font-family: 'arial'">k. WH_MOUSE Hook</span></p><p><span style="font-family: 'arial'">l. WH_MSGFILTER và WH_SYSMSGFILTER Hook</span></p><p><span style="font-family: 'arial'">m. WH_SHELL Hook</span></p><p><span style="font-family: 'arial'"></span></p><p><span style="font-family: 'arial'"><strong>2. Sử dụng Hook</strong></span></p><p><span style="font-family: 'arial'"></span></p><p><span style="font-family: 'arial'">a) Cài đặt hook:</span></p><p><span style="font-family: 'arial'"></span></p><p><span style="font-family: 'arial'">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.</span></p><p><span style="font-family: 'arial'"></span></p><p><span style="font-family: 'arial'">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.</span></p><p><span style="font-family: 'arial'"></span></p><p><span style="font-family: 'arial'">Ví dụ về sử dụng thư viện liên kết động :</span></p><p><span style="font-family: 'arial'"></span></p><p><span style="font-family: 'arial'">Code :</span></p><p><span style="font-family: 'arial'"></span></p><p><span style="font-family: 'arial'">HOOKPROC lpfSetAutoProtect;</span></p><p><span style="font-family: 'arial'">static HINSTANCE hinstDLL;</span></p><p><span style="font-family: 'arial'">static HHOOK hhookysMsg; </span></p><p><span style="font-family: 'arial'">hinstDLL = LoadLibrary((LPCTSTR) "c:\\Windows\\ BrowserHook.dll");</span></p><p><span style="font-family: 'arial'">lpfSetAutoProtect= (HOOKPROC)GetProcAddress(hinstDLL, "SetAutoProtect");</span></p><p><span style="font-family: 'arial'">hhookysMsg= SetWindowsHookEx(WH_SYSMSGFILTER,</span></p><p><span style="font-family: 'arial'">lpfSetAutoProtect,hinstDLL,0);</span></p><p><span style="font-family: 'arial'"></span></p><p><span style="font-family: 'arial'">b) Giải phóng hook:</span></p><p><span style="font-family: 'arial'"></span></p><p><span style="font-family: 'arial'">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.</span></p><p><span style="font-family: 'arial'"></span></p><p><span style="font-family: 'arial'">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.</span></p><p><span style="font-family: 'arial'"></span></p><p><span style="font-family: 'arial'">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.</span></p><p><span style="font-family: 'arial'"></span></p><p><span style="font-family: 'arial'">c) Các hàm thường được sử dụng:</span></p><p><span style="font-family: 'arial'"></span></p><p><span style="font-family: 'arial'">- SetWindowsHookEx</span></p><p><span style="font-family: 'arial'"></span></p><p><span style="font-family: 'arial'">- UnhookWindowsHookEx</span></p><p><span style="font-family: 'arial'"></span></p><p><span style="font-family: 'arial'">- LoadLibrary</span></p><p><span style="font-family: 'arial'"></span></p><p><span style="font-family: 'arial'">- FreeLibrary</span></p><p><span style="font-family: 'arial'"></span></p><p><span style="font-family: 'arial'">- GetProcAddress</span></p></blockquote><p></p>
[QUOTE="FRIENDLYBOY, post: 101188, member: 134052"] [FONT=arial][B]Hook[/B] là kỹ thuật điều khiển thông điệp (message-handling) giúp cho ứng dụng có thể cài đặt một thủ tục để điều khiển luồng thông điệp và tiến hành xử lý các thông điệp đó trước khi thông điệp đó đi tới cửa sổ đích. 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. Các mô hình Hook: - 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 : o Thread-specific : kiểu Hook này sẽ bẫy sự kiện của một luồng cụ thể. o 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. Thành phần của Hook: - Chuỗi Hook - Thủ tục Hook - Các kiểu Hook 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ỉ hê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. [B]Chuỗi Hook [/B] 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. [B]Thủ tục Hook [/B] 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 đó. [B]Các kiểu Hook [/B] 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 [B]2. Sử dụng Hook[/B] a) 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. Ví dụ về sử dụng thư viện liên kết động : Code : HOOKPROC lpfSetAutoProtect; static HINSTANCE hinstDLL; static HHOOK hhookysMsg; hinstDLL = LoadLibrary((LPCTSTR) "c:\\Windows\\ BrowserHook.dll"); lpfSetAutoProtect= (HOOKPROC)GetProcAddress(hinstDLL, "SetAutoProtect"); hhookysMsg= SetWindowsHookEx(WH_SYSMSGFILTER, lpfSetAutoProtect,hinstDLL,0); b) 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. c) Các hàm thường được sử dụng: - SetWindowsHookEx - UnhookWindowsHookEx - LoadLibrary - FreeLibrary - GetProcAddress[/FONT] [/QUOTE]
Tên
Mã xác nhận
Gửi trả lời
CÔNG NGHỆ
Công Nghệ Thông Tin
Thủ Thuật Tin học
Kỹ thuật hook trong window
Top