Windows系统编程 教学课件 作者 李晓黎 第11章.ppt

Windows系统编程 教学课件 作者 李晓黎 第11章.ppt

  1. 1、本文档共76页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
接上 if(mSetSysHook == NULL) { if(nNeedFree) ::FreeLibrary(hModule); return TRUE; } bool bRet = mSetSysHook(TRUE, 0); // 安装钩子 //SetSysHook(TRUE, 0); return TRUE; // 除非将焦点设置到控件,否则返回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()函数 HANDLE OpenProcess( DWORD fdwAccess,// 不支持,使用0 BOOL fInherit, // 不支持,使用FALSE DWORD IDProcess // 要打开的进程ID ); 创建DLL项目 参照第10章中介绍的方法创建DLL项目HookOpenProcess, 在该项目中添加11.4.2小节中介绍的CAPIHook类,并声明一个用于挂钩OpenProcess()函数的CAPIHook对象g_OpenProcess,代码如下: ? CAPIHook g_OpenProcess(kernel32.dll, OpenProcess, (PROC)Hook_OpenProcess ); 钩子函数 参照11.4.2小节中介绍的CAPIHook类的构造函数,可以知道g_OpenProcess对象是用来挂钩kernel32.dll中的OpenProcess()函数的。钩子函数为Hook_OpenProcess,其代码如下: ? HANDLE WINAPI Hook_OpenProcess(DWORD fdwAccess, BOOL fInherit, DWORD IDProcess) { typedef HANDLE (WINAPI *POPENPROCESS)(DWORD, BOOL, DWORD); if(isProtected(IDProcess)) { return NULL; } return ((POPENPROCESS)(PROC)g_OpenProcess)(fdwAccess, fInherit, IDProcess); } 自定义函数isProtected() 自定义函数isProtected()用于根据进程ID判断其是否为受保护进程: ? bool isProtected(DWORD IDProcess) { PROCESSENTRY32 pe; //获取系统内进程的快照 pe.dwSize = sizeof(pe); HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); if (hProcessSnap == INVALID_HANDLE_VALUE) return false; //遍历进程快照,显示每个进程的信息 BOOL bMore = ::Process32First(hProcessSnap,pe); 接上 while (bMore) { if(pe.th32ProcessID == IDProce

您可能关注的文档

文档评论(0)

开心农场 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档