键盘输入截获系统的设计与实现_第1页
键盘输入截获系统的设计与实现_第2页
键盘输入截获系统的设计与实现_第3页
键盘输入截获系统的设计与实现_第4页
键盘输入截获系统的设计与实现_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

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

文档简介

键盘输入截获系统的设计与实现摘要Windows系统键盘截获系统,在我们的生活中是很常见的,比如在军方的某些系统中,为确保某些机密信息不被泄露出去,就要求在工作人员在于外界交流的时候,无意中输出的可能隐含机密信息不被发送出去,此时可以设置关键字,使用钩子来屏蔽这些信息,不让其发送出去,这样就很好的杜绝了机密信息的泄露的发生,提高军方系统的安全性,以上是一个很常见的例子,那么当提及到Windows系统信息截获,不得不想到动态链接库和钩子,动态链接库在Windows系统中无处不在,编程过程中,调用的所有的API都是从系统动态链接库导出的,实际上,不使用动态链接库几乎是不可能的,因为Windows提供给编程人员的几乎所有功能都驻留在动态链接库中。Windows应用程序的运行模块是基于消息驱动的,任何线程只要注册了窗口类都会有一个消息队列来接收用户的输入消息和系统消息。为了取得特定线程接收或者发送的消息,就要用到Windows提供的钩子。Windows钩子广泛应用于各种检测侦查程序中,如输入监视、API截获等。一般的钩子函数都必须写在动态链接库中,以便注入到其进程。一、需求分析1、实验要求:设计一个基于Windows或Linux的键盘输入捕获系统,对特定键盘输入进行检测过滤。要求如下:设计一个键盘钩子程序捕获键盘动作,捕获任意窗口上的键盘输入,并进行记录;能监控QQ、MSN、word、Excel、记事本、IE网页等应用程序;设置一些关键词,根据键盘输入,设计一种关键词检测的方法,能在记录的键盘输入中检测出关键词出现的位置;对输入的关键词,进行过滤,阻止其在相关的应用程序中输出;2、实验环境:MicrosoftVisualstudio2010二、实验分组情况:三、实验原理概述:钩子:钩子是Windows中可以拦截事件的一种机制,可以指定一个函数作为特定类型的被拦截事件的钩子过程。钩子过程可以对拦截的每个事件进行处理。不同类型的钩子可以为消息处理机制的不同方面提供访问,例如,WH_MOUSE钩子可以监视与鼠标操作相关的消息。系统为每一个类型的钩子维护一个独立的钩子链,其中包含指定一组作为钩子过程的回调函数指针。当与指定类型的钩子相关联的消息发生时,系统会把消息传递给钩子链中相关钩子过程。关于钩子需要了解到以下几点:钩子是用来截获系统的消息流的。利用钩子,可以处理任何感兴趣的消息,包括其他线程的消息。截获消息后,用于处理消息的子程序叫做钩子函数,它是应用程序自定义的一个函数,在安装钩子时要把这个函数的地址告诉Windows.系统中同一时间可以有多个进程安装钩子。多个钩子函数在一起组成钩子链。所以在处理截获到的消息时,应该把消息事件传递下去,以便其他钩子也有机会处理这一消息。钩子会使系统变慢,因为他增加了系统对每个消息的处理量。仅应该在必要时才安装钩子,而且在不需要时尽快移除。全局钩子:钩子可以分为全局钩子和特定线程钩子,全局钩子的钩子过程只能在Dll中定义,全局钩子可以监视与调用线程位于同一个桌面的所有线程的消息,然后调用钩子过程对拦截的消息进行处理。线程钩子:钩子的另一种类型是特定线程钩子,他只能监视一个单独的线程的消息。特定的线程钩子的钩子过程可以在应用程序的任何位置,每个线程都有自己的私有内存空间,所以一个线程不能调用其他线程的代码,也不能访问其他线程的内存数据,这样,如果在安装钩子的线程中定义钩子的过程,则其他正在运行的线程被拦截消息后,就不能成功调用钩子过程了。动态链接库:动态链接库是应用程序的一个模块,这个模块用于导出一些函数和数据供程序中的其他模块使用。可以从以下3个方面来理解这个概念:(1)动态链接库是应用程序的一部分,他的任何操作都是代表应用程序进行的。所以动态链接库在本质上与可执行文件没有区别,都是作为模块被进程加载到自己的空间地址的。(2)动态链接库在程序编译时并没有被插入到可执行文件中,在程序运行时整个库的代码才会调入内存,这就是所谓的“动态链接”。(3)如果有多个程序用到同一个动态链接库,Windows在物理内存中只保留一份库的代码,仅通过分页机制将这份代码映射到不同的进程中,这样,不管有多少程序同时使用一个库,库代码实际占用的物理内存永远只有一份。四、总体设计:为实现实验要求的键盘输入截获系统功能,由实验要求我们可以了解到,我们要实现的功能主要包含以下几点,首先是设置的钩子函数能够截获键盘的输入,这是最基本的功能,因为我们要实现的是键盘的截获,而不是鼠标或者其他输入设别的信息的截获,所以可以理解为特点线程输入信息的截获,其次是能够监控能监控QQ、MSN、word、Excel、记事本、IE网页等应用程序,即为设置一个全局钩子即可截获所有任何可编辑界面的输入。再次是能够保存截获信息,即记录输入信息,最后是过滤关键字,我们设置为屏蔽某些关键字,当点击这一关键字是,在主窗口上是不能显示的,但是可以在保存文件中可以看到被屏蔽的关键字,以上四点就是要实现的主要功能。在我们的程序中,我们使用了动态链接库CppHookDll和CppWindowsHook两个程序,后者为应用程序,在运行是动态调用动态链接库CppHookDll,当完成动态链接库的加载后,就开始实现钩子的相关操作,钩子的安装,卸载,截获并向主窗口传送信息等。同时在应用程序对话框的主窗口显示键盘的输入信息。为实现该键盘截获系统的功能,以下是对动态链接库和应用程序中主要函数的功能的大体介绍:CppHookDll中:LRESULTCALLBACKKeyboardHookProc()//钩子键盘函数BOOLWINAPISetKeyboardHook()//安装或者卸载钩子函数LRESULTCALLBACKLowKeyboardHookProc()//低级键盘钩子函数BOOLWINAPISetLowKeyboardHook()//低级键盘钩子设置函数CppWindowsHook中:CCppWindowsHookApp::CCppWindowsHookApp()//用于添加构造代码BOOLCCppWindowsHookApp::InitInstance()//完成初始化功能。CppWindowsHookDlg中:BOOLCCppWindowsHookDlg::OnInitDialog()//初始化对话框¨longCCppWindowsHookDlg::OnHookKeyboard()//键盘钩子处理函数longCCppWindowsHookDlg::OnHookLowKeyboard()//低级键盘钩子处理函数voidCCppWindowsHookDlg::OnBnClickedSethook()//安装或者卸载全局钩子函数voidCCppWindowsHookDlg::OnBnClickedSethookthread()//安装或卸载线程键盘钩子函数voidCCppWindowsHookDlg::OnBnClickedSethookinput()//设置钩子输入函数,用于屏蔽某些键voidCCppWindowsHookDlg::OnBnClickedResettext()//清空函数主函数界面显示如下:五、详细设计:(含流程图)1、CCppWindowsHookDlg::CCppWindowsHookDlg()函数功能:CppWindowsHookDlg类的构造函数的实现,其中调用了基类的构造函数,以:CDialog(CCppWindowsHookDlg::IDD,pParent)//CCppWindowsHookDlg父类的ID以及以及父窗口句柄为参数。函数代码:CCppWindowsHookDlg::CCppWindowsHookDlg(CWnd*pParent/*=NULL*/){ m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);//通过AfxGetApp()函数来获得全局的唯一的应用程序(即theApp),然后调用theApp对象的//然后调用theApp对象的LoadIcon()函数获得指定图标的句柄。}宏定义消息映射表功能:宏定义消息映射表,第一个参数为资源里的ID,后一个为调用的函数名。/括号里第一个参数,是资源里的ID,第二个参数是当按动时调用的函数名。//以鼠标为例括号里第一个参数,是资源里的ID,是鼠标腰部那个钮)第二个参数是当腰部那个钮按动时调用的函数名。ON_BN_CLICKED是宏。它与ON_COMMAND宏一样。函数代码:ON_BN_CLICKED(IDC_BUTTON_WAIST_ACTION,OnButtonWaistAction)BEGIN_MESSAGE_MAP(CCppWindowsHookDlg,CDialog)//这是消息映射的实现,其中有6个消息ON_MESSAGE(WM_KEYSTROKE,OnHookKeyboard)//键盘钩子处理函数以及资源ID映射ON_MESSAGE(WM_KEYINPUT,OnHookLowKeyboard)//低级键盘钩子处理函数以及资源ID映射ON_BN_CLICKED(IDC_SETHOOK,&CCppWindowsHookDlg::OnBnClickedSethook)//“全局键盘钩子”按钮对应的函数和操作ON_BN_CLICKED(IDC_SETHOOKTHREAD,&CCppWindowsHookDlg::OnBnClickedSethookthread)//“线程键盘钩子”按钮对应的函数和操作ON_BN_CLICKED(IDC_SETHOOKINPUT,&CCppWindowsHookDlg::OnBnClickedSethookinput)//低级键盘屏蔽按钮对应的函数和操作ON_BN_CLICKED(IDC_RESETTEXT,&CCppWindowsHookDlg::OnBnClickedResettext)//“清空”按钮对应的函数和操作END_MESSAGE_MAP()初始化对话框函数函数功能:OnInitDialog()初始化对话框,函数代码:BOOLCCppWindowsHookDlg::OnInitDialog()//初始化对话框{ CDialog::OnInitDialog();//设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动执行此操作 SetIcon(m_hIcon,TRUE); //设置大图标 SetIcon(m_hIcon,FALSE); //设置小图标 returnTRUE;//除非将焦点设置到控件,否则返回TRUE}4、键盘钩子函数函数功能::OnHookKeyboard()这一个函数是针对能够具体显示到所编辑文本框中的键盘输入的键的设置,如0-1.A-Z等,在运行时加载动态链接库,当完成了钩子的安装时,即可截获键盘输入,同时将键的信息发送到本应用程序的主窗口上显示。同时保存用户按键到.txt文件中。可查看截获内容。函数代码://键盘钩子处理函数longCCppWindowsHookDlg::OnHookKeyboard(WPARAMwParam,LPARAMlParam){CStringstr; GetKeyNameText(lParam,str.GetBuffer(80),80);//获得缓冲区 str.ReleaseBuffer();//释放内存 CStringstrItem(L"用户按键:"+str+L"\r\n");//userstrike//截获内容保存FILE*fp; fp=fopen("key.txt","a"); fprintf(fp,"%s",str); fclose(fp);//添加键数据到编辑框中 CStringstrEdit; GetDlgItem(IDC_MSG)->GetWindowText(strEdit); GetDlgItem(IDC_MSG)->SetWindowText(strItem+strEdit); return0;}低级键盘钩子处理函数CCppWindowsHookDlg::OnHookLowKeyboard()函数功能:函数代码:longCCppWindowsHookDlg::OnHookLowKeyboard(WPARAMwParam,LPARAMlParam){ CStringstr; //虚拟按键码转换成扫描码(所要求的GetKeyNametext) UINTscanCode=MapVirtualKeyEx(wParam,0,GetKeyboardLayout(0));switch(wParam)//按键码{//某些键通过上述功能最终被映射到数字键盘,因为它们的虚拟键可以通过数字键盘来生成.如果它是已知数字,设置扩展位: //如下,否则将以十六进制的形式显示出来 caseVK_INSERT://对应ASII码为45 caseVK_DELETE://对应46 caseVK_HOME://对应36 caseVK_END://对应35 caseVK_NEXT://Pagedown对应34 caseVK_PRIOR://Pageup对应33 caseVK_LEFT://对应46 caseVK_RIGHT://对应39 caseVK_UP://对应38 caseVK_DOWN://对应40 scanCode|=0x100; break; }//GetKeyNameText()所得的扫描码的格式与WM_KEYDOWN相同GetKeyNameText(scanCode<<16,str.GetBuffer(80),80);str.ReleaseBuffer();CStringstrItem(L"键盘输入:"+str+L"\r\n");//截获内容保存FILE*fp; fp=fopen("key.txt","a"); fprintf(fp,"%s",str); fclose(fp);//添加键信息到编辑框中 CStringstrEdit; GetDlgItem(IDC_MSG)->GetWindowText(strEdit); GetDlgItem(IDC_MSG)->SetWindowText(strItem+strEdit);return0;}6、安装或者卸载全局键盘钩子函数函数功能:OnBnClickedSethook()函数代码:voidCCppWindowsHookDlg::OnBnClickedSethook(){ CStringstrButtonText; GetDlgItem(IDC_SETHOOK)->GetWindowText(strButtonText);//获取点击的按钮信息 if(strButtonText=="SetHook(Global)")//检测是否是全局钩子按钮 { //安装 if(!SetKeyboardHook(TRUE,0,m_hWnd))//如果不是 { AfxMessageBox(L"钩子安装失败!"); return; } GetDlgItem(IDC_SETHOOK)->SetWindowText(L"UnsetHook(Global)");//不能进行全局钩子的安装 GetDlgItem(IDC_SETHOOKTHREAD)->EnableWindow(FALSE);//不进行钩子的安装,不占用资源 GetDlgItem(IDC_SETHOOKINPUT)->EnableWindow(FALSE);} else {if(!SetKeyboardHook(FALSE))//如果是全局钩子 {AfxMessageBox(L"钩子安装成功"); return; }GetDlgItem(IDC_SETHOOK)->SetWindowText(L"SetHook(Global)");//设置全局钩子 GetDlgItem(IDC_SETHOOKTHREAD)->EnableWindow(TRUE);//进行钩子相关操作 GetDlgItem(IDC_SETHOOKINPUT)->EnableWindow(TRUE); }}7、安装或者卸载线程键盘钩子函数函数功能:OnBnClickedSethookthread()函数代码:voidCCppWindowsHookDlg::OnBnClickedSethookthread(){ CStringstrButtonText; GetDlgItem(IDC_SETHOOKTHREAD)->GetWindowText(strButtonText); if(strButtonText=="SetHook(Thread)") { //InstallHook if(!SetKeyboardHook(TRUE,::GetCurrentThreadId(),m_hWnd))//获取线程ID { AfxMessageBox(L"钩子安装失败!"); return; } GetDlgItem(IDC_SETHOOKTHREAD)->SetWindowText(L"UnsetHook(Thread)"); GetDlgItem(IDC_SETHOOK)->EnableWindow(FALSE); GetDlgItem(IDC_SETHOOKINPUT)->EnableWindow(FALSE); } else { if(!SetKeyboardHook(FALSE)) { AfxMessageBox(L"钩子安装成功!"); return; }GetDlgItem(IDC_SETHOOKTHREAD)->SetWindowText(L"SetHook(Thread)"); GetDlgItem(IDC_SETHOOK)->EnableWindow(TRUE); GetDlgItem(IDC_SETHOOKINPUT)->EnableWindow(TRUE); }}设置钩子输入函数(屏蔽指定键)函数功能:OnBnClickedSethookinput()函数代码:voidCCppWindowsHookDlg::OnBnClickedSethookinput(){ CStringstrButtonText; GetDlgItem(IDC_SETHOOKINPUT)->GetWindowText(strButtonText); if(strButtonText=="SetHook(Input)") { //安装钩子 if(!SetLowKeyboardHook(TRUE,0,m_hWnd)) { AfxMessageBox(L"钩子安装失败!"); return; } GetDlgItem(IDC_SETHOOKINPUT)->SetWindowText(L"UnsetHook(Input)"); GetDlgItem(IDC_SETHOOKTHREAD)->EnableWindow(FALSE); GetDlgItem(IDC_SETHOOK)->EnableWindow(FALSE); } else { if(!SetLowKeyboardHook(FALSE)) { AfxMessageBox(L"钩子安装失败!"); return; }GetDlgItem(IDC_SETHOOKINPUT)->SetWindowText(L"SetHook(Input)"); GetDlgItem(IDC_SETHOOKTHREAD)->EnableWindow(TRUE); GetDlgItem(IDC_SETHOOK)->EnableWindow(TRUE); }}清空函数函数功能:OnBnClickedResettext()函数代码:voidCCppWindowsHookDlg::OnBnClickedResettext()//清空函数{ GetDlgItem(IDC_MSG)->SetWindowText(NULL); 六、各部分实验截图:七、使用说明书:八、遇到的问题及解决办法起初在考虑如何布局整个操作系统时,想到的是通过设计一个主界面,使用者登录成功后才能对操作系统进行操作,相当于有了root权限,登录后显示另一个界面,这个界面上有5个图标,分别是进程调度管理,内存的分配与回收,多用户登录及通信,文件管理系统(结合磁盘分配),磁盘管理系统,然后点击各个图标就可以实现这些功能,当然在编程语言方面首选java,但是在一天的设计与主界面的设置编程后,发现自己用java编写有力不能及之处,所以考虑很久还是放弃了,采用C来编写。虽然不能做到有友好的界面,但基本功能还是得以实现了。其次就是在设计各块函数来满足实验的要求,以及各部分又要怎样用合适的方式来表现,最后与组员商量后决定先设计主函数,再根据主函数来调用个功能函数,至于各功能函数要实现的操作,再利用与设置主函数一样的设置方法来设置子菜单调用子函数。在书写各块函数时,遇到了很多指针和数组问题,还有就是一些不常用的头文件,最后在查找文献后,都得到了解决。九、实验总结参考文献《Windows系统编程》人民邮电出版社李晓黎编著

