halong1955

New Member
Link tải luận văn miễn phí cho ae Kết Nối
Đồ án Phần mềm keylogger sử dụng Hook Windows
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. windows 32 api ..................................................................................................................32
IV.1. Giới thiệu............................................................................................................32
IV.2. Các hàm thường dùng ........................................................................................324 Bộ môn Mạng và Truyền Thông
Nguyễn Quang Nhật – Nguyễn Quốc Mỹ
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.PHÂ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
Ket-noi.com kho tai lieu mien phi Ket-noi.com kho tai lieu mien phiKeyLogger-Sử dụng Hook Windows 5
Nguyễn Quang Nhật – Nguyễn Quốc Mỹ
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 chức 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
Phầ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.6 Bộ môn Mạng và Truyền Thông
Nguyễn Quang Nhật – Nguyễn Quốc Mỹ
Chương 1. CƠ SỞ LÝ THUYẾT
I. GIỚ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à chức 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. Giớ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
Ket-noi.com kho tai lieu mien phi Ket-noi.com kho tai lieu mien phiKeyLogger-Sử dụng Hook Windows 7
Nguyễn Quang Nhật – Nguyễn Quốc Mỹ
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,
hay 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 hay 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ụ hay để 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 hay 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ống8 Bộ môn Mạng và Truyền Thông
Nguyễn Quang Nhật – Nguyễn Quốc Mỹ
Hệ thống gửi hay 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 hay 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
IPhần mềm and IPN IP address control
LB and LBN List box control
LM SysLink control
LVM and LVN List view control
MCM and MCN Month calendar control
PBM Progress bar
Ket-noi.com kho tai lieu mien phi Ket-noi.com kho tai lieu mien phiKeyLogger-Sử dụng Hook Windows 9
Nguyễn Quang Nhật – Nguyễn Quốc Mỹ
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ó hay để 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 phiên bản 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.10 Bộ môn Mạng và Truyền Thông
Nguyễn Quang Nhật – Nguyễn Quốc Mỹ
Đị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 cách để 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ộ hay 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 hay 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ủ đề
Ket-noi.com kho tai lieu mien phi Ket-noi.com kho tai lieu mien phiKeyLogger-Sử dụng Hook Windows 11
Nguyễn Quang Nhật – Nguyễn Quốc Mỹ
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
PostThreadMessage.
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ý. DispatchMessage một con trỏ đến bột ngọt đã được lấp đầy bởi một
cuộc gọi trước để GetMessage hay 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 hay vị trí con trỏ chuột. Một12 Bộ môn Mạng và Truyền Thông
Nguyễn Quang Nhật – Nguyễn Quốc Mỹ
ứ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 hay chức năng
PeekMessage.
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ổ
Ket-noi.com kho tai lieu mien phi Ket-noi.com kho tai lieu mien phiKeyLogger-Sử dụng Hook Windows 13
Nguyễn Quang Nhật – Nguyễn Quốc Mỹ
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ách14 Bộ môn Mạng và Truyền Thông
Nguyễn Quang Nhật – Nguyễn Quốc Mỹ
sử dụng chức năng PostQuitMessage, thườ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.
Ket-noi.com kho tai lieu mien phi Ket-noi.com kho tai lieu mien phiKeyLogger-Sử dụng Hook Windows 15
Nguyễn Quang Nhật – Nguyễn Quốc Mỹ
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ụ
- WH_SHELL: Cài đặt một thủ tục hook tiếp nhận thông báo hữu ích cho
các ứng dụng shell.
- WH_SYSMSGFILTER: Cài đặt một thủ tục móc theo dõi tin nhắn được
tạo ra như là kết quả của một sự kiện đầu vào trong hộp thoại, hộp thông báo, menu,
hay di chuyển một thanh.
III.3. Cách sử dụng
III.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.
Ví dụ về sử dụng thư viện liên kết động :
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);
III.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
Link Download bản DOC
Do Drive thay đổi chính sách, nên một số link cũ yêu cầu duyệt download. các bạn chỉ cần làm theo hướng dẫn.
Password giải nén nếu cần: ket-noi.com | Bấm trực tiếp vào Link để tải:

 
Last edited by a moderator:

Các chủ đề có liên quan khác

Top