Báo cáo đồ án cơ sở ngành mạng phần nguyên lý hệ điều hành tìm hiểu về lập trình hook và xây dựng chương trình keylogger đơn giản phần lập trình mạng xây dựng game ai là triệu phú Báo cáo đồ án cơ sở ngành mạng phần nguyên lý hệ điều hành tìm hiểu về lập trình hook và xây dựng chương trình keylogger đơn giản phần lập trình mạng xây dựng game ai là triệu phú
Trang 1Phần Nguyên lý hệ điều hành: Tìm hiểu về lập trình Hook
và Xây dựng chương trình Keylogger đơn giản.
Phần Lập trình mạng: Xây dựng game Ai là triệu phú.
Trang 2MỤC LỤC
DANH SÁCH HÌNH VẼ 4
DANH SÁCH CÁC TỪ VIẾT TẮT 4
MỞ ĐẦU 5
PHẦN 1: NGUYÊN LÝ HỆ ĐIỀU HÀNH 6
CHƯƠNG 1: CƠ SỞ LÝ THUYẾT 6
1.1 Thông điệp và hàng đợi thông điệp 6
1.1.1 Giới thiệu về thông điệp và hàng đợi thông điệp 6
1.1.2 Sử dụng thông điệp và hàng đợi thông điệp 8
1.2 Kỹ thuật Hook 9
1.2.1 Tổng quan về Hook 9
1.2.2 Các hàm thường dùng 10
1.2.3 Sử dụng Hook 11
CHƯƠNG 2: PHÂN TÍCH VÀ THIẾT KẾ HỆ THỒNG 12
2.1 Phân tích yêu cầu 12
2.1.1 Yêu cầu về chức năng 12
2.1.2 Yêu cầu về giao diện người dùng 12
2.1.3 Yêu cầu về tương thích 12
2.2 Phân tích chức năng 12
a) Chức năng chạy ẩn ứng dụng 12
b) Bắt sự kiện từ bàn phím 13
c) Ghi ra tệp văn bản theo ngày tháng, theo từng ứng dụng 13
CHƯƠNG 3: TRIỂN KHAI VÀ ĐÁNH GIÁ KẾT QUẢ 14
3.1 Môi trường triển khai 14
3.2 Kết quả giao diện một số chức năng chương trình 14
3.3 Đánh giá và nhận xét 16
KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN 16
Những kết quả đạt được 16
Những vấn đề còn tồn lại 16
Hướng phát triển 16
PHẦN 2: LẬP TRÌNH MẠNG 17
CHƯƠNG 1: CƠ SỞ LÝ THUYẾT 17
Trang 31.1 Giao thức TCP/IP 17
1.2 Socket và Port 17
1.3 Mô hình Client/Server 18
1.3.1 Giới thiệu 18
1.3.2 Mô hình truyền tin Client/Server 19
CHƯƠNG 2: PHÂN TÍCH VÀ THIẾT KẾ HỆ THỐNG 19
2.1 Phân tích yêu cầu 19
2.1.1 Yêu cầu về chức năng 19
2.1.2 Yêu cầu về tương thích 19
2.2 Thiết kế hệ thống 20
a) Sơ đồ Use-Case 20
b) Sơ đồ lớp 20
CHƯƠNG 3: TRIỂN KHAI VÀ ĐÁNH GIÁ KẾT QUẢ 21
3.1 Môi trường triển khai 21
3.2 Kết quả giao diện một số chức năng chương trình 21
3.3 Đánh giá và nhận xét 24
KẾT LUẬN CHUNG 25
Trang 4DANH SÁCH HÌNH VẼ
Hình 1.1: Mô tả bắt sự kiện từ bàn phím
Hình 1.2: Kết quả ghi lại mã ASCII của các phím đã gõ
Hình 1.3: Kết quả file.txt ghi lại các phím đã gõ
Hình 2.1: Mô hình truyền tin Client/Server
Hình 2.2: Sơ đồ Use-Case
Hình 2.3: Sơ đồ lớp
Hình 2.4: Giao diện khi chạy Server
Hình 2.5: Giao diện khi chạy Client
Hình 2.6: Giao diện khi Client đăng nhập thành công
Hình 2.7: Giao diện chính của game
Hình 2.8: Giao diện khi nhấn nút “?”- hướng dẫn chơi game
Hình 2.9: Giao diện khi chơi game
DANH SÁCH CÁC TỪ VIẾT TẮT
Từ viết tắt Diễn giải
TCP/IP Transmission Control Protocol/Internet Protocol
MS-DOS Microsoft Disk Operating System
DLL Dynamic Link Library
IDE Integrated Development Environment
Trang 5MỞ ĐẦU
Đồ án Cơ sở ngành Mạng là học phần rất quan trọng trong quá trình học tập của sinh viên Đồ án này giúp sinh viên tiếp cận và rèn luyện các kiến thức, kỹ năng liên quan đến Môn học Nguyên lý hệ điều hành và Lập trình mạng
Trong khuôn khổ đồ án, dưới sự hướng dẫn của Nguyễn Tấn Khôi, em đã chọn
đề tài Xây dựng chương trình Keylogger đơn giản cho phần nguyên lý hệ điều hành
và Xây dựng game “Ai là triệu phú” chơi qua mạng cho phần lập trình mạng Thông qua đề tài này, em đã hiểu rõ hơn phần nào về nguyên lý hoạt động xử lý thông điệp của hệ điều hành cũng như là biết được cách lập trình với giao thức TCP/IP theo mô hình Client/Server.
Do thời gian và kiến thức của em còn hạn chế nên không tránh khỏi những sai sót nhất định trong quá trình làm đồ án này Rất mong nhận được sự góp ý của quý thầy cô
Em xin chân thành cảm ơn!
Trang 6PHẦN 1: NGUYÊN LÝ HỆ ĐIỀU HÀNH
TIÊU ĐỀ: XÂY DỰNG CHƯƠNG TRÌNH KEYLOGGER ĐƠN GIẢN
CHƯƠNG 1: CƠ SỞ LÝ THUYẾT
1.1 Thông điệp và hàng đợi thông điệp
1.1.1 Giới thiệu về thông điệp và hàng đợi thông điệp
Không giống như các ứng dụng trên nền MS-DOS, các ứng dụng trên nềnWindows thì hướng sự kiện, chúng không thực hiện các cuộc gọi hàm rõ ràng để lấyđầu vào, thay vào đó chúng chờ cho hệ thống chuyển đầu vào đến chúng
a) Thông điệp windows
Hệ thống chuyển đầu vào cho một thủ tục cửa sổ dưới dạng thông điệp Thôngđiệp được tạo bởi cả hệ thống và ứng dụng Hệ thống tạo ra một thông điệp tại mỗi
sự kiện đầu Hệ thống cũng tạo ra các thông điệp để đáp ứng với những thay đổitrong hệ thống do ứng dụng gây ra Một ứng dụng có thể tạo ra các thông điệp đếntrực tiếp các cửa sổ riêng để thực thi các tác vụ hoặc để giao tiếp với các cửa sổtrong ứng dụng khác
Hệ thống gửi một thông điệp đến một thủ tục cửa sổ với một bộ gồm bốn thamsố: một cửa sổ xử lý, một định danh thông điệp, và hai giá trị được gọi là thông sốthông điệp
b) Các loại thông điệp
Thông điệp do hệ thống xác định
Hệ thống gửi hoặc đăng một thông điệp do hệ thống xác định khi nó giao tiếp vớimột ứng dụng Nó sử dụng các thông điệp này để kiểm soát các hoạt động của cácứng dụng và cung cấp đầu vào và các thông tin khác cho các ứng dụng để xử lý.Ứng dụng cũng có thể gửi hoặc đăng các thông điệp do hệ thống xác định Các ứngdụng thường sử dụng các thông điệp này để kiểm soát hoạt động của các cửa sổđiều khiển được tạo ra bằng cách sử dụng các lớp cửa sổ được đăng ký trước
Thông điệp do ứng dụng xác định
Một ứng dụng có thể tạo các thông điệp để được sử dụng bởi các cửa sổ riêngcủa chính nó hoặc để giao tiếp với các cửa sổ trong các tiến trình khác
c) Định tuyến thông điệp
Hệ thống sử dụng hai phương pháp để định tuyến thông điệp đến một thủ tục cửasổ: đăng thông điệp vào hàng đợi được gọi là hàng đợi thông điệp, một đối tượng bộ
Trang 7nhớ do hệ thống xác định lưu trữ thông điệp tạm thời và gửi thông điệp trực tiếp đếnthủ tục cửa sổ.
Thông điệp được xếp hàng đợi
Hệ thống có thể hiển thị bất kỳ cửa số nào tại một thời điểm Để định tuyến đầuvào 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
Thông điệp không xếp hàng đợi
Các thông điệp không xếp hàng đợi được gửi đi ngay lập tức đến thủ tục cửa sổđích, bỏ qua hàng đợi thông điệp hệ thống và hàng đợi thông điệp luồng Hệ thốngthông điệp gửi các thông điệp không xếp hàng đợi để báo cho một cửa sổ các sựkiện có ảnh hưởng đến nó
d) Xử lý thông điệp
Một ứng dụng phải loại bỏ và xử lý các thông điệp được đăng đến hàng đợi thôngđiệp của luồng của nó Một ứng dụng đơn luồng thông điệp sử dụng một vòng lặpthông điệp trong hàm WinMain của nó để loại bỏ và gửi thông điệp đến các thủ tụccửa sổ thích hợp để xử lý Các ứng dụng có nhiều luồng có thể bao gồm một vònglặp thông điệp trong mỗi luồng tạo ra một cửa sổ
Vòng lặp thông điệp
Một vòng lặp thông điệp đơn giản bao gồm một cuộc gọi hàm tới một trong bahàm sau: GetMessage, TranslateMessage và DispatchMessage Lưu ý rằng nếu cólỗi, GetMessage trả về –1, do đó cần có sự kiểm tra đặc biệt
Hàm GetMessage lấy một thông điệp từ hàng đợi và sao chép nó vào một cấutrúc kiểu MSG Nó trả về một giá trị nonzero, trừ khi nó gặp thông điệpWM_QUIT, trong trường hợp này nó trả về FALSE và kết thúc vòng lặp Trongmột ứng dụng đơn luồng, kết thúc vòng lặp thông điệp thường là bước đầu tiêntrong việc đóng ứng dụng Một ứng dụng có thể kết thúc vòng lặp của riêng nó bằngcách sử dụng hàm PostQuitMessage, thông điệp phản hồi với thông điệpWM_DESTROY trong thủ tục cửa sổ của cửa sổ chính của ứng dụng
Một vòng lặp thông điệp của luồng phải bao gồm TranslateMessage nếu luồng đódùng để nhận đầu vào ký tự từ bàn phím Hệ thống tạo các thông điệp phím ảo(WM_KEYDOWN và WM_KEYUP) mỗi lần người dùng nhấn một phím Mộtthông điệp phím ảo chứa mã phím ảo xác định phím nào được nhấn, nhưng không
có giá trị ký tự Để lấy giá trị này, vòng lặp thông điệp phải chứa TranslateMessage,thông dịch thông điệp phím ảo thành một thông điệp ký tự (WM_CHAR) và đặt nótrở lại hàng đợi thông điệp ứng dụng Thông điệp ký tự sau đó có thể được xóa bỏkhi một lần lặp tiếp theo của vòng lặp thông điệp và gửi đến một thủ tục cửa sổ
Trang 8Chỉ cần một vòng lặp thông điệp cho một hàng đợi thông điệp, ngay cả khi mộtứng dụng có chứa nhiều cửa sổ DispatchMessage luôn gửi thông điệp đến cửa sổthích hợp; điều này là bởi vì mỗi thông điệp trong hàng đợi là một cấu trúc MSG cóchứa các xử lý của cửa sổ mà thông điệp thuộc về.
Thủ tục cửa sổ
Một thủ tục cửa sổ là một hàm nhận và xử lý tất cả các thông điệp được gửi đếncửa sổ đó Mỗi lớp cửa sổ có một thủ tục cửa sổ, và mỗi cửa sổ được tạo ra với lớp
đó sử dụng cùng một thủ tục cửa sổ để trả lời các thông điệp
Hệ thống sẽ gửi một thông điệp đến một thủ tục cửa sổ bằng cách chuyển dữ liệuthông điệp làm đối số cho 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 cho thông điệp; nó kiểm tra mã nhận dạng thông điệp, trong khi xử
lý thông điệp, sử dụng thông tin được quy định bởi các tham số thông điệp
1.1.2 Sử dụng thông điệp và hàng đợi thông điệp
a) Tạo vòng lặp thông điệp
Hệ thống không tự động tạo hàng đợi thông điệp cho mỗi luồng Thay vào đó, hệthống tạo ra một hàng đợi thông điệp duy nhất cho các luồng thực hiện các thao tácyêu cầu một hàng đợi thông điệp Nếu luồng tạo một hoặc nhiều cửa sổ, phải cungcấp vòng lặp thông điệp; vòng lặp thông điệp này lấy thông điệp từ hàng đợi thôngđiệp của luồng và gửi chúng đến các thủ tục cửa sổ thích hợp
Bởi vì hệ thống hướng các thông điệp đến các cửa sổ riêng lẻ trong một ứngdụng, nên một luồng phải tạo ít nhất một cửa sổ trước khi bắt đầu vòng lặp thôngđiệp của nó Hầu hết các ứng dụng có chứa một luồng đơn tạo ra các cửa sổ Mộtứng dụng đặc thù đăng ký lớp cửa sổ cho cửa sổ chính của nó, tạo và hiển thị cửa sổchính, và sau đó bắt đầu vòng lặp thông điệp của nó - tất cả trong hàm WinMain
b) Kiểm tra hàng đợi thông điệp
Thỉnh thoảng, một ứng dụng cần kiểm tra nội dung của hàng đợi thông điệp củamột luồng từ bên ngoài vòng lặp thông điệp của luồng Trừ khi ứng dụng định kỳkiểm tra hàng đợi thông điệp trong quá trình hoạt động đối với các thông điệp chuột
và bàn phím, nó sẽ không phản hồi lại đầu vào của người dùng cho đến sau khi thaotác hoàn tất Lý do cho điều này là hàm DispatchMessage trong vòng lặp thông điệpcủa luồng không trả về cho đến khi thủ tục cửa sổ kết thúc xử lý một thông điệp
Trang 9c) Đăng thông điệp
Bạn có thể đăng thông điệp lên hàng đợi thông điệp bằng cách sử dụng hàmPostMessage PostMessage đặt một thông điệp ở cuối hàng đợi thông điệp của mộtluồng và trả về ngay lập tức mà không cần đợi luồng xử lý thông điệp
d) Gửi thông điệp
Hàm SendMessage được sử dụng để gửi thông điệp trực tiếp đến một thủ tục cửa
sổ SendMessage gọi thủ tục cửa sổ và đợi thủ tục đó xử lý thông điệp và trả lại kếtquả
1.2 Kỹ thuật Hook
1.2.1 Tổng quan về Hook
Một hook là một cơ chế mà một ứng dụng có thể chặn các sự kiện, chẳng hạnnhư các thông điệp, các hoạt động của chuột và các phím Một hàm chặn một loại
sự kiện cụ thể được gọi là thủ tục hook Một thủ tục hook có thể hành động trên mỗi
sự kiện nó nhận được, và sau đó sửa đổi hoặc loại bỏ sự kiện
a) Chuỗi Hook
Hệ thống hỗ trợ nhiều kiểu hook khác nhau; mỗi loại cung cấp quyền truy cậpvào một khía cạnh khác nhau của cơ chế xử lý thông điệp của nó Ví dụ, một ứngdụng có thể sử dụng hook WH_MOUSE để theo dõi lưu lượng thông điệp chothông điệp chuột
Hệ thống duy trì một chuỗi hook riêng biệt cho từng loại hook Một chuỗi hook
là một danh sách các con trỏ tới các hàm gọi lại đặc biệt, được ứng dụng định nghĩađược gọi là các thủ tục hook Khi một thông điệp xảy ra được liên kết với một loạihook cụ thể, hệ thống sẽ truyền thông điệp đến từng thủ tục hook được tham chiếutrong chuỗi hook, cái này sau cái kia Tác động của một thủ tục hook có thể phụthuộc vào độc phức tạp của loại hook Các thủ tục hook cho một số loại hook chỉ cóthể theo dõi thông điệp; những loại khác có thể sửa đổi thông điệp hoặc ngừng tiếntrình của nó thông qua chuỗi, ngăn cản thông điệp tiếp cận thủ tục hook tiếp theohoặc cửa sổ đích
b) Thủ tục Hook
Thủ tục hook phải có cú pháp sau:
LRESULT CALLBACK HookProc(
int nCode,
WPARAM wParam,
Trang 10HookProc là một sự giữ chỗ cho tên một ứng dụng được định nghĩa.
Tham số nCode là một mã hook mà thủ tục hook sử dụng để xác định hành động
để thực hiện Giá trị của mã hook phụ thuộc vào loại hook; mỗi loại có bộ mã hookđặc trưng riêng Các giá trị của các tham số wParam và lParam phụ thuộc vào mãhook, nhưng chúng đặc thù chứa thông tin về một thông điệp được gửi hoặc đượcđăng
c) Các kiểu Hook
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áchkhá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: WH_KEYBOARD,WH_KEYBOARD_LL, WH_MOUSE, WH_MOUSE_LL…và một số kiểu Hookkhác
1.2.2 Các hàm thường dùng
a) SetWindowsHookEx
HHOOK WINAPI SetWindowsHookEx(
in int idHook,
in HOOKPROC lpfn,
in HINSTANCE hMod,
in DWORD dwThreadId
Trang 11c) CallNextHookEx
LRESULT WINAPI CallNextHookEx(
in_opt HHOOK hhk,
in int nCode,
in WPARAM wParam,
in LPARAM lParam
);
d) LowLevelKeyboardProc
LRESULT CALLBACK LowLevelKeyboardProc(
in int nCode,
in WPARAM wParam,
in LPARAM lParam
);
1.2.3 Sử dụng Hook
Có thể cài đặt một thủ tục hook bằng cách gọi hàm SetWindowsHookEx và chỉ
rõ kiểu của thủ tục gọi hook, cho dù thủ tục nên được liên kết với tất cả các luồngtrong cùng một máy tính như là luồng gọi hoặc với một luồng cụ thể và một con trỏđến đầu vào thủ tục
Bạn phải đặt một thủ tục hook toàn cục trong một DLL riêng biệt từ ứng dụng càiđặt thủ tục hook Ứng dụng cài đặt phải có xử lý cho mô-đun DLL trước khi nó cóthể cài đặt thủ tục hook Để lấy một xử lý đến module DLL, hãy gọi hàmLoadLibrary với tên của DLL Sau khi đã có được xử lý, có thể gọi hàmGetProcAddress để lấy một con trỏ đến thủ tục hook Cuối cùng, sử dụngSetWindowsHookEx để cài đặt địa chỉ thủ tục hook trong chuỗi hook thích hợp.SetWindowsHookEx chuyển mô-đun xử lý, con trỏ tới điểm nhập thủ tục hook và 0cho luồng định danh, chỉ ra rằng thủ tục hook phải được liên kết với tất cả các luồngtrong cùng một màn hình với tư cách là luồng gọi
Bạn có thể giải phóng một luồng thủ tục hook (loại bỏ địa chỉ của nó khỏi chuỗihook) bằng cách gọi hàm UnhookWindowsHookEx, chỉ định xử lý cho thủ tục hook
để giải phóng Giải phóng một thủ tục hook ngay sau khi ứng dụng của bạn khôngcòn cần đến nó nữa
Trang 12CHƯƠNG 2: PHÂN TÍCH VÀ THIẾT KẾ HỆ THỒNG
2.1 Phân tích yêu cầu
2.1.1 Yêu cầu về chức năng
Chương trình ghi lại toàn bộ thao tác phím của người dùng và lưu ra một tập tinvăn bản
2.1.2 Yêu cầu về giao diện người dùng
2.1.3 Yêu cầu về tương thích
Để đảm bảo có sự tương tác tốt nhất với Windows, trong chương trình này em đã
sử dụng ngôn ngữ C++ trên môi trường DevC++
b) Ghi ra tệp văn bản theo ngày tháng, theo từng ứng dụng.
Khi người dùng nhấn phím, thì ứng dụng cũng đồng thời bắt phím và ghi phím
đó ra tệp Tệp ghi ra theo từng ngày tháng cụ thể và tương ứng với ứng dụng tươngtác
Trang 13CHƯƠNG 3: TRIỂN KHAI VÀ ĐÁNH GIÁ KẾT QUẢ
3.1 Môi trường triển khai
Chương trình được triển khai chạy thử nghiệm trong môi trường Windows 10
3.2 Kết quả giao diện một số chức năng chương trình
Hình 1.2: Kết quả hiện thị Mã ASCII của các phím đã gõ
Trang 14Hình 1.3: Kết quả file.txt ghi lại các phím đã gõ
Trang 153.3 Đánh giá và nhận xét
Sau khi triển khai và chạy thử ứng dụng, em đã rút ra các nhận xét đánh giá sau:
Chương trình không làm tăng đáng kể thời gian hiển thị phím bấm
Chương trình ghi lại được 100% thao tác phím
Các tập tin ghi lại theo ngày tháng và ứng dụng mà người dùng gõ chính xáchoàn toàn
Chương trình sẽ hoạt động không chính xác nếu có các ứng dụng hook khácnhư các chương trình gõ tiếng việt (Unikey, Vietkey…)
KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN
Những kết quả đạt được
Chương trình ghi lại 100% thao tác phím
Các tập tin ghi lại theo ngày và tên ứng dụng mà người dùng gõ phím thông tin chính xác 100%
Những vấn đề còn tồn lại
Có các tự lạ trong bản Log Nguyên nhân là do các ký tự Unicode do chươngtrình Unicode (Unikey, Vietkey) gửi đến
Hướng phát triển
Cho phép hiển thị Unicode trong bản log
Mã hóa các tập tin log để người sử dụng không biết được là đang bị theo dõi
Kết hợp gửi thông tin về mail
Thiết kế bổ sung thêm phần giao diện
Vì đây là ứng dụng mang tính đánh cắp thông tin người khác nên cần chạy ẩn