intTypePromotion=1
zunia.vn Tuyển sinh 2024 dành cho Gen-Z zunia.vn zunia.vn
ADSENSE

Đồ án hệ điều hành: Phần mềm keylog sử dụng Hook windows

Chia sẻ: Hoàng An | Ngày: | Loại File: PDF | Số trang:60

351
lượt xem
77
download
 
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Khi mà thị trường windows chiếm hơn 90% trên thế giới thì việc được nghiên cứu về một tính năng quan trọng, cơ bản nhất của windows làm chúng em rất hứng thú. Hơn nữa việc thực hiện đ ề tài giúp chúng em biết rõ hơn về một kỹ thuật phần mềm gián điệp, ăn cắp thông tin để biết cách phòng tránh.

Chủ đề:
Lưu

Nội dung Text: Đồ án hệ điều hành: Phần mềm keylog sử dụng Hook windows

  1. TRƯỜNG ĐẠI HỌC BÁCH KHOA KHOA CÔNG NGHỆ THÔNG TIN BỘ MÔN MẠNG VÀ TRUYỀN THÔNG    ĐỒ ÁN HỆ ĐIỀU HÀNH Đề tài: PHẦN MỀM KEYLOGER SỬ DỤNG HOOK WINDOWS Sinh viên : Nguyễn Quan Nhật Nguyễn Quốc Mỹ Lớp : 08T4 Cán b ộ hướng d ẫn : Huỳnh Cô ng Pháp Đà Nẵng 201 1
  2. Bộ môn Mạ ng và Truy ền Thông 2 Nguyễ n Quang Nhật – Nguyễ n Quố c Mỹ
  3. KeyLogger-Sử dụng Hook Windows 3 MỤC LỤC TỔNG QUAN VỀ ĐỀ TÀI.................................................................................................. 5 Chương 1. CƠ SỞ L Ý THUYẾ T......................................................................................... 6 I. Giới thiệu........................................................................................................................ 6 II. Thông Điệp và HÀNG ĐỢ I THÔNG ĐIỆP CỦ A WINDOWS ............................... 6 II.1. Giới thiệu................................................................................................................ 6 II.1.1. Thông đi ệp windows ....................................................................................... 6 II.1.2. Lo ại Thông điệp .............................................................................................. 7 II.1.3. Lộ trình thông điệp ........................................................................................ 10 II.1.4. Xử lý thông điệp............................................................................................ 12 II.1.5. Lọc thông điệp............................................................................................... 16 II.1.6. Đăng và chuyển thông điệp .......................................................................... 16 II.1.7. Bế tắc thông điệp........................................................................................... 18 II.1.8. Thông đi ệp quảng bá ..................................................................................... 19 II.1.9. Truy vấn thông điệp ...................................................................................... 20 II.2. Sử dụng thông điệp và hàng đ ợi thông điệp....................................................... 21 II.2.1. Tạo vòng lặp thông điệp................................................................................ 21 II.2.2. Kiểm tra một hàng đ ợi thông điệp................................................................ 24 II.2.3. Đăng thông đi ệp ............................................................................................ 25 II.2.4. Gửi mộ t thông điệp........................................................................................ 26 III. k ỹ thu ật hook ............................................................................................................. 28 III.1. Giới thiệu ............................................................................................................ 28 III.2. Chuỗi Hook......................................................................................................... 29 III.2.1. Thủ tục Hook................................................................................................ 29 III.2.2. Các kiểu Hook.............................................................................................. 29 III.3. Cách s ử dụ ng ...................................................................................................... 31 III.3.1. Cài đ ặt Hook................................................................................................. 31 III.3.2. Giải phóng Hook .......................................................................................... 31 IV. win 32 api .................................................................................................................. 32 IV.1. Giới thiệu............................................................................................................ 32 IV.2. Các hàm thườ ng dùng ........................................................................................ 32 Nguyễ n Quang Nhật – Nguyễ n Quố c M ỹ
  4. Bộ môn Mạ ng và Truy ền Thông 4 IV.2.1. SetWindowsHookEx ................................................................................... 32 IV.2.2. UnhookWindowsHookEx ........................................................................... 33 IV.2.3. CallNextHookEx.......................................................................................... 33 IV.2.4. LowLevelKeyboardProc ............................................................................. 34 IV.2.5. GetKeyState ................................................................................................. 35 IV.2.6. GetKeyboardState ........................................................................................ 35 IV.2.7. ToAscii ......................................................................................................... 35 IV.2.8. LoadLibrary.................................................................................................. 36 IV.2.9. GetProcAddress ........................................................................................... 36 IV.2.10. OpenProcess ............................................................................................... 36 IV.2.11. EnumProcessModules ............................................................................... 37 IV.2.12. GetModuleBaseName................................................................................ 37 IV.2.13. GetForegroundWindow............................................................................. 38 IV.2.14. GetWindowThreadProcessId .................................................................... 38 IV.2.15. GetLocalTime ............................................................................................ 39 IV.3. Mã bàn phím ảo .................................................................................................. 39 Chương 2. P HÂN TÍCH VÀ XÂY DỰNG CHƯƠNG TRÌNH ...................................... 47 I. PHân tích yêu c ầu ........................................................................................................ 47 I.1. Yêu c ầu về chức năng ........................................................................................... 47 I.2. Yêu c ầu về giao diện người dùng ......................................................................... 47 I.3. Yêu c ầu về tương thích ......................................................................................... 47 II. phân tích chức năng .................................................................................................... 47 III. xây dựng chức năng .................................................................................................. 47 III.1. Tập tin thi hành Jaam.exe .................................................................................. 47 III.2. Thư viện Hooker.dll ........................................................................................... 49 III.2.1. Phiên bản 1 ................................................................................................... 49 III.2.2. Phiên bản 2 ................................................................................................... 51 III.2.3. Phiên bản 3 ................................................................................................... 53 Chương 3. TRIỂN KHAI VÀ ĐÁNH GIÁ KẾ T QU Ả.................................................... 57 I. Môi trường triển khai................................................................................................... 57 II. Kết qu ả chức nĂng chương trình .............................................................................. 57 III. Đánh giá và nh ận xét ................................................................................................ 58 Nguyễ n Quang Nhật – Nguyễ n Quố c Mỹ
  5. KeyLogger-Sử dụng Hook Windows 5 TỔNG QUAN VỀ ĐỀ TÀI 1. B ố i cảnh và lý do thực hi ện đề tài Trong khuôn khổ Đồ Án môn học Nguyên Lý hệ điều hành, dưới sự gợi ý của thầy Huỳnh Công Pháp, t ụi em đã chọn đ ề tài KeyLogger -Sử dụng Hook Windows. Khi mà thị trường windows chiếm hơn 90% trên thế giới thì việc được nghiên c ứu về một tính năng quan tr ọng, cơ bản nhất c ủa windows làm chúng em rất hứng thú. Hơn nữa việc thực hiện đ ề tài giúp chúng em biết rõ hơn về mộ t kỹ thuật phần mềm gián điệp, ăn c ắp thông tin đ ể biết cách phòng tránh. 2. Phương pháp tri ển khai đề tài Sử dụng mô hình Tiến Hóa trong vi ệc phân tích và xây dựng phần mềm. Chúng em đã c ố gắng đ ể đưa ra các phiên bản nâng c ấp đ ể có một phần mềm hoàn chỉnh. 3. Kết c ấu của đồ án P hần mềm gồ m 2 tập tin : - Tập tin thi hành Jaam.exe. - Thư viện liên kết đ ộng Hooker.dll. Nguyễ n Quang Nhật – Nguyễ n Quố c M ỹ
  6. Bộ môn Mạ ng và Truy ền Thông 6 CƠ SỞ LÝ THUYẾT Chương 1. I. G IỚI THIỆU Hook 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. Để viết được chương trình Hook ta c ần nắm bắt cơ chế xử lý thông điệp của Windows, Thư viện Win32 API và Kỹ thuật Hook. II. THÔNG ĐIỆP VÀ HÀNG ĐỢI THÔNG ĐIỆP CỦA WINDOWS II.1. G i ới thi ệu Không giống như các ứng dụng trên nền MS-DOS, các ứng dụng trên Windows hướng sự kiện. Chúng không thực hiện các chức năng gọ i rõ ràng ( như thư viện C ) đ ể có được đ ầu vào. Thay vào đó, chúng chờ đợi cho hệ thống chuyển đ ầu vào đ ến chúng. Hệ thống chuyển tất c ả đầu vào cho một ứng dụng cho các c ửa sổ khác nhau trong hệ thố ng. Mỗ i cửa số có mộ t hàm, được gọi là một thủ tục c ửa sổ, hệ thống gọi bất c ứ khi nào nó có đ ầu vào cho c ửa sổ . Thủ tục cửa số xử lý đ ầu vào và trả kiểm soát cho hệ thố ng. Nếu một c ử số cao nhất dừng trả lời thông điệp trong mộ t vài giây, hệ thống xem như c ửa sổ đó là Not Responding. Trong trường hợp này, hệ thống ẩn các c ửa sổ và thay thế nó với một c ửa sổ ma có cùng Z, vị trí kích thước, và các thuộc tính hình ảnh. Điều này cho phép người sử dụng di chuyển, thay đ ổ i kích thước, ho ặc đóng ứng dụng. Tuy nhiên, đây chỉ là những hành đ ộ ng hợp lệ vì ứng dụng thật sự không được đáp ứng. Khi ở chế độ gỡ rối, hệ thống không tạo ra c ửa sổ ma. II.1.1. Thông điệp windows Nguyễ n Quang Nhật – Nguyễ n Quố c Mỹ
  7. KeyLogger-Sử dụng Hook Windows 7 Hệ thống chuyển đ ầu vào đ ến thủ tục cửa sổ trong hình thức c ủa thông điệp. Các thông điệp được sinh ra với c ả hệ thố ng và các ứng dụng. Hệ thống sinh ra mộ t thông điệp ở mỗi sự kiện đ ầu vào – ví dụ, khi người dùng nhập, di chuyển chuột, ho ặc nhấp chuộ t như điều khiển thanh cuộn. Hệ thố ng cũng tạo ra các thông đi ệp trong hồ i đáp đ ể thay đ ổi trong hệ thống mang lại mởi một ứng dụng, như khi mộ t ứng dụng thay đ ổi tài nguyên phông chữ hệ thống ho ặc thay đ ổ i kích thước c ửa sổ của nó. Một ứng dụng có thể sinh ra thông đi ệp đ ến trực tiếp các c ửa sổ riêng c ủa nó đ ể thực hiện nhiệm vụ ho ặc đ ể giao tiếp với cửa sổ trong ứng dụng khác. Hệ thống sẽ gửi mộ t thông điệp tới thông điệp cửa sổ với bố n hằng số : 1 xử lý cửa sổ, một tin nhắn nhận dạng, và hai giá tr ị được gọi là tham s ố tin nhắn. Các xử lý c ửa sổ xác đ ịnh của ố mà thông điệp hướng đ ến. Hệ thố ng dùng nó đ ể xác đ ịnh các thủ tục c ửa sổ sẽ được nhận thông điệp. Định dạng tin nhắn là một hằng số có tên là xác đ ịnh mục đích c ủa thông điệp. Khi một thủ tục cửa sổ nhận được một thông điệp, nó sử dụng mộ t đ ịnh danh tin nhắn xác đ ịnh làm thế nào đ ể xử lý thông điệp. Ví dụ, các thông điệp nhân dạng WM_PAINT cho các thủ tục c ửa sổ đ ể khu vực c ửa sổ đã thay đ ổi và phải được vẽ lại. Các tham số thông điệp xác đ ịnh dữ liệu ho ặc vị trí dữ liệu được dùng bởi thủ tục c ửa sổ khi xử lý thông điệp. Ý nghĩa và giá tr ị của tham số thông điệp phụ thuộc vào thông điệp. Một tham s ố thông điệp có thể chứa mộ t số nguyên, c ờ bit đóng gói, một con trỏ đến mộ t c ấu trúc dữ liệu chứa dữ liệu bổ sung, và v..v.. Khi một thông điệp không dùng tham s ố thông điệp, chúng thương được thiết lập là NULL. Một thủ tục cửa sổ phải kiểm tra đ ịn danh thông điệp đ ể xác đ ịnh làm thế nào đ ể phân tích thông s ố thông điệp. II.1.2. Loại Thông điệp Có hai lo ại thông điệp - Thông điệp đ ịnh bởi hệ thố ng - Thông điệp đ ịnh bởi ứng dụng Thông đi ệp đị nh bởi hệ thống Nguyễ n Quang Nhật – Nguyễ n Quố c M ỹ
  8. Bộ môn Mạ ng và Truy ền Thông 8 Hệ thống gửi ho ặc chuyển một Thông điệp đ ịnh bởi hệ thống khi nó giao ti ếp với một ứng dụng. Nó sử dụng những thông điệp đ ể điều khiển ho ạt đ ộng của ứng dụng và cung c ấp đ ầu vào và các thông tin khác cho ứng dựng xử lý. Một ứng dụng có thể gửi ho ặc chuyển thông điệp đ ịnh bởi hệ thố ng. Ứng dụng thường sử dụng các thông điệp đ ể điều khiển các ho ạt đ ộng của đ ố i tượng cửa sổ được tạo bằng cách dùng các lớp cửa sổ đã đăng ký. Mỗi thông điệp đ ịnh bởi hệ thống có mộ t đinh dạnh thông điệp riêng duy nhất và một hằng biểu tượng tương ứng (được đinh nghĩa trong các tập tin header của SDK ) nêu rõ mục đích c ủa thông điệp. Ví dụ, WM_PAINT yêu cầu cửa sổ vẽ lại nộ i dung c ủa nó. Hằng số tượng trưng xác đ ịnh củ thể danh mục mà thông điệp đinh bởi hệ thống thuộc về. Các tiền tố của hằng xác đ ịnh lo ại của cửa sổ mà nó phân tích và xử lý thông điệp. Sau đây là danh xác các thông đi ệp Tiền tố Loại thông điệp ABM and ABN Application desktop toolbar ACM and ACN Animation control BCM , BCN , BM , and BN Button control CB and CBN ComboBox control CBEM and CBEN ComboBoxEx control CCM General control CDM Common dialog box DFM Default context menu DL Drag list box DM Default push button control DTM and DTN Date and time picker control EM and EN Edit control HDM and HDN Header control HKM Hot key control IPM and IPN IP address control LB and LBN List box control LM SysLink control LVM and LVN List view control M CM and M CN Month calendar control PBM Progress bar Nguyễ n Quang Nhật – Nguyễ n Quố c Mỹ
  9. KeyLogger-Sử dụng Hook Windows 9 PGM and PGN Pager control PSM and PSN Property sheet RB and RBN Rebar control SB and SBN Status bar window SBM Scroll bar control SMC Shell menu STM and STN Static control TB and TBN Toolbar TBM and TRBN Trackbar control TCM and TCN Tab control TDM and TDN Task dialog TTM and TTN Tooltip control TVM and TVN Tree- view control UDM and UDN Up- down control WM General Thông đi ệp đị nh bởi ứng dụng Một ứng dụng có thể tạo ra các thông đi ệp được sửa dụng bởi các c ửa sổ riêng c ủa nó ho ặc đ ể giao tiếp với c ửa sổ của ứng dụng khác. Nếu một ứng dụng tạo ra các thông điệp của nó, thủ tục cửa sổ sẽ tiếp nhận và phân tích những thông điệp và cung c ấp xử lý thích hợp. Định danh thông điệp có các giá tr ị sau : - Hệ thống dự trữ đ ịnh danh thông điệp với giá trị từ 0x0000 đ ến 0x03FF ( giá trị của WM_USER – 1) cho thông đi ệp đ ịnh bởi hệ thống. Các uwgns dụng không thể dùng những thông điệp riêng này. - Giá trị từ 0x0400 (giá tr ị của WM_USER) tới 0x7FFF là hợp lệ cho đ ịnh danh thông điệp cho các lớp cửa sổ riêng. - Nếu các ứng dụng được đánh dấu version 4, ta có thể sử dụng đ ịnh dạng thông điệp với giá trị trong kho ản 0x8000 (WM_APP) t ới 0xBFFF trong thông đi ệp riêng. - Hệ thống trả về mộ t đ ịnh danh thông điệp trong kho ản 0xC000 tới 0xFFFF khi một ứng dụng gọi hàm RegisterWindowMessage đ ể đăng ký một thông điệp. Nguyễ n Quang Nhật – Nguyễ n Quố c M ỹ
  10. Bộ môn Mạ ng và Truy ền Thông 10 Định danh thông điệp trả về bởi hàm này được đ ảm bảo là duy nhất trong toàn hệ thống. Sử dụng chức năng này ngăn chặn xung đ ộ t có thể xảy ra nếu ứng dụng khác dùng cùng đ ịnh danh thông điệp cho mục đích khác. II.1.3. Lộ trình thông đi ệp Hệ thống sử dụng hai phương thức đ ể chuyển thông điệp đ ến thủ tục c ửa sổ : chuyển thông điệp đ ến một hàng đ ợi, chuyển thông điệp trực tiếp tới thủ tục cửa sổ. Một thông điệp được đưa đ ến một hàng đ ợi được gọi là hàng đ ợi thông điệp. Đây là kết quả chủ yếu của đ ầu vào nhập vào thông qua chuộ hoặc bàn phím như các thông đi ệp WM_MOUSEMOVE, WM_LBUTTONDOWN, WM_KEYDOWN, và WM_CHAR. Các thông đi ệp hàng đ ợi khác bao gồm bộ đếm thời gian, vẽ, và thông điệp thoát : WM_TIMER, WM_PAINT, và WM_QUIT. Phần lớn thông điệp khác được gửi trực tiếp đ ến thủ tục cửa sổ, được gọi là thông điệp không hàng đ ợi. Hàng đợi thông đi ệp Hệ thống có thể hiển thị bất kỳ số lượng cửa sổ cùng mộ t lúc. Để chuyển dữ liệu chuộ t và bàn phím đ ến cửa sổ thích hợp, hệ thống sử dụng hàng đ ợi thông điệp. Hệ thống duy trì mộ t hàng đ ợi hệ thống tin nhắn đơn và thread-cụ thể mộ t tin nhắn hàng đ ợi cho mỗi thread GUI. Để tránh các chi phí c ủa việc tạo ra một hàng đ ợi tin nhắn cho chủ đề giao diện không, tất c ả các chủ đề được tạo ra ban đ ầu mà không có một hàng đ ợi thông điệp. Hệ thố ng này tạo ra một thread-cụ thể hàng đ ợi thông điệp chỉ khi chủ đề làm cho cuộ c gọi đ ầu tiên c ủa mình cho một trong những người sử dụng các chức năng c ụ thể, không có chức năng giao diện cuộc gọ i kết quả trong việc tạo ra các mộ t hàng đ ợi thông điệp. Bất c ứ khi nào người dùng di chuyển chuột, nhấp chuột vào nút chuột, ho ặc các lo ại trê n bàn phím, trình đi ều khiển thiết bị cho các con chuộ t ho ặc bàn phím chuyển đ ổi đ ầu vào tin nhắn và đ ặt chúng trong hàng đ ợi hệ thống tin nhắn. Hệ thống này lo ại bỏ các tin nhắn, một tại một thời điểm, từ hàng đ ợi thông điệp hệ thống, kiểm tra đ ể xác đ ịnh cửa sổ đích, và sau đó bài vi ết chúng vào hàng đ ợi tin nhắn của chủ đề đó tạo ra c ửa sổ đích. Hàng đ ợi tin nhắn của mộ t chủ đ ề nhận được tất c ả các tin nhắn chuộ t và bàn phím cho các c ửa sổ được tạo ra bởi chủ đề. Chủ đề Nguyễ n Quang Nhật – Nguyễ n Quố c Mỹ
  11. KeyLogger-Sử dụng Hook Windows 11 lo ại bỏ tin nhắn từ hàng đ ợi của nó và chỉ đạo hệ thố ng đ ể gửi đ ến các thủ tục cửa sổ thích hợp cho chế biến. Với sự ngo ại lệ của thông điệp WM_PAINT, thông đi ệp WM_TIMER, và thông điệp WM_QUIT, hệ thố ng tin nhắn vào cuối c ủa mộ t hàng đ ợi thông điệp. Điều này đ ảm bảo rằng mộ t cửa sổ nhận đ ược tin nhắn đ ầu vào c ủa nó trong lần đ ầu tiên thích hợp, trình tự (FIFO) đ ầu tiên ra. Thông đi ệp WM_PAINT, thông đi ệp WM_TIMER, và thông đi ệp WM_QUIT, tuy nhiên, được lưu giữ trong hàng đ ợi và được chuyển tiếp đ ến các thủ tục cửa sổ chỉ khi hàng đ ợi không có các tin nhắn khác. Ngoài ra, nhi ều thông điệp WM_PAINT cho cùng mộ t cửa sổ được kết hợp vào một thông điệp WM_PAINT duy nhất, c ủng cố tất c ả các phần không hợp lệ của các khu vực khách hàng vào một khu vực duy nhất. Kết hợp các thông điệp WM_PAINT làm giảm số lần mộ t c ửa sổ phải vẽ lại các nội dung c ủa khu vực khách hàng c ủa nó. Các bài viết hệ thống tin nhắn đ ến hàng đ ợi thông điệp của một chủ đề bằng cách điền vào một c ấu trúc bộ t ngọt và sau đó sao chép nó vào hàng đ ợi thông điệp. Thông tin trong bột ngọ t bao gồm: xử lý của cửa sổ tin nhắn có mục đích, đ ịnh danh tin nhắn, hai thông s ố tin nhắn, tin nhắn được đăng, và vị trí con tr ỏ chuột. Mộ t thread có thể gửi một thông điệp tới hàng đ ợi thông điệp riêng c ủa mình vào hàng đ ợi của chủ đề khác bằng cách sử dụng chức năng PostMessage ho ặc P ostThreadMessage. Một ứng dụng có thể lo ại bỏ một thông điệp từ hàng đ ợi c ủa nó bằng cách sử dụng chức năng GetMessage. Để kiểm tra mộ t tin nhắn mà không c ần gỡ bỏ nó khỏ i hàng đ ợi c ủa nó, mộ t ứng dụng có thể sử dụng chức năng PeekMessage. Chức năng này đ ầy bột ngọ t với thông tin về tin nhắn. Sau khi lo ại bỏ một thông điệp từ hàng đ ợi c ủa nó, một ứng dụng có thể sử dụng chức năng DispatchMessage chỉ đạo hệ thống gửi tin nhắn tới một thủ tục cửa sổ đ ể xử lý. DispatchMess age mộ t con trỏ đ ến bột ngọ t đã được lấp đ ầy bởi mộ t cuộc gọi trước đ ể GetMessage ho ặc chức năng PeekMessage. DispatchMessage qua cửa sổ xử lý, nhận dạng tin nhắn, và các thông s ố tin nhắn hai thủ tục cửa sổ, nhưng nó không vượt qua thời gian thông đi ệp được đăng ho ặc vị trí con tr ỏ chuột. Mộ t Nguyễ n Quang Nhật – Nguyễ n Quố c M ỹ
  12. Bộ môn Mạ ng và Truy ền Thông 12 ứng dụng có thể lấy thông tin này bằng cách gọi các chức năng GetMessageTime và GetMessagePos trong khi xử lý tin nhắn. Một thread có thể sử dụng chức năng WaitMessage năng suất kiểm soát các chủ đề khác khi nó không có tin nhắn trong hàng đ ợi thông điệp của mình. Chức năng đình chỉ các chủ đề và không trả lại cho đ ến khi một tin nhắn mới được đ ặt trong hàng đ ợi thông điệp của chủ đề. Bạn có thể gọi hàm SetMessageExtraInfo đ ể kết hợp một giá trị với hàng đ ợi thông điệp của thread hiện hành. Sau đó gọi hàm GetMessageExtraInfo đ ể có được giá trị liên quan đ ến thông báo cuối cùng lấy GetMessage ho ặc chức năng P eekMessage. Thông đi ệp không hàng đợi Các tin nhắn Nonqueued được gửi ngay lập tức các thủ tục c ửa sổ đích, bỏ qua hàng đ ợi hệ thố ng tin nhắn và hàng đ ợi thông điệp chủ đ ề. Hệ thống này thường gửi tin nhắn nonqueued đ ể thông báo cho một c ửa sổ của các sự kiện có ảnh hưởng đ ến nó. Ví dụ, khi người dùng kích ho ạt một c ửa sổ ứng dụng mới, hệ thống sẽ gửi các c ửa sổ một loạt các tin nhắn, bao gồ m cả WM_ACTIVATE, WM_SETFOCUS, và WM_SETCURSOR. Các thông đi ệp này thông báo cho các c ửa sổ đã được kích ho ạt, bàn phím đ ầu vào đang được hướng đ ến cửa sổ, và con tr ỏ chuột đã được di chuyển trong phạm vi biên giới c ủa cửa sổ . Các tin nhắn Nonqueued cũng có thể kết quả khi một ứng dụng gọi mộ t số chức năng hệ thố ng. Ví dụ, hệ thống sẽ gửi tin nhắn WM_WINDOWPOSCHANGED sau khi một ứng dụng sử dụng các chức năng SetWindowPos đ ể di chuyển một c ửa sổ . Một số chức năng gửi tin nhắn nonqueued BroadcastSystemMessage, BroadcastSystemMessageEx, SendMessage, SendMessageTimeout, và SendNotifyMessage. II.1.4. Xử lý thông điệp Một ứng dụng phải lo ại bỏ và xử lý các tin nhắn được đưa lên hàng đ ợi tin nhắn của chủ đề của nó. Một ứng dụng đơn luồng thường sử dụng một vòng lặp tin nhắn chức năng winmain c ủa nó đ ể lo ại bỏ và gửi tin nhắn cho các thủ tục c ửa sổ Nguyễ n Quang Nhật – Nguyễ n Quố c Mỹ
  13. KeyLogger-Sử dụng Hook Windows 13 thích hợp cho chế biến. Các ứng dụng với nhiều chủ đề có thể bao gồ m một vòng lặp tin nhắn trong mỗi chủ đề đó tạo ra một c ửa sổ. Các phần sau đây mô tả làm thế nào một công trình vòng l ặp thông điệp và giải thích vai trò c ủa một thủ tục cửa sổ: Vòng l ặp thông đi ệp Một vòng lặp tin nhắn đơn giản bao gồm mộ t cuộc gọi chức năng với nhau trong ba chức năng: GetMessage, TranslateMessage, và DispatchMessage. Lưu ý rằng nếu có mộ t lỗi, GetMessage tr ả về -1, do đó s ự cần thiết cho việc thử nghiệm đ ặc biệt. MSG msg; BOOL bRet; while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0) { if (bRet == -1) { // handle the error and possibly exit } else { TranslateMessage(&msg); DispatchMessage(&msg); } } Chức năng GetMessage l ấy mộ t thông điệp từ hàng đ ợi và sao chép nó vào một c ấu trúc c ủa lo ại bột ngọt. Nó trả về một giá trị khác không, tr ừ khi nó bắt gặp thông báo WM_QUIT, trong trường hợp nó sẽ trả về FALSE và kết thúc vòng lặp. Trong một ứng dụng đơn luồng, kết thúc vòng lặp tin nhắn thường là bước đ ầu tiên đ ể đóng ứng dụng. Một ứng dụng có thể kết thúc vòng lặp của riêng mình bằng cách Nguyễ n Quang Nhật – Nguyễ n Quố c M ỹ
  14. Bộ môn Mạ ng và Truy ền Thông 14 sử dụng chức năng PostQuitMessage, t hường phản ứng với thông điệp WM_DESTROY trong thủ tục c ửa sổ của cửa sổ chính c ủa ứng dụng. Nếu bạn chỉ định một c ửa sổ xử lý như là tham s ố thứ hai c ủa GetMessage, tin nhắn chỉ dành cho các c ửa sổ chỉ định được lấy từ hàng đ ợi. GetMessage cũng có thể lọc các thông điệp trong hàng đ ợi, lấy chỉ những tin nhắn nằm trong mộ t phạm vi chỉ định. Để biết thêm thông tin về các tin nhắn lọc, lọc tin nhắn. Vòng lặp thông điệp của chủ đ ề phải bao gồm TranslateMessage nếu chủ đề là đ ể nhận được nhân vật đ ầu vào từ bàn phím. Hệ thống này tạo ra các thông đi ệp chính ảo (WM_KEYDOWN và WM_KEYUP) mỗi lần người dùng nhấn một phím. Một tin nhắn phím ảo có chứa mộ t mã phím ảo đ ể xác đ ịnh phím nào được nhấn, nhưng không phải giá trị của nó nhân vật. Để lấy giá trị này, các vòng lặp tin nhắn phải có TranslateMessage, dịch các tin nhắn phím ảo vào một tin nhắn ký tự (WM_CHAR) và đ ặt nó trở lại vào hàng đ ợi thông điệp ứng dụng. Thông báo nhân vật sau đó có thể được gỡ bỏ sau khi lặp đi lặp lại tiếp theo c ủa vòng lặp tin nhắn và gửi đi một thủ tục cửa sổ. Chức năng DispatchMessage s ẽ gửi mộ t thông điệp tới các thủ tục cửa sổ kết hợp với các c ửa sổ xử lý quy đ ịnh trong c ấu trúc MSG. Nếu cửa sổ xử lý HWND_TOPMOST, DispatchMessage gửi tin nhắn tới các thủ tục c ửa sổ của tất c ả các c ửa sổ cấp cao nhất trong hệ thống. Nếu cửa sổ xử lý NULL, DispatchMessage không làm gì với tin nhắn. Chủ đề chính c ủa một ứng dụng bắt đ ầu vòng lặp thông điệp của mình sau khi khởi tạo các ứng dụng và tạo ra ít nhất một c ửa sổ. Sau khi nó được bắt đ ầu, vòng lặp tin nhắn tiếp tục đ ể lấy thông điệp từ hàng đ ợi thông điệp của chủ đ ề và gửi chúng cho các c ửa sổ thích hợp. Các vòng lặp thông điệp kết thúc khi hàm GetMessage lo ại bỏ các thông điệp WM_QUIT từ hàng đ ợi thông điệp. Chỉ có một vòng lặp thông điệp là c ần thiết cho một hàng đ ợi tin nhắn, thậm chí nếu một ứng dụng có chứa nhiều cửa sổ. DispatchMessage luôn luôn công văn thông điệp đ ến cửa sổ thích hợp, điều này là bởi vì mỗi tin nhắn trong hàng đ ợi là một c ấu trúc bột ngọ t có chứa các xử lý c ủa cửa sổ tin nhắn. Nguyễ n Quang Nhật – Nguyễ n Quố c Mỹ
  15. KeyLogger-Sử dụng Hook Windows 15 Bạn có thể sửa đ ổi một vòng lặp tin nhắn trong nhiều cách khác nhau. Ví dụ, bạn có thể lấy các thông đi ệp từ hàng đ ợi mà không có c ử một c ửa sổ. Điều này rất hữu ích cho các ứng dụng tin nhắn gửi không quy đ ịnh c ụ thể một c ửa sổ. Bạn cũng có thể trực tiếp GetMessage đ ể tìm kiếm thông điệp cụ thể, đ ể lại tin nhắn khác trong hàng đ ợi. Điều này là hữu ích nếu bạn phải tạm thời bỏ qua thứ tự FIFO thông thường của các hàng đ ợi thông điệp. Một ứng dụng sử dụng các phím gia tốc phải có khả năng dịch tin nhắn bàn phím vào các tin nhắn lệnh. Để làm điều này, vòng lặp thông điệp của ứng dụng phải bao gồ m một cuộ c gọ i đ ến các chức năng TranslateAccelerator. Để biết thêm thông tin về các phím gia tố c, gia tốc bàn phím. Nếu một chủ đề sử dụng một hộp tho ại modeless, vòng lặp thông báo phải bao gồm các chức năng IsDialogMessage đ ể hộ p tho ại có thể nhận được đ ầu vào bàn phím. Thủ tục c ửa sổ Một thủ tục cửa sổ là một chức năng tiếp nhận và xử lý tất c ả các tin nhắn gửi đ ến cửa sổ. Mỗ i lớp cửa sổ có mộ t thủ tục cửa sổ , và tất c ả các c ửa sổ tạo ra với lớp học mà sử dụng thủ tục cùng một c ửa sổ đ ể trả lời tin nhắn. Hệ thống sẽ gửi mộ t thông điệp tới mộ t thủ tục cửa sổ bằng cách đi qua các thông điệp dữ liệu như các đ ối số thủ tục. Các thủ tục cửa sổ sau đó thực hiện mộ t hành động thích hợp tin nhắn, nó sẽ kiểm tra đ ịnh danh tin nhắn, trong khi xử lý tin nhắn, sử dụng các thông tin quy đ ịnh bởi các thông s ố tin nhắn. Một thủ tục cửa sổ thường không bỏ qua mộ t tin nhắn. Nếu nó không xử lý một tin nhắn, nó phải gửi tin nhắn trở lại hệ thống đ ể xử lý mặc đ ịnh. Thủ tục cửa sổ này bằng cách gọi hàm DefWindowProc, thực hiện một hành đ ộ ng mặc đ ịnh và trả về một kết quả tin nhắn. Thủ tục cửa sổ sau đó phải trả lại giá trị này là kết quả thông điệp riêng c ủa mình. Hầu hết các thủ tục c ửa sổ xử lý chỉ là một vài tin nhắn và vượt qua những người khác trên hệ thống bằng cách gọ i DefWindowProc. Bởi vì một thủ tục c ửa sổ được chia s ẻ bởi tất cả các c ửa sổ thuộ c cùng mộ t lớp, nó có thể xử lý tin nhắn cho các c ửa sổ khác nhau. Để xác đ ịnh các c ửa sổ cụ Nguyễ n Quang Nhật – Nguyễ n Quố c M ỹ
  16. Bộ môn Mạ ng và Truy ền Thông 16 thể bị ảnh hưởng bởi tin nhắn, một thủ tục cửa sổ có thể kiểm tra các c ửa sổ xử lý được thông qua với mộ t tin nhắn. Để biết thêm thông tin về các thủ tục cửa sổ, xem Thủ tục Window. II.1.5. Lọc thông điệp Một ứng dụng có thể lựa chọ n tin nhắn cụ thể lấy từ hàng đ ợi thông điệp (trong khi bỏ qua các tin nhắn khác) bằng cách sử dụng chức năng GetMessage ho ặc PeekMessage đ ể chỉ định mộ t bộ lọ c tin nhắn. Bộ lọc được một lo ạt các đ ịnh danh tin nhắn (quy đ ịnh bởi mộ t đ ịnh danh đ ầu tiên và cuối cùng), xử lý mộ t cửa sổ , ho ặc c ả hai. GetMessage và PeekMessage s ử dụng một bộ lọ c tin nhắn đ ể chọn các tin nhắn đ ể lấy từ hàng đ ợi. Lọc thư rất hữu ích nếu một ứng dụng phải tìm kiếm các hàng đ ợi thông điệp cho các tin nhắn đã đ ến sau đó trong hàng đ ợi. Nó cũng r ất hữu ích nếu mộ t ứng dụng phải xử lý đ ầu vào (phần cứng) tin nhắn trước khi chế biến các bài được đăng. Các hằng số WM_KEYFIRST và WM_KEYLAST có thể được sử dụng như các giá tr ị lọc đ ể lấy tất c ả thông điệp bàn phím, các hằng số WM_MOUSEFIRST và WM_MOUSELAST có thể được sử dụng đ ể lấy tất cả các tin nhắn chuột. Bất kỳ ứng dụng mà các bộ lọc tin nhắn phải đ ảm bảo rằng một tin nhắn đáp ứng bộ lọc tin nhắn có thể được đăng. Ví dụ, nếu mộ t bộ lọ c ứng dụng cho mộ t tin nhắn WM_CHAR trong một c ửa sổ mà không nhận được đ ầu vào bàn phím, chức năng GetMessage không tr ở lại. Hiệu quả này "treo" các ứng dụng. II.1.6. Đăng và chuyển thông điệp Bất kỳ ứng dụng có thể đăng bài và gửi tin nhắn. Giống như hệ thố ng, mộ t bài viết một ứng dụng tin nhắn bằng cách sao chép nó vào một hàng đ ợi tin nhắn và gửi một thông điệp bằng cách đi qua các thông đi ệp dữ liệu như các đ ối số đến mộ t thủ tục window. Để gửi tin nhắn, ứng dụng sử dụng các chức năng PostMessage. Một ứng dụng có thể gửi một tin nhắn bằng cách gọi SendMessage, BroadcastSystemMessage, SendMessageCallback, SendMessageTimeout, SendNotifyMessage, ho ặc SendDlgItemMessage chức năng. Đăng tin nhắn Nguyễ n Quang Nhật – Nguyễ n Quố c Mỹ
  17. KeyLogger-Sử dụng Hook Windows 17 Một ứng dụng thường gởi một thông điệp đ ể thông báo cho một c ửa sổ cụ thể đ ể thực hiện mộ t nhiệm vụ. PostMessage t ạo ra một c ấu trúc MSG cho tin nhắn và các bản sao tin nhắn tới các hàng đ ợi thông điệp. Vòng lặp thông điệp của ứng dụng cuối cùng lấy được thông báo và công văn đ ến các thủ tục cửa sổ thích hợp. Một ứng dụng có thể gửi một tin nhắn mà không c ần quy đ ịnh cụ thể một c ửa sổ. Nếu ứng dụng cung cấp mộ t c ửa sổ xử lý NULL khi gọi PostMessage, tin nhắn được đưa lên hàng đ ợi kết hợp với các chủ đề hiện tại. Vì không có c ửa sổ xử lý được quy đ ịnh cụ thể, ứng dụng phải xử lý các tin nhắn trong vòng lặp tin nhắn. Đây là một trong những cách đ ể tạo ra mộ t thông báo áp dụng cho toàn bộ ứng dụng, thay vì đ ến một cửa sổ cụ thể. Thỉnh tho ảng, bạn có thể muốn gửi mộ t thông điệp tới tất cả các c ửa sổ cấp cao nhất trong hệ thống. Một ứng dụng có thể gửi mộ t tin nhắn cho tất c ả các c ửa sổ cấp cao nhất bằng cách gọ i PostMessage và quy đ ịnh cụ thể HWND_TOPMOST trong tham s ố hwnd. Một lỗi lập trình phổ biến là cho rằng chức năng PostMessage luôn luôn nhắn. Điều này không đúng khi hàng đ ợi thông điệp đ ầy đ ủ. Mộ t ứng dụng nên kiểm tra giá tr ị trả lại chức năng PostMessage đ ể xác đ ịnh xem tin nhắn đã được đăng, và nếu nó đã không được, repost nó. Chuyển tin nhắn Một ứng dụng thường gửi một thông điệp đ ể thông báo cho một thủ tục cửa sổ đ ể thực hiện mộ t nhiệm vụ ngay lập tức. Chức năng SendMessage gửi tin nhắn tới các thủ tục c ửa sổ tương ứng với c ửa sổ nhất đ ịnh. Chức năng chờ đợi cho đ ến khi hoàn tất các thủ tục cửa sổ xử lý và sau đó tr ả về kết quả tin nhắn. Cửa sổ cha mẹ và trẻ em thường liên lạc bằng cách gửi tin nhắn cho nhau. Ví dụ, mộ t cửa sổ cha mẹ có một điều khiển chỉnh sửa như c ửa sổ con c ủa nó có thể thiết lập các văn bản của kiểm soát bằng cách gửi một thông điệp tới nó. Việc kiểm soát có thể thông báo cho c ửa sổ cha mẹ thay đ ổi văn bản được thực hiện bởi người sử dụng bằng cách gửi tin nhắn lại cho phụ huynh. Nguyễ n Quang Nhật – Nguyễ n Quố c M ỹ
  18. Bộ môn Mạ ng và Truy ền Thông 18 Chức năng SendMessageCallback cũng s ẽ gửi một thông điệp tới các thủ tục cửa sổ tương ứng với c ửa sổ nhất đ ịnh. Tuy nhiên, chức năng này trả về ngay lập tức. Sau khi các thủ tục cửa sổ xử lý tin nhắn, hệ thố ng các cuộ c gọ i chức năng gọ i lại quy đ ịnh. Để biết thêm thông tin về chức năng gọ i lại, thấy chức năng SendAsyncProc. Chức năng SendMessageCallback cũng s ẽ gửi một thông điệp tới các thủ tục cửa sổ tương ứng với c ửa sổ nhất đ ịnh. Tuy nhiên, chức năng này trả về ngay lập tức. Sau khi các thủ tục cửa sổ xử lý tin nhắn, hệ thố ng các cuộ c gọ i chức năng gọ i lại quy đ ịnh. Để biết thêm thông tin về chức năng gọ i lại, thấy chức năng SendAsyncProc. Bằng cách sử dụng chức năng InSendMessage ho ặc InSendMessageEx, mộ t thủ tục c ửa sổ có thể xác đ ịnh cho dù đó là chế biến một thông báo được gửi bởi thread khác. Khả năng này rất hữu ích khi xử lý thông báo phụ thuộc vào nguồn gốc của tin nhắn. II.1.7. Bế tắ c thông điệp Một chủ đề đó gọi hàm SendMessage đ ể gửi tin nhắn đ ến chủ đề khác không thể tiếp tục thực hiện cho đ ến khi các thủ tục cửa sổ nhận được tin nhắn trả về. Nếu sản lượng chủ đ ề được kiểm soát trong khi xử lý tin nhắn, các chủ đề gửi không có thể tiếp tục thực hiện, bởi vì nó là chờ đợi cho SendMessage tr ở lại. Nếu các chủ đề nhận được được gắn vào hàng đ ợi tương tự như người gửi, nó có thể gây ra mộ t bế tắc ứng dụng đ ể xảy ra. (Lưu ý r ằng tạp chí móc đính kèm các chủ đ ề cùng mộ t hàng đ ợi.) Lưu ý rằng các chủ đề nhận được cần không mang lại kiểm soát một cách rõ ràng, gọ i điện tho ại bất kỳ của các chức năng sau có thể gây ra một thread đ ể năng suất kiểm soát ngầm. - DialogBox - DialogBoxIndirect - DialogBoxIndirectParam - DialogBoxParam Nguyễ n Quang Nhật – Nguyễ n Quố c Mỹ
  19. KeyLogger-Sử dụng Hook Windows 19 - GetMessage - MessageBox - P eekMessage - SendMessage Để tránh bế tắc tiềm năng trong ứng dụng c ủa bạn, hãy xem xét s ử dụng SendNotifyMessage ho ặc các chức năng SendMessageTimeout. Nếu không, mộ t thủ tục c ửa sổ có thể xác đ ịnh xem một tin nhắn đã nhận được đã được gửi chủ đề khác bằng cách gọi InSendMessage ho ặc InSendMessageEx chức năng. Trước khi gọ i bất kỳ các chức năng trong danh sách trước khi thực hiện mộ t tin nhắn, các thủ tục cửa sổ đ ầu tiên nên gọi InSendMessage ho ặc InSendMessageEx. Nếu chức năng này trả về TRUE, các thủ tục cửa sổ phải gọi hàm ReplyMessage trước khi bất kỳ chức năng gây ra các chủ đề để sản lượng kiểm soát. II.1.8. Thông điệp quảng bá Mỗi thông điệp bao gồ m một đ ịnh danh thông điệp và hai tham s ố wParam và lParam. Từ đ ịnh danh tin nhắn là một giá trị duy nhất quy đ ịnh cụ thể mục đích thông báo. Các thông s ố cung c ấp thông tin bổ sung đó là thông đi ệp cụ thể, nhưng các tham s ố wParam nói chung là một giá trị kiểu cung c ấp thông tin về tin nhắn. Chương trình phát sóng tin nhắn chỉ đơn giản là gửi mộ t tin nhắn tới nhiều người trong hệ thống. Để phát sóng một thông điệp từ một ứng dụng, sử dụng chức năng BroadcastSystemMessage, quy đ ịnh cụ thể người nhận của tin nhắn. Thay vì chỉ đ ịnh người nhận cá nhân, bạn phải chỉ đ ịnh mộ t ho ặc nhiều lo ại người nhận. Những lo ại ứng dụng, trình điều khiển cài đ ặt, trình điều khiển mạng, và các trình điều khiển thiết bị hệ thống. Hệ thống sẽ gửi tin nhắn quảng bá cho tất c ả các thành viên c ủa từng lo ại quy đ ịnh. Hệ thống này thường chương trình phát sóng thông đi ệp phản ứng với những thay đ ổi diễn ra trong các trình đi ều khiển thiết bị hệ thố ng ho ặc các thành phần liên quan. Người lái xe ho ặc thành phần liên quan đ ến chương trình phát sóng thông điệp đ ến các ứng dụng và các thành phần khác đ ể thông báo cho họ về sự thay đ ổi. Nguyễ n Quang Nhật – Nguyễ n Quố c M ỹ
  20. Bộ môn Mạ ng và Truy ền Thông 20 Ví dụ, thành phần chịu trách nhiệm cho các ổ đĩa chương trình phát sóng một thông báo bất c ứ khi nào điều khiển thiết bị cho các ổ đĩa mềm phát hiện một sự thay đ ổ i của các phương tiện truyền thông chẳng hạn như khi người sử dụng chèn mộ t đĩa vào ổ đĩa. Hệ thống chương trình phát sóng tin nhắn đ ến người nhận theo thứ tự này: hệ thống cấp trình điều khiển thiết bị, trình điều khiển mạng, cài đ ặt trình điều khiển, và các ứng dụng. Điều này có nghĩa là hệ thống cấp trình điều khiển thiết bị, nếu được lựa chọn như người nhận, luôn luôn có được cơ hội đ ầu tiên đ ể đối phó với một tin nhắn. Trong thời hạn một lo ại người nhận nhất đ ịnh, lái xe không được đ ảm bảo đ ể nhận được thông báo đưa ra trước khi bất kỳ trình điều khiển khác. Điều này có nghĩa rằng một thông điệp dành cho mộ t trình điều khiển cụ thể phải có một đ ịnh danh tin nhắn trên toàn c ầu duy nhất đ ể không có trình đi ều khiển khác vô ý quá trình đó. Bạn cũng có thể phát sóng các tin nhắn cho tất c ả các c ửa sổ cấp cao nhất bằng cách xác đ ịnh HWND_BROADCAST trong SendMessage, SendMessageCallback, SendMessageTimeout, ho ặc SendNotifyMessage chức năng. Các ứng dụng nhận tin nhắn thông qua c ác thủ tục cửa sổ của cửa sổ cấp cao nhất c ủa họ. Tin nhắn không được gửi đ ến các c ửa sổ con. Dịch vụ có thể nhận tin nhắn thông qua một thủ tục xử lý cửa sổ ho ặc dịch vụ kiểm soá Lưu ý hệ thố ng cấp trình điều khiển thiết bị sử dụng một chức năng, hệ thống cấp liên quan đ ể phát sóng các thông báo hệ thống. II.1.9. Truy vấn thông điệp Bạn có thể tạo ra các tin nhắn tùy chỉnh của bạn và sử dụng chúng đ ể phố i hợp ho ạt đ ộ ng giữa các ứng dụng của bạn và các thành phần khác trong hệ thống. Điều này đ ặc biệt hữu ích nếu bạn đã tạo ra trình đi ều khiển cài đ ặt riêng c ủa bạn ho ặc trình điều khiển thiết bị hệ thống cấp. Tin nhắn tuỳ chỉnh của bạn có thể mang thông tin đ ến và từ trình điều khiển của bạn và các ứng dụng sử dụng các trình đi ều khiển. Nguyễ n Quang Nhật – Nguyễ n Quố c Mỹ
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản
2=>2