Chinaunix首页 | 论坛 | 博客
  • 博客访问: 219774
  • 博文数量: 67
  • 博客积分: 3156
  • 博客等级: 中校
  • 技术积分: 650
  • 用 户 组: 普通用户
  • 注册时间: 2009-05-18 17:41
个人简介

软件工程师!

文章分类

全部博文(67)

文章存档

2015年(1)

2014年(1)

2012年(6)

2011年(16)

2010年(31)

2009年(12)

分类: C/C++

2010-07-22 14:34:13

利用IShellExecuteHook接口对程序监控

 

作者:赖锋(忙碌命)

Blog: http://blog.csdn.net/laiboy

      http://laiboy.cublog.cn

 

Windows的应用程序的调用大部分是利用ShellExecute()ShellExecuteEx()这两个API调用,而这两个API最终调用的是CreateProcess()这个API,它们的作用是获取进程序足够的参数传给CreateProcess()。所以,只要监控这两个API的调用,就可以实现对程序启动的监视和控制。

Windows操作系统提供了IShellExecuteHook这个COM的接口,这是一个传统的Windows操作系统的HOOK模型中的一个接口。

注册IShellExecuteHook函数

IShellExecuteHook是一个COM服务器,这个COM所注册的地方位于注册表两个地方,分别为:

HEKY_CLASSES_ROOT

\CLSID

HKEY_LOCAL_MACHINE

\Software

\Microsoft

\Windows

\CurrentVersion

\Explorer

\ShellExecuteHooks

处理的IShellExecuteHookhandler(即Com server)必须要在这两个地方注册。

实现IShellExecuteHookExecute处理函数

以下为实现IShellExecuteHookExecute方法须要注意的问题,Execute方法带有一个LPSHELLEXECUTEINFO 的参数,该参数指向一个可执行程序的所有信息,执行动作(打开,显示,链接等)lpesi->lpVerb,被执行程序的完整路径名称,lpsei->lpFile,调用的目录,程序执行的参数等。

当返回值为 S_FALSE的时候,则是允许程序按正常方式打开,当返回为 S_OK的事候,则程序是被阻止执行。在实现程序黑名单的时候,当发现程序是包含在黑名单中的,则返回 S_OK,实现程序执行拦截。

实现IShellExecuteHook的源码

如图,实现一个IShellExecuteImple类,并实现IUnkownAddRelease等COM接口。

实现IShellExecuteHook接口的Execute方法:

以下为实现Execute的方法。

设计如下:

Ø 记录可执行程序的名称,启动时间,并记录到C:\\ShellHook.txt文件中

Ø 读取程序拦截黑名单(C:\\ShellHook.ini),根据黑名单拦截程序。

最后修改rgs文件,注册ShellHook.dll的时候会在指定键加入ShellHook.Dll

调试IShellExecuteHook的问题

每次编译新运行的时候需要缷载ShellHook.dll,并注销重新注册加载测试。

Execute执行失败时,会导致Windows Explorer无法执行,要在安全模式下重新运行regsvr32 /u ShellHook.dll才能让Windows Explorer正常运行。

运行IShellExecuteHook的结果

执行程序的时间

被拦截的程序

 

IShellExecuteHook支持Windows 7 和 Vista

需要将以下开关打开,则IShellExecuteHook接口可以在Windows 和 Vista下运行。

HKEY_LOCAL_MACHINE

\Software

\Microsoft

\Windows

\CurrentVersion

\Policies

\Explorer

加入以下键值

EnableShellExecuteHooks

REG_DWORD

1

则可以让IShellExecuteHooksWindows 7 和 Vista 上运行。

 
文件: ShellHook源码.rar
大小: 79KB
下载: 下载
阅读(2299) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~