Tải bản đầy đủ (.pdf) (11 trang)

Bài Giảng Kỹ Thuật Lập Trình Hook.pdf

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (703.14 KB, 11 trang )

Win32 Programming Tutorials 
Kỹ thuật lập trình Hook

Kỹ thuật lập trình Hook

s

NhatPhuongLe

For more updated
info, please check
www.reaonline.net
Reverse Engineering Association


Trang 1


Kỹ thuật lập trình Hook

MỤC LỤC
I.

Các khái niệm cơ bản .................................................................................................................... 3
1. Sự khác biệt giữa lập trình Windows và DOS........................................................................... 3
2. Lập trình Windows .................................................................................................................... 3
a) Thơng điệp và hàng đợi thơng điệp ....................................................................................... 3
b) Lập trình sự kiện .................................................................................................................... 4
II. Tìm hiểu về Hook.......................................................................................................................... 7
1. Hook là gì?................................................................................................................................. 7
2. Phân loại Hook .......................................................................................................................... 9


a) Phân loại theo phạm vi hoạt động.......................................................................................... 9
b) Phân loại theo thông điệp xử lý ........................................................................................... 10
3. Thủ tục Hook – Chuỗi Hook ................................................................................................... 12
a) Thủ tục Hook ....................................................................................................................... 12
b) Chuỗi Hook.......................................................................................................................... 13
III.
Minh họa cách lập trình Hook ................................................................................................. 15
1. Cài đặt thủ tục Hook................................................................................................................ 15
2. Chuyển thông điệp đến thủ tục Hook kế tiếp .......................................................................... 16
3. Hủy bỏ cài đặt Hook................................................................................................................ 17

NhatPhuongLe
www.reaonline.net

Reverse Engineering Association

Trang 2


Kỹ thuật lập trình Hook
I. Các khái niệm cơ bản
1. Sự khác biệt giữa lập trình Windows và DOS

Windows

DOS

Lập trình sự kiện dựa vào thông điệp

Thực hiện tuần tự theo chỉ định


Đa nhiệm

Đơn nhiệm

Hỗ trợ 32 bits hay hơn nữa

Ứng dụng 16 bits

Hỗ trợ nhiều công nghệ DLL, OLE, DDE,

Không có

COM, OpenGL, DirectX
.......

.......

2. Lập trình Windows
a) Thơng điệp và hàng đợi thông điệp
Nhắc đến Windows, người ta thường nghĩ về nó như một hệ điều hành (HĐH)
dễ sử dụng, ở đó, sự tương tác giữa người dùng với các ứng dụng cũng như với các
thành phần tiện ích của Windows thông qua giao diện đồ họa (GUI) bằng các thao tác
trên bàn phím và chuột vơ cùng đơn giản. Một câu hỏi được đặt ra là: “Các ứng dụng
làm thế nào để phân loại, lưu giữ cũng như phản hồi lại những tương tác đó cho người
dùng?”. Đối với Windows vấn đề này được giải quyết một cách trọn vẹn: HĐH đưa ra
cơ chế thông điệp (message) và hàng đợi thông điệp (message queue) cùng với tập
hợp các cấu trúc dữ liệu và các hàm API hỗ trợ ứng dụng trong việc giao tiếp với
người dùng.
Windows có 2 loại hàng đợi thông điệp: Hàng đợi hệ thống (system queue) và

hàng đợi ứng dụng (application queue). Hàng đợi hệ thống là hàng đợi duy nhất và
được dùng chung cho toàn hệ thống, mọi tiến trình đang chạy đều chia sẻ hàng đợi
này. Nhiệm vụ của hàng đợi hệ thống là nó ghi lại những sự kiện phần cứng (chuột,
bàn phím, …) khi chúng xảy ra.

NhatPhuongLe
www.reaonline.net

Reverse Engineering Association

Trang 3


Kỹ thuật lập trình Hook
Mỗi sự kiện sẽ được nhanh chóng chuyển thành thơng điệp, sau đó Windows sẽ
lần lượt lấy thông điệp từ hàng đợi hệ thống để xem xét và chuyển những thơng điệp
đó đến chương trình ứng dụng tương ứng. Những thông điệp này khi được chuyển đến
ứng dụng, chúng tạo thành hàng đợi ứng dụng.
b) Lập trình sự kiện
Mỗi ứng dụng có một hàng đợi ứng dụng khác nhau. Một ứng dụng nhận các
thông điệp từ hàng đợi ứng dụng bằng cách gọi hàm GetMessage, sau đó lại gọi tiếp
TranslateMessage để dịch thơng điệp, cuối cùng gọi hàm DispatchMessage để trả lại
thông điệp cho Windows. Việc lấy thông điệp này cứ lặp đi lặp lại, tạo thành vịng lặp
thơng điệp. Vịng lặp này kết thúc khi hàm GetMessage trả về giá trị 0 nếu thơng điệp
có định danh là WM_QUIT (0x0012).

NhatPhuongLe
www.reaonline.net

Reverse Engineering Association


Trang 4


