钩子程序应用.ppt_第1页
钩子程序应用.ppt_第2页
钩子程序应用.ppt_第3页
钩子程序应用.ppt_第4页
钩子程序应用.ppt_第5页
已阅读5页,还剩71页未读 继续免费阅读

下载本文档

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

文档简介

Windows系统编程实用教程 授课教师 职务 第11章Windows钩子编程 课程描述Windows应用程序是基于消息机制的 用户在执行各种操作时都会触发相应的消息 这些消息就像战争时期各方发送的电报 如果能截获敌方的电报 则无疑会在战场上取得先机 钩子就是这样一种机制 它可以在系统消息到达目标窗口之前将其截获 并可以为指定类型的消息指定一个消息处理函数 有了这种机制 就不难理解杀毒软件是如何在用户打开一个文件之前就提前知道 并对其进行扫描的 有些翻译软件又是如何知道用户鼠标停留位置的文字的 本章知识点 11 1钩子的概念和工作原理11 2安装和卸载钩子11 3键盘钩子的例子11 4HOOKAPI技术11 5进程保护器实例11 6改进进程保护器实例 11 1钩子的概念和工作原理 11 1 1什么是钩子11 1 2钩子的类型 11 1 1什么是钩子 钩子是Windows中可以拦截事件的一种机制 可以指定一个函数作为特定类型的被拦截事件的钩子过程 钩子过程可以对拦截的每个事件进行处理 1 钩子链2 钩子过程 1 钩子链 Windows支持许多不同类型的钩子 不同类型的钩子可以为消息处理机制的不同方面提供访问 例如 使用WH MOUSE钩子可以监视与鼠标操作相关的消息 系统为每个类型的钩子维护一个独立的钩子链 其中包含指向一组作为钩子过程的回调函数的指针 当与指定类型的钩子相关联的消息发生时 系统会把消息传送给钩子链中的相关钩子过程 2 钩子过程 正如前面介绍的钩子过程是一个用户自定义函数 用于处理拦截的消息 钩子过程必须按以下的语法格式设计 LRESULTCALLBACKHookProc intnCode WPARAMwParam LPARAMlParam 下面处理事件 returnCallNextHookEx NULL nCode wParam lParam HookProc是钩子过程的名称 子过程的参数说明 nCode 是钩子过程用于决定采取什么动作的钩子编码 它取决于钩子的类型 不同类型的钩子都有相对应的一组钩子编码 wParam和lParam 通常包含钩子所拦截的消息的信息 具体内容取决于钩子编码 CallNextHookEx 函数 CallNextHookEx 函数用于将钩子信息传送给下一个钩子过程 一般在钩子过程里调用CallNextHookEx 函数 CallNextHookEx 函数的原型如下 LRESULTCallNextHookEx HHOOKhhk 当前钩子的句柄intnCode 钩子编码 下一个钩子过程通过该编码决定如何处理钩子信息WPARAMwParam 但钱钩子过程接收到的wParam参数值 具体内容取决于钩子编码 LPARAMlParam 但钱钩子过程接收到的wParam参数值 具体内容取决于钩子编码 全局钩子和特定线程钩子 钩子可以分为全局钩子和特定线程钩子两种 全局钩子可以监视与调用线程位于同一桌面的所有线程的消息 而特定线程钩子则只能监视一个单独线程的消息 特定线程钩子的钩子过程可以在应用程序的任何位置 而全局钩子的钩子过程则只能在DLL中定义 因为全局钩子可以拦截其他应用程序的消息 然后调用钩子过程对拦截的消息进行处理 因为每个进程都有自己的私有内存空间 所以一个进程不能调用其他进程的代码 也不能访问其他进程的内存数据 这样如果在安装钩子的进程中定义钩子过程 则其他正在运行的进程被拦截消息后 就不能成功调用钩子过程了 因为DLL中定义的代码可以被不同的进程调用 安装钩子的进程可以将DLL的函数指定为钩子过程 其他进程也可以在其消息被拦截后 调用DLL中定义的钩子过程 钩子的工作原理 11 1 2钩子的类型 1 WH CALLWNDPROC和WH CALLWNDPROCRET2 WH CBT3 WH DEBUG4 GWH FOREGROUNDIDLE5 WH GETMESSAGE6 WH JOURNALRECORD7 WH JOURNALPLAYBACK8 WH KEYBOARD LL9 WH KEYBOARD10 WH MOUSE LL和WH MOUSE11 WH MSGFILTER和WH SYSMSGFILTER12 WH SHELL 11 2安装和卸载钩子 11 2 1安装钩子11 2 2卸载钩子 11 2 1安装钩子 调用SetWindowsHookEx 函数可以安装钩子 函数原型如下 HHOOKSetWindowsHookEx intidHook 钩子的类型 可以是11 3 2中介绍的确钩子类型之一HOOKPROClpfn 指定钩子过程的地址HINSTANCEhMod 指定包含钩子过程的DLL句柄 DWORDdwThreadId 指定与钩子过程相关的线程标识符 如果是全局钩子 则设置为0 如果函数执行成功 则返回钩子的句柄 否则返回NULL VirtualQuery 函数 在SetWindowsHookEx 函数中需要指定包含钩子过程的DLL句柄 在DLL项目中可以调用VirtualQuery 函数来获取DLL句柄 函数原型如下 SIZE TWINAPIVirtualQuery inLPCVOIDlpAddress outPMEMORY BASIC INFORMATIONlpBuffer inSIZE TdwLength PMEMORY BASIC INFORMATION结构体 typedefstruct MEMORY BASIC INFORMATION PVOIDBaseAddress 页区域的基地址PVOIDAllocationBase 由VirtualAlloc 函数分配的页区域的基地址DWORDAllocationProtect 页区域在初始分配时指定的保护选项SIZE TRegionSize 页区域的大小 单位为字节DWORDState 区域中页的状态DWORDProtect 区域中页的访问保护模式DWORDType 区域中页的类型 MEMORY BASIC INFORMATION PMEMORY BASIC INFORMATION 自定义函数ModuleFromAddress HMODULEModuleFromAddress PVOIDpv MEMORY BASIC INFORMATIONmbi return VirtualQuery pv 11 2 2卸载钩子 如果不需要再使用钩子 应及时将其卸载 以免影响系统的效率 调用UnhookWindowsHookEx 函数可以卸载钩子 函数原型如下 BOOLWINAPIUnhookWindowsHookEx inHHOOKhhk 要卸载的钩子句柄 由之前调用SetWindowsHookEx 函数得到 11 3键盘钩子的例子 11 3 1设计DLL项目11 3 2设计EXE项目 11 3 1设计DLL项目 参照第10章中介绍的方法创建DLL项目KeyHook 在该DLL中 需要导出如下函数 DllExportLRESULTCALLBACKKeyBoardProc intnCode WPARAMwParam LPARAMlParam DllExportvoidInstallHook intnCode DllExportvoidEndHook void 1 钩子过程KeyBoardProc DllExportLRESULTCALLBACKKeyBoardProc intnCode WPARAMwParam LPARAMlParam charszKeyName 80 FILE fp if lParam GetKeyNameText 函数 intGetKeyNameText LONGlParam 指定键盘消息的第2个参数LPTSTRlpString 得到的按键名字字符串缓冲区intnSize lpString所指定的字符串缓冲区的长度 2 安装钩子的函数InstallHook voidInstallHook intnCode hInst ModuleFromAddress KeyBoardProc oldkeyhook SetWindowsHookEx WH KEYBOARD HOOKPROC KeyBoardProc hInst 0 3 卸载钩子的函数EndHook 在其他应用程序中调用EndHook 函数可以卸载本例用于监视键盘操作的钩子 EndHook 函数的代码如下 voidEndHook void UnhookWindowsHookEx oldkeyhook 11 3 2设计EXE项目 创建一个基于对话框的MFC项目InstallHook 为了引用KeyHook lib中定义的导出函数 在项目中添加一个头文件KeyHook h 代码如下 defineDllImportextern C declspec dllimport DllImportvoidInstallHook intnCode DllImportLRESULTCALLBACKKeyBoardProc intnCode WPARAMwParam LPARAMlParam DllImportvoidEndHook void 在项目中引用KeyHook lib CInstallhookDlg OnInitDialog 启动对话框时 应安装和加载键盘钩子 代码如下 BOOLCInstallhookDlg OnInitDialog CDialog OnInitDialog 以下省略缺省生成的代码 TODO 在此添加额外的初始化代码InstallHook TRUE 安装键盘钩子returnTRUE 除非将焦点设置到控件 否则返回TRUE CInstallhookDlg OnClose 关闭对话框时 应卸载键盘钩子 代码如下 voidCInstallhookDlg OnClose EndHook CDialog OnClose 提示 在生成InstallHook项目之前 应把KeyHook lib复制到项目目录下 在运行InstallHook项目之前应把KeyHook dll复制到InstallHook exe所在的目录 查看C key txt中记录的按键信息 运行InstallHook exe 然后打开一个word文档 随便输入一些字符 然后打开C key txt 查看记录的按键信息 如图11 3所示 安装钩子的程序会被安全软件发现并警告 很多木马程序利用钩子窃取用户的信息 因此 如果计算机上安装了安全软件 则为可能弹出如图11 3所示的提示窗口 如果想测试实例的运行效果 请选择 允许 不要利用本实例窃取其他用户的信息 11 4HOOKAPI技术 11 4 1实现原理11 4 2封装CAPIHook类 11 4 1实现原理 要想拦截WindowsAPI 就要首先了解Windows调用API的基本过程 WindowsAPI都是在Kernel32 dll User32 dll和advapi32 dll等系统模块中实现的 应用程序在调用WindowsAPI之前 首先要导入它们 Windows可执行文件采用的最常见格式是PE格式 IMAGE NT HEADERS结构体 PE文件由MS DOS头 NT头 节 section 头和节 section 映像4个部分组成 可以使用 IMAGE NT HEADERS结构体来描述NT头 其定义代码如下 typedefstruct IMAGE NT HEADERS DWORDSignature IMAGE FILE HEADERFileHeader IMAGE OPTIONAL HEADEROptionalHeader IMAGE NT HEADERS PIMAGE NT HEADERS IMAGE FILE HEADER结构体 typedefstruct IMAGE FILE HEADER WORDMachine 计算机的体系结构WORDNumberOfSections 节 section 的数量DWORDTimeDateStamp 映像的时间戳的低32位DWORDPointerToSymbolTable 符号表的偏移量DWORDNumberOfSymbols 符号表中的符号数量WORDSizeOfOptionalHeader 选项头的大小 单位为字节WORDCharacteristics 映像的特性 IMAGE FILE HEADER PIMAGE FILE HEADER IMAGE OPTIONAL HEADER结构体 typedefstruct IMAGE OPTIONAL HEADER WORDMagic 映像文件的状态BYTEMajorLinkerVersion 链接器的主版本BYTEMinorLinkerVersion 链接器的小版本DWORDSizeOfCode 代码节的大小 单位为字节DWORDSizeOfInitializedData 初始数据节的大小 单位为字节DWORDSizeOfUninitializedData 未初始数据节的大小 单位为字节DWORDAddressOfEntryPoint 入口点函数的地址 对于DLL文件入口点函数是可选的DWORDBaseOfCode 只想代码节开始的指针DWORDBaseOfData 只想数据节开始的指针DWORDImageBase 当映像被加载到内存中的时候 第1个字节的地址DWORDSectionAlignment 加载到内存中的节的对齐方式DWORDFileAlignment 映像文件中的节的裸数据的对齐方式 接上 WORDMajorOperatingSystemVersion 需要的操作系统的主版本号WORDMinorOperatingSystemVersion 需要的操作系统的小版本号WORDMajorImageVersion 映像的主版本WORDMinorImageVersion 映像的小版本WORDMajorSubsystemVersion 子系统的主版本WORDMinorSubsystemVersion 子系统的小版本DWORDWin32VersionValue 保留 必须为0DWORDSizeOfImage 映像的大小包含所有的头 单位为字节DWORDSizeOfHeaders 文件头的大小 单位为字节DWORDCheckSum 映像文件的校验和WORDSubsystem 运行映像文件的子系统WORDDllCharacteristics 映像文件的DLL特性DWORDSizeOfStackReserve 保留的栈的大小DWORDSizeOfStackCommit 提交到栈的数据大小 接上 DWORDSizeOfHeapReserve 保留的堆的大小DWORDSizeOfHeapCommit 提交到堆的数据大小DWORDLoaderFlags 此成员已经废弃DWORDNumberOfRvaAndSizes 选项头中的目录条目的数量IMAGE DATA DIRECTORYDataDirectory IMAGE NUMBEROF DIRECTORY ENTRIES 选项头中的数据目录 IMAGE OPTIONAL HEADER PIMAGE OPTIONAL HEADER 结构体IMAGE DATA DIRECTORY typedefstruct IMAGE DATA DIRECTORY DWORDVirtualAddress 表的虚拟地址DWORDSize 表的大小 IMAGE DATA DIRECTORY PIMAGE DATA DIRECTORY winnt h中定义了个各种信息表在数据目录数组中的索引 DirectoryEntries defineIMAGE DIRECTORY ENTRY EXPORT0 ExportDirectory defineIMAGE DIRECTORY ENTRY IMPORT1 ImportDirectory defineIMAGE DIRECTORY ENTRY RESOURCE2 ResourceDirectory defineIMAGE DIRECTORY ENTRY BASERELOC5 BaseRelocationTable defineIMAGE DIRECTORY ENTRY DEBUG6 DebugDirectory defineIMAGE DIRECTORY ENTRY TLS9 TLSDirectory 导入表结构的示意图 11 4 2封装CAPIHook类 1 CAPIHook类的成员变量2 CAPIHook类的构造函数3 替换一个模块的导入地址表4 挂钩所有模块5 防止动态加载模块 1 CAPIHook类的成员变量 private LPSTRm pszModName 导出要HOOK函数的模块的名字LPSTRm pszFuncName 要HOOK的函数的名字PROCm pfnOrig 原API函数地址PROCm pfnHook HOOK后函数的地址BOOLm bExcludeAPIHookMod 是否将HOOKAPI的模块排除在外一个CAPIHook对象只能挂钩一个WindowsAPI 为了能同时对多个WindowsAPI进行挂钩 CAPIHook类中使用静态变量定义了一个CAPIHook对象的链表 代码如下 这两个指针用来将所有的CAPIHook对象连在一起staticCAPIHook sm pHeader 指向链表头元素CAPIHook m pNext 指向链表中下一个元素 2 CAPIHook类的构造函数 CAPIHook CAPIHook LPSTRpszModName LPSTRpszFuncName PROCpfnHook BOOLbExcludeAPIHookMod 保存这个Hook函数的信息m bExcludeAPIHookMod bExcludeAPIHookMod m pszModName pszModName m pszFuncName pszFuncName m pfnHook pfnHook m pfnOrig GetProcAddress GetModuleHandle pszModName pszFuncName 将此对象添加到链表中m pNext sm pHeader sm pHeader this 在所有当前已加载的模块中HOOK这个函数ReplaceIATEntryInAllMods m pszModName m pfnOrig m pfnHook bExcludeAPIHookMod 3 替换一个模块的导入地址表 CAPIHook ReplaceIATEntryInOneMod 函数可以实现此功能 代码如下 voidCAPIHook ReplaceIATEntryInOneMod LPSTRpszExportMod PROCpfnCurrent PROCpfnNew HMODULEhModCaller 取得模块的导入表 importdescriptor 首地址 ImageDirectoryEntryToData函数可以直接返回导入表地址ULONGulSize PIMAGE IMPORT DESCRIPTORpImportDesc PIMAGE IMPORT DESCRIPTOR ImageDirectoryEntryToData hModCaller TRUE IMAGE DIRECTORY ENTRY IMPORT 接上 查找包含pszExportMod模块中函数导入信息的导入表项while pImportDesc Name 0 LPSTRpszMod LPSTR DWORD hModCaller pImportDesc Name if lstrcmpiA pszMod pszExportMod 0 找到break pImportDesc if pImportDesc Name 0 hModCaller模块没有从pszExportMod模块导入任何函数 return 接上 取得调用者的导入地址表 importaddresstable IAT PIMAGE THUNK DATApThunk PIMAGE THUNK DATA pImportDesc FirstThunk DWORD hModCaller 查找我们要HOOK的函数 将它的地址用新函数的地址替换掉while pThunk u1 Function lpAddr指向的内存保存了函数的地址PDWORDlpAddr PDWORD if lpAddr DWORD pfnCurrent 接上 修改页的保护属性DWORDdwOldProtect MEMORY BASIC INFORMATIONmbi VirtualQuery lpAddr ImageDirectoryEntryToData 函数 调用ImageDirectoryEntryToData 函数可以获取对映像指定的数据的访问 这里使用它来获取导入表的地址 函数原型如下 PVOIDWINAPIImageDirectoryEntryToData inPVOIDBase inBOOLEANMappedAsImage inUSHORTDirectoryEntry outPULONGSize 4 挂钩所有模块 要挂钩一个进程对一个WindowsAPI的调用 不但要修改其主模块的导入地址表 而且要遍历进程的所有模块 CAPIHook ReplaceIATEntryInAllMods 函数可以实现此功能 代码如下 voidCAPIHook ReplaceIATEntryInAllMods LPSTRpszExportMod PROCpfnCurrent PROCpfnNew BOOLbExcludeAPIHookMod 取得当前模块的句柄HMODULEhModThis NULL if bExcludeAPIHookMod MEMORY BASIC INFORMATIONmbi if VirtualQuery ReplaceIATEntryInAllMods 接上 取得本进程的模块列表HANDLEhSnap CreateToolhelp32Snapshot TH32CS SNAPMODULE GetCurrentProcessId 遍历所有模块 分别对它们调用ReplaceIATEntryInOneMod函数 修改导入地址表MODULEENTRY32me sizeof MODULEENTRY32 BOOLbOK Module32First hSnap 5 防止动态加载模块 在进程中还可能会调用LoadLIbrary 函数动态加载模块 如果动态加载的模块中包含要挂钩的WindowsAPI那么就也要替换其地址 CAPIHook HookNewlyLoadedModule 函数可以实现此功能 代码如下 voidWINAPICAPIHook HookNewlyLoadedModule HMODULEhModule DWORDdwFlags 如果一个新的模块被加载 挂钩各CAPIHook对象要求的API函数if hModule NULL 5 防止动态加载模块 应用程序都是调用LoadLibraryA 函数 LoadLibraryW 函数 LoadLibraryExA 函数或LoadLibraryExW 函数来动态加载模块的 然后调用GetProcAddress 函数返回API函数的地址 如果挂钩了这4个API 就可以在应用程序动态加载模块时替换其中包含的要挂钩的WindowsAPI的地址 为了挂钩上面提到的4个API 在CAPIHook类中定义了下面4个静态变量 staticCAPIHooksm LoadLibraryA staticCAPIHooksm LoadLibraryW staticCAPIHooksm LoadLibraryExA staticCAPIHooksm LoadLibraryExW staticCAPIHooksm GetProcAddress 构造前面4个静态变量的代码 CAPIHookCAPIHook sm LoadLibraryA Kernel32 dll LoadLibraryA PROC CAPIHook LoadLibraryA TRUE CAPIHookCAPIHook sm LoadLibraryW Kernel32 dll LoadLibraryW PROC CAPIHook LoadLibraryW TRUE CAPIHookCAPIHook sm LoadLibraryExA Kernel32 dll LoadLibraryExA PROC CAPIHook LoadLibraryExA TRUE CAPIHookCAPIHook sm LoadLibraryExW Kernel32 dll LoadLibraryExW PROC CAPIHook LoadLibraryExW TRUE CAPIHookCAPIHook sm GetProcAddress Kernel32 dll GetProcAddress PROC CAPIHook GetProcAddress TRUE CAPIHook LoadLibraryA 函数 HMODULEWINAPICAPIHook LoadLibraryA PCSTRpszModulePath HMODULEhModule LoadLibraryA pszModulePath HookNewlyLoadedModule hModule 0 return hModule CAPIHook GetProcAddress 函数 FARPROCWINAPICAPIHook GetProcAddress HMODULEhModule PCSTRpszProcName 得到这个函数的真实地址FARPROCpfn GetProcAddress hModule pszProcName 看它是不是我们要hook的函数CAPIHook p sm pHeader while p NULL if p m pfnOrig pfn pfn p m pfnHook break p p m pNext returnpfn 11 5进程保护器实例 在应用程序中调用TerminateProcess 函数可以结束指定的进程 如果不允许以这种 暴力 手段结束进程 就可以挂钩TerminateProcess 函数 达到禁用TerminateProcess 函数的目的 本届介绍一个进程保护器实例的设计和实现过程 11 5 1设计DLL项目 参照第10章中介绍的方法创建DLL项目HookTerminateProcess 在该项目中添加11 4 2小节中介绍的CAPIHook类 并声明一个用于挂钩TerminateProcess 函数的CAPIHook对象g TerminateProcess 代码如下 CAPIHookg TerminateProcess kernel32 dll TerminateProcess PROC Hook TerminateProcess 钩子函数 参照11 4 2小节中介绍的CAPIHook类的构造函数 可以知道g TerminateProcess对象是用来挂钩kernel32 dll中的TerminateProcess 函数的 钩子函数为Hook TerminateProcess 其代码如下 boolWINAPIHook TerminateProcess HANDLEhProcess UINTnExitCode typedefbool WINAPI PFNTERMINATEPROCESS HANDLE UINT charszPathName 256 GetModuleFileName NULL szPathName 256 charsz 2048 wsprintf sz 进程号 d s 进程句柄 X 退出代码 d n GetCurrentProcess szPathName hProcess nExitCode MessageBox NULL 不允许杀掉进程 提示 0 FILE fp fp fopen c terminateProcess txt a fprintf fp s sz return PFNTERMINATEPROCESS PROC g TerminateProcess hProcess nExitCode returntrue TerminateProcess 函数的原型 BOOLTerminateProcess HANDLEhProcess 要结束的进程句柄DWORDuExitCode 进程的结束代码 Hook TerminateProcess 函数做了下面两件事 1 将要被结束的进程信息保存在c terminateProcess txt中 2 弹出一个提示 不允许杀掉进程 的消息框 SetSysHook 函数 SetSysHook 函数用于安装和卸载钩子 代码如下 intSetSysHook boolbInstall DWORDdwThreadId boolbOk if bInstall g hHook SetWindowsHookEx WH GETMESSAGE GetMsgProc ModuleFromAddress GetMsgProc dwThreadId bOk g hHook NULL else bOk UnhookWindowsHookEx g hHook g hHook NULL returnbOk 11 5 2设计进程保护器的EXE项目 创建一个基于对话框的MFC项目ProcessProtector 启动对话框时 应安装和加载钩子 代码如下 BOOLCProcessProtectorDlg OnInitDialog CDialog OnInitDialog 省略缺省生成的代码 charszDll HookTerminateProcess dll 引用的DLL说文件名hModule GetModuleHandle szDll 获取DLL文件的模块地址if hModule NULL hModule LoadLibrary szDll 加载DLL文件nNeedFree true 标识退出时应释放DLL句柄 if hModule NULL returnTRUE 获取SetSysHook 函数的指针mSetSysHook PFNSETSYSHOOK GetProcAddress hModule SetSysHook 接上 if mSetSysHook NULL if nNeedFree FreeLibrary hModule returnTRUE boolbRet mSetSysHook TRUE 0 安装钩子 SetSysHook TRUE 0 returnTRUE 除非将焦点设置到控件 否则返回TRUE 运行程序 在运行ProcessProtector项目之前应把HookTerminateProcess dll复制到ProcessProtector exe所在的目录 打开 任务管理器 结束一个无关紧要的进程 会弹出如图11 7所示提示消息框 确认进程没有被结束 提示 很多木马程序利用钩子危害计算机的安全 因此 如果计算机上安装了安全软件 则为可能弹出如图11 8所示的提示窗口 如果想测试的运行效果 请选择 允许 11 6改进进程保护器实例 11 5节中介绍了通过挂钩TerminateProcess 函数保护进程的方法 但是 这种方法不能对保护的进程进行区分 只能保护所有进程 在实际应用中 经常需要保护指定的进程 而允许用户结束其他进程 本节就介绍一个改进的进程保护器实例 可以保护用户指定的进程 11 6 1设计DLL项目 TerminateProcess 函数是根据进程句柄来结束进程的 但是根据进程句柄无法获取进程的详细信息 例如PID和进程名 也就是说在钩子函数中不能根据拦截到的TerminateProcess 函数的hProcess参数获取进程的详细信息 无从知道要结束的是哪个进程 因此无法对特定进程做特殊处理 那是不是就没有办法了呢 反过来想一想 在调用TerminateProcess 函数是使用的进程句柄是怎么来的 是通过调用OpenProcess 函数获得的 OpenProcess 函数 HANDLEOpenProcess DWORDfdwAccess 不支持 使用0BOOLfInherit 不支持 使用FALSEDWORDIDProcess 要打开的进程ID 创建DLL项目 参照第10章中介绍的方法创建DLL项目HookOpenProcess 在该项目中添加11 4 2小节中介绍的CAPIHook类 并声明一个用于挂钩OpenProcess 函数的CAPIHook对象g OpenProcess 代码如下 CAPIHookg OpenProcess kernel32 dll OpenProcess PROC Hook OpenProcess 钩子函数 参照11 4 2小节中介绍的CAPIHook类的构造函数 可以知道g OpenProcess对象是用来挂钩kernel32 dll中的OpenProcess 函数的 钩子函数为Hook OpenProcess 其代码如下 HANDLEWINAPIHook OpenProcess DWORDfdwAccess BOOLfInherit DWORDIDProcess typedefHANDLE WINAPI POPENPROCESS DWORD BOOL DWORD if isProtected IDProcess returnNULL return POPENPROCESS PRO

温馨提示

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

评论

0/150

提交评论