




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第9章动态链接库和钩子9.1动态链接库9.2Windows钩子9.3挂钩API技术9.1动态链接库动态链接库的概念进程与模块DLL中的函数实验使用导出函数动态链接库的概念动态链接库是应用程序的一个模块,这个模块的作用是导出一些函数和数据供程序中其他模块使用动态链接库是程序的一部分,它在本质上和可执行文件没有区别,都是作为模块被进程加载到自己的地址空间。(dll是进程的一个模块,exe也是进程的一个模块)Dll在exe编译阶段不会被插到exe中,dll是在程序运行时才会掉入内存,具体分为装载期和运行期。如果有多个程序用到同一个dll,内存中只有一个dll,大家共享它。os仅通过分页机制将这份代码映射到不同的进程中。动态链接库的概念动态链接库通常都不能直接运行,也不能接收消息。它们是一些独立的文件,其中包含能被可执行程序或其它DLL调用来完成某项工作的函数。只有在其它模块调用动态链接库中的函数时,它才发挥作用。WindowsAPI中的所有函数都包含在DLL中。其中有3个最重要的DLL,Kernel32.dll,它包含用于管理内存、进程和线程的各个函数;User32.dll,它包含用于执行用户界面任务(如窗口的创建和消息的传送)的各个函数;GDI32.dll,它包含用于画图和显示文本的各个函数。动态链接库的概念静态库:函数和数据被编译进一个二进制文件(通常扩展名为.LIB)。在使用静态库的情况下,在编译链接可执行文件时,链接器从库中复制这些函数和数据并把它们和应用程序的其它模块组合起来创建最终的可执行文件(.EXE文件)。在使用动态库的时候,往往提供两个文件:一个引入库和一个DLL。引入库包含被DLL导出的函数和变量的符号名,DLL包含实际的函数和数据。在编译链接可执行文件时,只需要链接引入库,DLL中的函数代码和数据并不复制到可执行文件中,在运行的时候,再去加载DLL,访问DLL中导出的函数。动态链接库的优点可以采用多种编程语言来编写。增强产品的功能。提供二次开发的平台。简化项目管理。可以节省磁盘空间和内存。有助于资源的共享。有助于实现应用程序的本地化。Windows提供的某些特性只有DLL才能使用动态链接库被多个进程访问代码页面2代码页面1数据页面2代码页面3数据页面1DLL的虚拟内存代码页面2代码页面1数据页面2代码页面3数据页面1代码页面2代码页面1代码页面2代码页面3数据页面1数据页面2代码页面2代码页面2代码页面3数据页面1数据页面2代码页面1第一个进程的地址空间第二个进程的地址空间动态链接库的概念动态链接库的形式可以是:dll,exe,ocx(控件)等等。进程与模块一个进程可包含多个模块模块可以是exe,dll,lib,ocx等进程执行离不开这些模块的支持,其中exe为进程的主模块进程模块exe模块dll模块dllDllMain DllMain是动态链接库的入口点。库的入口函数仅供os使用,windows在库装载、卸载、进程中创建和结束线程时调用DllMain,以便采取相应的动作。BOOLAPIENTRYDllMain(HANDLEhModule,//本模块句柄
DWORDul_reason_for_call,//调用的原因
LPVOIDlpReserved//保留
){switch(ul_reason_for_call) { caseDLL_PROCESS_ATTACH:dll加载时
caseDLL_THREAD_ATTACH:创建新线程时
caseDLL_THREAD_DETACH:新线程正常结束时
caseDLL_PROCESS_DETACH:dll卸载时 break;}returnTRUE;}Dll中的函数Dll能够定义两种函数,导出函数和内部函数。导出函数可以被其他模块调用,以可以被定义这个函数的模块调用内部函数只能被定义这个函数的模块调用动态链接库的主要功能是向外导出函数,供进程中的其他模块使用编写动态链接库程序例子:.cpp
.h#ifdefDLLDEMO_EXPORTS#defineDLLDEMO_API__declspec(dllexport)#else#defineDLLDEMO_API__declspec(dllimport)#endif一个项目预定义宏在项目\设置\C++\Preprocessor\definition定义在DLL的CPP中,#include.h,里面有函数声明为__declspec(dllexport),而在调用工程中的cpp中,也#include.h,里面需要将函数声明为__declspec(dllimport),所以,就要求一个声明具有两个含义,所以就用到了条件预定义来解决。在dll工程中,自动预定义了DLLDEMO_EXPORTS,而调用方的工程里,是没有DLLDEMO_EXPORTS预定义的。问题得以解决。实验实验1:利用向导生成,并测试实验2:隐式加载使用#pragmacomment(lib,"dlldemo")使用工程配置Lib文件,h文件,dll文件的复制路径使用函数、全局变量、类实验3:显示加载实验4:dllexport的解释,验证工程预定义宏使用导出函数装载期间动态链接:API函数就是这样调用的。编译期必须提供.h和.lib,运行时必须提供.dll,与exe在同一个目录下或者在system32下运行期间动态链接:编译器无需.h和.lib,在程序中显式的加载dll使用导出函数装载期间动态链接(隐式加载)例子运行期间动态链接(显式加载)例子HANDLEHMODULEHINSTANCEHWND有什么区别? Handle是代表系统的内核对象,如文件句柄,线程句柄,进程句柄。HMODULE是代表应用程序载入的模块,win32系统下通常是被载入模块的线性地址。HINSTANCE在win32下与HMODULE是相同的东西,在Win32下还存在主要是因为win16程序使用HINSTANCE来区别task。HWND是窗口句柄。补充一点:系统对内核对象以链表的形式进行管理,载入到内存中的每一个内核对象都有一个线性地址,同时相对系统来说,在串列中有一个索引位置,这个索引位置就是内核对象的handle.HMODULE是一种特殊的handle他只对于exe,dll等模块9.2Windows钩子钩子的概念钩子的安装与卸载键盘钩子实例钩子的概念Hook是Windows消息处理机制中的一个监视点应用程序可以在系统中安装一个钩子,以监视指定窗口某种类型的消息监视的窗口可以是其他进程创建的当消息到达后,目标窗口处理函数处理之前,钩子首先截获它,并进行处理。截获消息后,用于处理消息的子程序叫做钩子函数。系统中同一时间可能有多个进程安装钩子,在处理截获到的消息时,应把消息事件传递下去,以便其他钩子有机会处理这一消息。钩子的安装与卸载使用SetWindowsHookEx函数可以把应用程序定义的钩子函数HHOOKSetWindowsHookEx(IntidHook,//指定钩子的类型
HOOKPROClpfn,//钩子函数地址
HINSTANCEhMod,//钩子函数所在dll句柄
DWORDdwThreadId//被监视线程ID);任何线程只要注册了窗口类,都会有一个消息队列,用来接受各种消息如果监视其他进程,钩子函数必须写到dll中钩子函数LRESULTCALLBACKHookProc(intnCode,//Hook代码,用来确定任务,它的值依赖于Hook的类型WPARAMwParam,LPARAMlParam//wParam,lParam的值依赖于Hook代码){ …//处理消息的代码
return::CallNextHookEx(hHook,nCode,wParam,lParam);}卸载钩子BOOLUnhookWindowsHookEx(HHOOKhhk);键盘钩子实例动态链接库工程Win32应用程序工程9.3挂钩API技术 HOOKAPI是指截获特定进程或系统对某个API函数的调用,使得API的执行流程转向指定的代码。
最常用的一种挂钩API的方法是改变目标进程中调用API函数的代码,使得它们对API的调用变为对用户自定义函数的调用实现原理Windows应用程序有自己的地址空间,它们只能调用自己地址空间中的函数,所以在挂钩API之前,必须将一个可以代替API执行的函数的执行代码注入到目标进程,然后再想办法将目标进程对该API的调用改为对注入到目标进程中自定义函数的调用。比较简单的方法是把要注入的代码写到DLL中,然后让目标进程加载这个DLL。还可以趁着DLL在目标进程中初始化的机会去创建新的线程。使用钩子注入DLL在成功调用SetWindowsHookEx函数安装系统范围内的键盘钩子之后,Windows在内部自动对每个接收键盘输入的进程调用LoadLibrary函数,强迫它们加载包含钩子函数执行代码的模块09KeyHookLib.dll。使用Windows钩子注入特定DLL到其他进程时一般都安装WH_GETMESSAGE钩子,而不是安装WH_KEYBOARD钩子。使用钩子注入DLL如果要将DLL注入到特定进程中,一般是将该进程中主线程的线程ID传递给SetWindowsHookEx函数如果要将DLL注入到所有进程中,安装一个系统范国内的钩子即可。使用注册表注入DLL为了插入一个DLL到链接系统模块User32.dll,可以简单地向下面的注册表键下添加键值数据.HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Windows\AppInit_DLLs键值数据可以是单一的DLL名称,也可以是逗号或空格间隔的DLL集合.使用注册表注入DLL仅对使用User32.dll的应用程序有效,仅被被Windows2000系列的操作系统直持.不足:为了激活/取消对进程的插入
,不得不重新启动Windows.插入的DLL仅能被映射到使用User32.dll的进程编程者不能对插入动作进行任何控制使用远程线程注入DLL主要使用创建远程线程的函数CreateRemoteThreadHANDLECreateRemoteThread(HANDLEhProcess,//目标进程句柄LPSECURITY_ATTRIBUTESlpThreadAttributes,//SDSIZE_TdwStackSize,//initialstacksize
LPTHREAD_START_ROUTINElpStartAddress,//目标进程中线程入口地址LPVOIDlpParameter,//threadargumentDWORDdwCreationFlags,//creationoptionLPDWORDlpThreadId//threadidentifier);使用远程线程注入DLLDWORDWINAPIThreadProc(LPVOID);HMODULEWINAPILoadLibrary(LPCTSTRlpFileName);使用远程线程注入DLL要使用远程线程技术有3个条件:确保当前进程有足够的权限可以使用OpernProcess打开目标进程。线程函数过程存在于目标进程地址空间待执行的函数过程的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 大型公共建筑监理服务合同
- 个人股权转让合同简易模板
- 仓储场地租赁合同范文
- 战略合作合同书:科研成果转化项目
- 幼儿托管合同模板大全
- 农业可持续发展太阳能灌溉系统供应合同书2025
- 装饰公司合伙投资合同范本
- 农产品订购合同样本版
- 商业地产租赁合作合同范本
- 购销合同范本及有效条款
- 河南省驻马店市泌阳县部分中学联考2024-2025学年八年级下学期3月月考数学试题(原卷版+解析版)
- 肺结核病人的心理护理
- 2025年开封文化艺术职业学院单招职业技能测试题库含答案
- 2025年辽宁冶金职业技术学院单招职业适应性测试题库有完整答案
- 2025年安徽扬子职业技术学院单招职业适应性测试题库(各地真题)
- 烟草职业鉴定三级技能考点
- 创新创业项目计划书撰写
- 2024年上海市杨浦区复旦大学附中自主招生数学试卷
- 2025年安徽警官职业学院单招职业适应性测试题库带答案
- 《汽车底盘构造与维修》专业课程标准
- 2025年中国外运股份有限公司招聘笔试参考题库含答案解析
评论
0/150
提交评论