Kỹ thuật lập trình Hook
Thơng thường, chúng ta chỉ chặn để xử lý các thơng điệp có liên quan đến chức năng
của ứng dụng, các thơng điệp khác thì giao cho hàm xử lý mặc định làm việc (hàm
DefWindowsProc). Để dễ tưởng tượng, ta sẽ lấy một ví dụ khi chương trình xử lý
thơng điệp bàn phím. Khi đó, sơ đồ của q trình xử lý sự kiện bàn phím như sau:

Trình điều khiển bàn phím (Keyboard Device Driver) sẽ thơng dịch mã qt và
chuyển nó thành mã phím ảo (vitual-key code), một giá trị độc lập thiết bị, được định
nghĩa bởi hệ thống. Sau đó, trình điều khiển tạo một thông điệp bao gồm scancode,
virtual-key code cùng một số thơng tin khác (sự lặp phím, trạng thái các phím Alt,
Ctrl...) , đặt vào hàng đợi hệ thống. Hệ thống lấy thông điệp này ra khỏi hàng đợi hệ
thống và gửi đến hàng đợi thông điệp của ứng dụng. Cuối cùng, vịng lặp thơng điệp
(Message Loop) sẽ lấy thơng điệp ra khỏi hàng đợi ứng dụng và chuyển nó đến hàm
xử lý thơng điệp thích hợp để xử lý.

NhatPhuongLe
www.reaonline.net

Reverse Engineering Association

Trang 5


Kỹ thuật lập trình Hook
Ta có sơ đồ của hàng đợi thông điệp như sau:


NhatPhuongLe
www.reaonline.net

Reverse Engineering Association

Trang 6


Kỹ thuật lập trình Hook
II. Tìm hiểu về Hook
1. Hook là gì?
Hook là một cơ chế trong lập trình sự kiện, cho phép ứng dụng có thể cài đặt một
hàm giám sát vào q trình lưu chuyển các thơng điệp. Hay nói cách khác hook là 1 cơ chế
cho phép chặn các sự kiện (chuột, bàn phím, thơng điệp) trước khi chúng được gửi tới hàng
đợi của ứng dụng.

NhatPhuongLe
www.reaonline.net

Reverse Engineering Association

Trang 7


Kỹ thuật lập trình Hook
Các hàm này có thể được dùng để xử lý các sự kiện và trong nhiều trường hợp, chúng cũng
có thể thay đổi hoặc huỷ bỏ các sự kiện đó. Một điểm quan trọng cần lưu ý là các hàm này
được hệ điều hành gọi chứ khơng phải là chương trình ứng dụng của ta gọi. Các hàm nhận sự
kiện được gọi là hàm lọc (filter function) và được phân loại theo loại sự kiện mà chúng chặn.
Ví dụ: 1 hàm lọc chặn các sự kiện chuột khác với hàm lọc chặn các sự kiện bàn phím.

Trước khi Windows gọi 1 hàm lọc, hàm lọc đó phải được cài đặt, nghĩa là phải được
gắn với hook của Windows (ví dụ như hook bàn phím). Gắn 1 hay nhiều hàm lọc vào 1 hook
được gọi là thiết lập hook (setting a hook). Nếu hook có hơn 1 hàm lọc thì Windows tạo ra 1
dãy các hàm lọc (hook chain). Khi 1 hook có nhiều hàm lọc và có 1 sự kiện xảy ra bị hook
bắt được, Windows sẽ gọi hàm lọc đầu tiên trong dãy hàm lọc. Hành động này được gọi là
“gọi hook”.
Ví dụ: nếu 1 hàm lọc được gắn vào hook CBT và có 1 sự kiện bị bắt được (ví dụ: tạo 1
cửa sổ), Windows sẽ gọi hook CBT bằng cách gọi hàm đầu tiên trong dãy hàm lọc. Như vậy,
ta có sơ đồ hook như sau:

NhatPhuongLe
www.reaonline.net

Reverse Engineering Association

Trang 8


Kỹ thuật lập trình Hook
Hook có khả năng can thiệp rất sâu vào trong hệ thống, nó có thể làm cho hệ thống
hoạt động chậm chạp hơn hoặc thậm chí có thể làm treo hệ thống nếu khơng được xử lý tốt.
Bới vậy, ta chỉ nên dùng hook trong trường hợp cần thiết và phải huỷ bỏ ngay hook khi
không cần dùng đến. Để cài đặt và gỡ cài đặt hook, chương trình cần dùng các hàm
SetWindowsHookEx và UnhookWindowsHookEx.

2. Phân loại Hook
a) Phân loại theo phạm vi hoạt động
 Hook cục bộ (Thread Hook hay Local Hook): hàm giám sát được cài đặt
vào sau hàng đợi thông điệp ứng dụng (Thread message Queue hay
Application Queue), chỉ kiểm sốt các thơng điệp trong một tiến trình hay

một ứng dụng cụ thể nào đó được xác định lúc cài đặt thủ tục Hook
 Hook toàn cục (Global Hook): hàm giám sát được cài đặt vào sau hàng đợi
