Bài viết này là phần tiếp theo của báo cáo trước đó về keylogger. Nó cung cấp một phân tích chi tiết về các khía cạnh kỹ thuật và hoạt động bên trong của keylogger. Như đã lưu ý trong bài viết đầu tiên, keylogger về cơ bản được thiết kế để chèn vào giữa hai liên kết bất kỳ trong một chuỗi, theo đó một tín hiệu được truyền từ phím được nhấn đến các ký tự xuất hiện trên màn hình. Bài viết này cung cấp cả tổng quan về những liên kết nào tồn tại trong chuỗi này và cách hoạt động của cả keylogger phần mềm và phần cứng.
Bài báo này được viết cho các chuyên gia kỹ thuật và người dùng thành thạo. Những người dùng khác không thuộc nhóm mục tiêu này nên lưu ý rằng Windows cung cấp nhiều cách để thu thập dữ liệu nhập từ bàn phím, mặc dù phần lớn các keylogger chỉ sử dụng hai trong số các phương pháp này (xem: Thiết kế Keylogger, cách đầu tiên một phần của bài báo).
Cần nhấn mạnh rằng bài viết này không chứa bất kỳ mã keylogger nào; chúng tôi không chia sẻ ý kiến của một số nhà nghiên cứu, những người thấy có thể chấp nhận được việc xuất bản mã như vậy. Thay vào đó, chúng tôi tập trung vào việc hiểu cách hoạt động của keylogger để cung cấp khả năng bảo vệ hiệu quả hơn chống lại chúng.
Xử lý dữ liệu được nhập thông qua bàn phím trong Windows
Có một số công nghệ cơ bản có thể được sử dụng để chặn các lần nhấn phím và sự kiện chuột, và nhiều keylogger sử dụng các công nghệ này. Tuy nhiên, trước khi tìm hiểu về một số loại keylogger nhất định, cần phải hiểu cách dữ liệu được nhập qua bàn phím được Windows xử lý. Ba nguồn đã được sử dụng để mô tả quá trình – từ phím được nhấn trên bàn phím đến việc kích hoạt bộ điều khiển ngắt bàn phím và sự xuất hiện của thông báo WM_KEYDOWN:
“Hardware obeshpechenie IBM PC” của Alexander Frolov và Grigory Frolov, tập 2, cuốn 1. Được xuất bản bởi Dialog-MIFI, 1992. Chương thứ hai, “Bàn phím” mô tả cách các chức năng bàn phím, cổng được sử dụng và bàn phím phần cứng ngắt;
Phần “HID / Thiết bị nhập liệu của con người” của Thư viện MSDN, mô tả phần (trình điều khiển) cấp thấp của việc xử lý nhập liệu bằng bàn phím;
Cuốn sách “Xây dựng ứng dụng Win32 hiệu quả cho Windows 64-bit” của Jeffrey Richter. Chương 27, Mô hình nhập liệu phần cứng và Trạng thái nhập liệu cục bộ, mô tả phần cấp cao của việc xử lý nhập liệu bằng bàn phím (ở chế độ người dùng).
Bàn phím như một thiết bị vật lý: cách nó hoạt động
Ngày nay, hầu hết các bàn phím là một thiết bị độc lập được kết nối với máy tính thông qua một cổng – thường là PS / 2 hoặc USB. Có hai bộ điều khiển vi mô hỗ trợ xử lý dữ liệu đầu vào bàn phím; một trong số chúng là một phần của bo mạch chủ, phần còn lại nằm trong chính bàn phím. Do đó, có thể nói rằng bàn phím PC tự nó là một hệ thống máy tính nhỏ. Nó sử dụng vi điều khiển 8042 liên tục quét các phím được nhấn trên bàn phím bất kể hoạt động của CPU.
Mỗi phím trên bàn phím có một số cụ thể được gán cho nó; nó liên quan đến bản đồ ma trận bàn phím và không phụ thuộc trực tiếp vào giá trị hiển thị trên bề mặt của chính phím đó. Con số này được gọi là “mã quét” (cái tên nhấn mạnh thực tế là máy tính quét bàn phím để tìm các lần gõ phím). Mã quét là các giá trị ngẫu nhiên được IBM chọn trong những ngày công ty tạo ra bàn phím PC đầu tiên. Mã quét không khớp với mã khóa ASCII; trên thực tế, một khóa có thể tương ứng với một số giá trị ASCII. Có thể tìm thấy bảng mã quét trong Chương 20 Nghệ thuật lập trình hợp ngữ.
Trên thực tế, bàn phím tạo ra hai mã quét cho mỗi phím: một mã cho khi người dùng nhấn một phím và một mã khác cho khi người dùng nhả phím. Thực tế là có hai mã quét là quan trọng, vì một số phím chỉ có chức năng khi được nhấn và giữ (ví dụ: Shift, Control hoặc Alt).
Khi người dùng nhấn một phím trên bàn phím, người đó sẽ đóng mạch điện. Kết quả là khi thực hiện lần quét tiếp theo, vi điều khiển phát hiện một phím nào đó đã được nhấn và gửi mã quét của phím đã nhấn về máy tính trung tâm cùng với yêu cầu ngắt. Hành động tương tự được thực hiện khi người dùng nhả phím mà họ đã nhấn trước đó.
Bộ điều khiển vi mô thứ hai nhận mã quét, chuyển đổi mã, làm cho mã này khả dụng trên cổng I / O trong 60 giờ, sau đó tạo ra các ngắt phần cứng CPU. Bộ xử lý xử lý ngắt sau đó có thể nhận mã quét từ cổng I / O được chỉ định.
Cần lưu ý rằng bàn phím có chứa bộ đệm thứ 16 bên trong mà nó sử dụng để giao tiếp với máy tính.
Tương tác bàn phím mức độ thấp thông qua cổng đầu vào / đầu ra
Tương tác với bộ điều khiển hệ thống bàn phím xảy ra thông qua cổng vào / ra 64h. Đọc bằng thẻ từ cổng này cho phép xác định trạng thái của bộ điều khiển bàn phím; ghi tiền mặt cho phép bạn gửi lệnh đến bộ điều khiển.
Bản thân sự tương tác với bộ điều khiển vi mô bên trong bàn phím diễn ra thông qua các cổng vào / ra 60h và 64h. Các bit 0 và 1 ở trạng thái byte (cổng 64h ở chế độ đọc) cho phép bạn kiểm soát tương tác: trước khi ghi dữ liệu vào các cổng này, bit 1 của cổng 64h phải bằng 0. Khi dữ liệu được đọc từ cổng 60h, bit 1 của cổng 64h là 1. Bàn phím trong / sẽ tắt các bit trong điểm lệnh (cổng 64h ở chế độ ghi) xác định xem bàn phím có đang hoạt động hay không và liệu bộ điều khiển bàn phím có gọi hệ thống hủy bỏ khi người dùng nhấn một phím hay không.
Các byte ghi vào cổng 60h được gửi đến bàn phím của bộ điều khiển, trong khi các byte ghi vào cổng 64h được gửi đến bộ điều khiển bàn phím. Để biết danh sách các lệnh hợp lệ có thể được gửi đến bộ điều khiển bàn phím, hãy xem, ví dụ, xem Sách hướng dẫn tham khảo kỹ thuật bộ điều khiển bàn phím 8042 của IBM hoặc Chương 20, Nghệ thuật lập trình ngôn ngữ.
Các byte được đọc từ cổng 60h đến từ bàn phím. Khi đọc, cổng 60h chứa mã quét của lần nhấn phím cuối cùng và ở chế độ ghi, cổng này được sử dụng để điều khiển bàn phím mở rộng. Khi sử dụng cổng 60h ở chế độ ghi, chương trình có các tùy chọn bổ sung sau:
Đặt khoảng thời gian chờ trước khi bàn phím chuyển sang chế độ tự động lặp lại
Đặt khoảng thời gian để tạo mã quét ở chế độ lặp lại tự động
Điều khiển các đèn LED nằm ở bề mặt ngoài của bàn phím – Scroll Lock, Num Lock, Caps Lock.
Tóm lại, có thể tóm tắt dữ liệu nhập bằng bàn phím, bạn chỉ cần có thể đọc giá trị cổng vào / ra 60h và 64h. Tuy nhiên, các ứng dụng cấp người dùng trên Windows không thể xử lý các cổng; chức năng này được thực hiện bởi trình điều khiển hệ điều hành.
Kiến trúc của “thiết bị đầu vào tương tác”
Vậy những quy trình nào bị gián đoạn bởi phần cứng tạo ra khi dữ liệu được gửi bởi bàn phím xuất hiện trên cổng 60h? Rõ ràng điều này được thực hiện thông qua trình xử lý bàn phím phần cứng để ngắt IK-1. Trên Windows, quá trình này được xử lý bởi hệ thống trình điều khiển i8042prt.sys. Không giống như MS DOS, khi bản thân mỗi thành phần của hệ thống đã là một luật, trong Windows tất cả các thành phần đều được xây dựng theo một kiến trúc rõ ràng và hoạt động theo các quy tắc được xác định nghiêm ngặt do giao diện chương trình thiết lập. Do đó, trước khi kiểm tra i8042prt, chúng ta hãy xem kiến trúc của các thiết bị nhập tương tác, trong đó tất cả các thành phần chương trình được liên kết với quá trình xử lý của bàn phím (và chức năng nhập “chuột”.
Trong Windows, các thiết bị dùng để điều khiển hoạt động trên máy tính được gọi là “thiết bị đầu vào tương tác”. Bàn phím là một trong những thiết bị như vậy, cùng với chuột, cần điều khiển, bi xoay, bộ điều khiển trò chơi, bánh xe, mũ bảo hiểm thực tế ảo, v.v.
Kiến trúc của các thiết bị đầu vào tương tác dựa trên tiêu chuẩn Thiết bị Giao diện Con người USB, như Diễn đàn Người triển khai USB đã báo cáo. Tuy nhiên, kiến trúc này không giới hạn ở các thiết bị USB và hỗ trợ các thiết bị đầu vào khác như bàn phím Bluetooth, bàn phím PS / 2, chuột và các thiết bị kết nối với cổng I / O 201 (cổng trò chơi).
Ở phần sau của bài viết này, chúng ta sẽ xem xét cách xây dựng ngăn xếp trình điều khiển và ngăn xếp thiết bị cho bàn phím PS / 2 (vì trong lịch sử bàn phím PS / 2 là loại thiết bị đầu tiên được mô tả ở trên). Bàn phím USB sử dụng một số yếu tố đã được giới thiệu trong quá trình phát triển phần mềm hỗ trợ cho bàn phím PS / 2).
Trình điều khiển chế độ hạt nhân cho bàn phím PS / 2
Ngăn xếp trình điều khiển cho các thiết bị đầu vào hệ thống
Bất kể bàn phím được kết nối vật lý như thế nào, trình điều khiển bàn phím sử dụng trình điều khiển hệ thống của lớp bàn phím để xử lý dữ liệu. Điều này xảy ra bất kể thiết bị được sử dụng. Trên thực tế, các trình điều khiển này được gọi là trình điều khiển lớp vì chúng hỗ trợ các yêu cầu hệ thống bất kể yêu cầu phần cứng của một lớp thiết bị cụ thể.
Trình điều khiển chức năng tương ứng (trình điều khiển cổng) hỗ trợ các hoạt động I / O tùy thuộc vào thiết bị được sử dụng. Trong Windows x86, điều này được thực hiện trong một hệ thống trình điều khiển bàn phím (i8042) và trình điều khiển chuột.
Hình 2: Ngăn xếp trình điều khiển cho thiết bị đăng nhập: Bàn phím và chuột
Ngăn xếp trình điều khiển cho bàn phím Plug and Play PS / 2
Hình 3. Ngăn xếp trình điều khiển cho bàn phím PS / 2
Ngăn xếp trình điều khiển (từ trên xuống dưới):
Kbdclass – trình điều khiển bộ lọc cấp cao, lớp bàn phím;
bổ sung trình điều khiển bộ lọc cấp cao, lớp bàn phím;
i8042prt – trình điều khiển bàn phím chức năng
tài xế xe buýt gốc
Trên Windows 2000 và các phiên bản Windows cũ hơn, trình điều khiển lớp bàn phím là Kbdclass. Các nhiệm vụ chính của trình điều khiển này là:
Hỗ trợ các hoạt động chung và lớp thiết bị phần cứng
Để hỗ trợ Plug and Play, Power Management và Windows Management Instrument (WMI)
Hỗ trợ hoạt động kế thừa
Thực hiện đồng thời các hoạt động từ nhiều thiết bị
Để thực hiện chế độ gọi lại dịch vụ lớp được trình điều khiển chức năng gọi để chuyển dữ liệu từ bộ đệm đầu vào của thiết bị sang bộ đệm dữ liệu của trình điều khiển thiết bị.
Trong Windows 2000 và các phiên bản Windows cũ hơn, trình điều khiển chức năng cho thiết bị đầu vào PS / 2 (bàn phím và chuột) là trình điều khiển i8042prt. Các chức năng chính như sau:
Để hỗ trợ các hoạt động đồng thời phụ thuộc vào phần cứng trên thiết bị đầu vào PS / 2 (bàn phím và chuột có các cổng đầu vào và đầu ra riêng biệt, nhưng sử dụng các ngắt khác nhau, Quy trình Dịch vụ Gián đoạn (ISR) và các quy trình xử lý ngắt;
Để hỗ trợ Plug and Play, Power Management và Windows Management Instrumentation (WMI);
Để hỗ trợ hoạt động cho các thiết bị cũ;
Gọi chế độ gọi lại dịch vụ lớp cho các lớp bàn phím và chuột để truyền dữ liệu từ bộ đệm nhập i8042prt sang bộ đệm dữ liệu trình điều khiển thiết bị;
Gọi một số chức năng gọi lại có thể được triển khai trong bộ lọc trình điều khiển cấp cao để điều khiển thiết bị linh hoạt
Nhân vật: 4: Tài nguyên phần cứng sử dụng trình điều khiển i8042prt
Hình 4 cho thấy danh sách các tài nguyên phần cứng sử dụng trình điều khiển i8042prt. Ví dụ, bạn có thể xem chúng bằng DeviceTree (http://www.osronline.com/article.cfm?article=97), một tiện ích được phát triển bởi Open Systems Resources. Nếu bạn đã đọc các phần trên “Bàn phím với tư cách cá nhân – cách nó hoạt động” và “Tương tác thấp với bàn phím thông qua các cổng I / O”, giá trị của các cổng đầu vào / đầu ra là 60 giờ và 64 giờ, và lỗi phần cứng (IR) 1 sẽ không phải là điều ngạc nhiên.
Một bộ lọc trình điều khiển mới có thể được thêm vào bên trên trình điều khiển lớp bàn phím trong ngăn xếp trình điều khiển được hiển thị ở trên, chẳng hạn, để thực hiện xử lý cụ thể trên dữ liệu được nhập qua bàn phím. Trình điều khiển này phải hỗ trợ việc xử lý tất cả các loại yêu cầu nhập / xuất và lệnh điều khiển (IOCTL) giống như trình điều khiển lớp bàn phím. Trong những trường hợp như vậy, trước khi dữ liệu được chuyển đến hệ thống con của chế độ người dùng, dữ liệu sẽ được chuyển tới bộ lọc trình điều khiển này để xử lý.