论大学生写作能力写作能力是对自己所积累的信息进行选择、提取、加工、改造并将之形成为书面文字的能力。积累是写作的基础,积累越厚实,写作就越有基础,文章就能根深叶茂开奇葩。没有积累,胸无点墨,怎么也不会写出作文来的。写作能力是每个大学生必须具备的能力。从目前高校整体情况上看,大学生的写作能力较为欠缺。一、大学生应用文写作能力的定义那么,大学生的写作能力究竟是指什么呢?叶圣陶先生曾经说过,“大学毕业生不一定能写小说诗歌,但是一定要写工作和生活中实用的文章,而且非写得既通顺又扎实不可。”对于大学生的写作能力应包含什么,可能有多种理解,但从叶圣陶先生的谈话中,我认为:大学生写作能力应包括应用写作能力和文学写作能力,而前者是必须的,后者是“不一定”要具备,能具备则更好。众所周知,对于大学生来说,是要写毕业论文的,我认为写作论文的能力可以包含在应用写作能力之中。大学生写作能力的体现,也往往是在撰写毕业论文中集中体现出来的。本科毕业论文无论是对于学生个人还是对于院系和学校来说,都是十分重要的。如何提高本科毕业论文的质量和水平,就成为教育行政部门和高校都很重视的一个重要课题。如何提高大学生的写作能力的问题必须得到社会的广泛关注,并且提出对策去实施解决。二、造成大学生应用文写作困境的原因:(一)大学写作课开设结构不合理。就目前中国多数高校的学科设置来看,除了中文专业会系统开设写作的系列课程外,其他专业的学生都只开设了普及性的《大学语文》课。学生写作能力的提高是一项艰巨复杂的任务,而我们的课程设置仅把这一任务交给了大学语文教师,可大学语文教师既要在有限课时时间内普及相关经典名著知识,又要适度提高学生的鉴赏能力,且要教会学生写作规律并提高写作能力,任务之重实难完成。(二)对实用写作的普遍性不重视。“大学语文”教育已经被严重地“边缘化”。目前对中国语文的态度淡漠,而是呈现出全民学英语的大好势头。中小学如此,大学更是如此。对我们的母语中国语文,在大学反而被漠视,没有相关的课程的设置,没有系统的学习实践训练。这其实是国人的一种偏见。应用写作有它自身的规律和方法。一个人学问很大,会写小说、诗歌、戏剧等,但如果不晓得应用文写作的特点和方法,他就写不好应用文。(三)部分大学生学习态度不端正。很多非中文专业的大学生对写作的学习和训练都只是集中在《大学语文》这一门课上,大部分学生只愿意被动地接受大学语文老师所讲授的文学经典故事,而对于需要学生动手动脑去写的作文,却是尽可能应付差事,这样势必不能让大学生的写作水平有所提高。(四)教师的实践性教学不强。学生写作能力的提高是一项艰巨复杂的任务,但在教学中有不少教师过多注重理论知识,实践性教学环节却往往被忽视。理论讲了一大堆,但是实践却几乎没有,训练也少得可怜。阅读与写作都需要很强的实践操作,学习理论固然必不可少,但是阅读方法和写作技巧的掌握才是最重要的。由于以上的原因,我们的大学生的写作水平着实令人堪忧,那么如何走出这一困境,笔者提出一些建议,

温馨提示

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

评论

0/150

提交评论