thông điệp hệ thống, kiểm sốt tồn bộ các tiến trình trong hệ thống
 Thủ tục hook toàn cục phải được khai báo ở một DLL tách biệt.

NhatPhuongLe
www.reaonline.net

Reverse Engineering Association

Trang 9


Kỹ thuật lập trình Hook
b) Phân loại theo thơng điệp xử lý
Loại Hook

Công dụng
 Cho phép giám sát các thông điệp được gởi tới một
cửa

WH_CALLWNDPROC

sổ.

Hệ

thống

gọi


thủ

tục

Hook

của

WH_CALLWNDPROC trước khi gởi thông điệp đến
cửa sổ đích và gọi WH_CALLWNDPROCRET sau
khi thủ tục ở cửa sổ đích xử lý xong thơng điệp.



 Hook WH_CALLWNDPROCRET truyền một con trỏ

WH_CALLWNDPROCRET

có cấu trúc CWPRETSTRUCT tới thủ tục Hook. Cấu
trúc này chứa giá trị trả về của thủ tục cửa sổ đã xử
Tải bản FULL (17 trang): />
lý thơng điệp Dự phịng: fb.com/TaiHo123doc.net

Windows gọi hàm Hook CBT trước khi tạo lập, kích
hoạt, hủy, thu nhỏ, phóng to, di chuyển, thay đổi kích
thước, ... của cửa sổ giao diện; hoặc trước khi hoàn
thành một lệnh của hệ thống; hoặc trước khi hủy bỏ một
sự kiện chuột hay bàn phím khỏi hàng đợi hệ thống;
hoặc trước khi đặt một điều khiển vào 1 input nào đó;


WH_CBT

hoặc trong lúc đồng bộ hàng đợi thông điệp hệ thống.
Giá trị trả về của thủ tục hook cho biết hệ thống sẽ chấp
nhận hay là hủy bỏ những hành động đó hay khơng.
Hook WH_CBT thường được dùng cho các chương
trình đào tạo trên máy tính.
Hệ thống gọi thủ tục WH_DEBUG trước khi gọi các thu
tục hook khác trong hệ thống. Ta có thể dùng hook này

WH_DEBUG

để xác định xem có cho phép gọi các thủ tục hook khác
hay không.
Hook này cho phép ta thực thi các tác vụ với mức ưu
tiên thấp khi các tiến trình chạy nền của nó được đặt ở

WH_FOREGROUNDIDLE

trạng

thái

nghỉ

ngơi.

Hệ


thống

gọi

thủ

tục

WH_FOREGROUNDIDLE khi chương trình chạy nền
chuẩn bị chuyển sang chế độ nghỉ ngơi (idle).

NhatPhuongLe
www.reaonline.net

Reverse Engineering Association

Trang 10


Kỹ thuật lập trình Hook

hook này cho phép một chương trình giám sát các
thơng điệp được trả về bởi các hàm GetMessage và
PeekMessage.

WH_GETMESSAGE

Ta




thể

dùng

hook

WH_GETMESSAGE để giám sát sự kiện chuột và bàn
phím và các sự kiện khác được gửi đến hàng đợi thơng
điệp.
cho phép một chương trình có thể chèn thơng điệp vào
hàng đợi thơng điệp hệ thống. Ta có thể dùng hook này
để chạy lại (play back) các sự kiện chuột và bàn phím
được

ghi

lại

(record)

trước

WH_JOURNALRECORD.

đó

bởi

Khi


hook
hook

WH_JOURNALPLAYBACK được cài đặt, chuột và bàn
WH_JOURNALPLAYBACK

phím sẽ bị đóng băng. Hook này chỉ dành riêng để hook
hệ thống, ta không thể dùng để cài đặt hook cục bộ.
Hook này trả về một giá trị time-out. Giá trị này cho hệ
thống biết phải đợi bao nhiêu mili-giây trước khi xử lý
thơng

điệp

hiện

tại

nhận

được

từ

hook

WH_JOURNALPLAYBACK. Điều này cho phép hook có
thể điều khiển khoảng thời gian của sự kiện mà nó play
back.

Cho phép giám sát và ghi lại các sự kiện vào (input
event). Hook này thường được dùng để ghi lại chuỗi các
WH_JOURNALRECORD

sự kiện chuột và bàn phím để sau đó được phát lại nhờ
hook WH_JOURNALPLAYBACKHOOK. Hook này chỉ
dành riêng để hook hệ thống, ta không thể dùng để cài
đặt hook cục bộ.

WH_KEYBOARD_LL
WH_KEYBOARD
WH_MOUSE_LL

Cho phép giám sát sự kiện vào của bàn phím được gửi
tới hàng đợi ứng dụng.
Hook giám sát thơng điệp từ bàn phím WM_KEYDOWN,
WM_KEYUP
Cho phép giám sát sự kiện vào của chuột được gửi tới
hàng đợi ứng dụng.

NhatPhuongLe
www.reaonline.net

Reverse Engineering Association

3132799

Trang 11




×