windows程序设计7课件_第1页
windows程序设计7课件_第2页
windows程序设计7课件_第3页
windows程序设计7课件_第4页
windows程序设计7课件_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

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

文档简介

Windows程序设计基础第七章动态链接库和钩子7.1动态链接库动态链接库是应用程序的一个模块,这个模块用于导出一些函数和数据供程序中的其他模块使用。1)动态链接库是应用程序的一部分,它的任何操作都是代表应用程序进行的。作为模块被进程加载到自己的空间地址中。2)动态链接库在程序编译时不会被插入到可执行文件中,在程序运行时整个库的代码才会调入内存,这也就是“动态链接”。3)如果多个程序用到同一个动态链接库,Windows在物理内存中只保留一份库的代码,仅通过分页机制将这份代码映射到不同的进程中。动态链接库(DynamicLinkLibraries)扩展名DLL,有些其他扩展名的文件也可能是动态链接库,如系统中的一些.exe文件,各种控件(*.ocx)都是动态链接库。装载期间动态链接#include<windows.h>#include<DllDemo.h>//假设生成的DLL为DllDemo.DLL//指明要链接到DllDemo.Lib库#pragmacomment(lib,”DllDemo”)Voidmain(){ExportFunc(“你好!”);//象调用本地函数一样}前提:已经建立一个工程生成DllDemo.h、DllDemo.DLL、DllDemo.Lib,把这些文件拷到工程目录下。运行期间动态链接#include<windows.h>Typedefvoid(*PFNEXPORTFUNC)(LPCTSTR);intmain(intargc,char*argv[]){HMODULEhModule=::LoadLibrary(“DllDemo\\Debug\\DllDemo.dll”);//加载DLL库if(hModule!=null){//取得函数地址PFNEXPORTFUNCmExportFunc=(PFNEXPORTFUNC

)::GetProcAddress(hModule,”ExportFunc”);if(mExportFunc!=null){ExportFunc(“你好!”);//象调用本地函数一样}}FreeLibrary(hModule

);//卸载DLL库}前提:已经建立一个工程生成DllDemo.DLL,把此文件拷到工程目录下。

Windows应用程序的运行模式是基于消息驱动的,任何线程只要注册了窗口类都会有一个消息队列来接受用户的输入消息和系统消息。为了取得特定线程接收或发送的消息,就要用到Windows钩子。钩子是Windows消息处理机制的一个监视点,应用程序可以在这里安装一个子程序(钩子函数)以监视指定窗口某种类型的消息,所监视的窗口可以是其他进程创建的。当消息到达后,在目标窗口处理函数之前,钩子机制允许应用程序截获它进行处理。7.2钩子钩子函数是一个处理消息的程序段,通过调用相关API函数,把它挂入系统。每当特定消息发出,在没有到达目的窗口之前,钩子程序就先捕获该消息,即钩子函数先得到控制权。这时钩子函数既可以加工处理该消息,也可以不作处理继续传递该消息。1)钩子是用来截获系统中的消息流的。2)截获消息后,用于处理消息的子程序叫钩子函数。是应用程序自定义的一个函数,在安装钩子时要把这个函数的地址告诉Windows。3)系统中同一时间可能有多个进程安装了钩子,多个钩子函数在一起组成钩子链。所以在处理截获到的消息时,应该把消息事件传递下去,以便其他钩子也有机会处理这一消息。钩子会使系统边慢,因为增加了系统对每个消息的处理量。钩子知识参数idHook指定了钩子的类型,总共有如下13种:WH_CALLWNDPROC系统将消息发送到指定窗口之前的“钩子”

WH_CALLWNDPROCRET消息已经在窗口中处理的“钩子”

WH_CBT基于计算机训练的"钩子"

WH_DEBUG差错"钩子"

WH_FOREGROUNDIDLE前台空闲窗口"钩子"

WH_GETMESSAGE接收消息投递的"钩子"

WH_JOURNALPLAYBACK回放以前通过WH_JOURNALRECORD"钩子"记录的输入消息

WH_JOURNALRECORD输入消息记录"钩子"

WH_KEYBOARD键盘消息"钩子"

WH_MOUSE鼠标消息"钩子"

WH_MSGFILTER对话框、消息框、菜单或滚动条输入消息"钩子"

WH_SHELL外壳"钩子"

WH_SYSMSGFILTER系统消息"钩子"7.3挂钩API技术

HOOKAPI是指截获特定进程或系统对某个API函数的调用,使得API函数的执行流程转向指定的代码。例如,在挂钩了系统对User32.dll模块中MessageBoxA函数的调用以后,每当有应用程序调用MessageBoxA函数,调用线程都会执行用户提供的代码,而不去执行真正的MessageBoxAAPI函数。最常用的一种挂钩方法是改变目标进程中调用API函数的代码,使得它们对API的调用变为对用户自定义函数的调用。注入代码到目标进程是实现拦截API的重要一步,可以把注入代码写到DLL中,然后让目标进程加载这个DLL。即DLL注入技术。一旦程序代码进入另一个进程的地址空间,就可以毫无限制的做任何事情。还可以趁DLL在目标进程中初始化的机会去创建新的线程。这个时候创建的线程运行在目标进程的地址空间中,所以它对目标进程有着完全的访问权限。使用钩子注入DLL使用钩子注入特定DLL到其他进程时一般都安装WH_GETMESSAGE钩子,而不是WH_KEYBOARD钩子。因为许多进程不接收键盘输入,所以Windows不能实现钩子函数的DLL加载到这些进程中。但是大部分程序都需要调用GetMessage或PeekMessage函数从消息队列中获取消息,所以它们都会加载钩子函数所在的DLL。如果要将DLL注入到特定进程中,一般是将该进程中主线程的线程ID传递给SetWindowsHookEx函数;如果要将DLL注入到所有进程中,安装一个系统范围内的钩子。即把线程ID赋值0。HOOK过程1.导入表

导入函数是被程序调用,但其实现代码却在其他模块中的函数。API函数都是导入函数,它们的实现代码在Kernel32.dll、User32.dll等Win32子系统模块。模块的导入函数名和这些函数驻留的DLL名等信息都保留在他的导入表中。导入表是一个IMAGE_IMPORT_DESCRIPTOR结构的数组,每个结构对应着一个导入模块。结构定义typedefstruct_IMAGE_IMPORT_DESCRIPTOR{union{DWORDCharacteristics;DWORDOriginalFirstThunk;//表的偏移量,记录导入函数名称};DWORDTimeDateStamp;DWORDForwarderChain;DWORDName;//导入模块名称字符串的偏移量DWORDFirstThunk;//IAT的偏移量,记录导入函数地址}IMAGE_IMPORT_DESCRIPTOR;例如,调用User32.dll模块中MessageBoxA函数的代码最终汇编成如下代码:calldwordptr[_imp_MessageBoxA@16(0042428c)]//函数的真实地址记录在0042428c地址处

常用的HOOKAPI的方法就是修改模块的导入表。比如把MessageBoxA函数的地址0042428c地址处的内容用一个自定义函数的地址覆盖掉,那么以后这个模块对MessageBoxA的调用实际上就成了对该自定义函数的调用,程序的执行流程转向了自定义的函数,而不是真实的API函数。7.4其他方法2.使用远程线程注入DLL这种方法主要使用创建远程线程的函数CreateRemoteThread。这个函数可以在其他进程中创建线程。HANDLECreateRemoteThread(HANDLEhProcess,//目标进程的句柄LPSECURITYlpThreadAttribute,//线程安全SIZE_TdwStackS

温馨提示

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

评论

0/150

提交评论