编写插件锁住Word文档窗口

现在的木马后门种类非常之多,其中有些木马专门以Office 文档为窃取目标 ,我最近做了一些Anti这些木马的工作,在工作中我基本上实现了阻止未知程序 利用Office自动化接口窃取Word内容,但限于公司利益我只能写一些基本上已经 比较成熟和公开的技术,当然其中了包含我的设计思想,我想多多少少会让你有 所收获,你可任意转载文章,但请注明作者和出处,谢谢!

首先我们知道Ole拖放是由DoDragDrop启动的,为此你可以事先要准备一些参 数给DoDragDrop使用,最开始我的想法是直接阻止DoDragDrop调用,后来我发现 这样做会使Word文档窗口内部的拖放操作失效,这会给人一种很不好的感觉,好 的保护软件应该在客户没有感觉到不方便的情况提供保护,而后我又仔细看了 DoDragDrop的参数想发现有没有什么可以利用的地方,我发现它有四个参数:

IDataObject * pDataObject;

IDropSource * pDropSource;

DWORD dwOKEffect;

DWORD * pdwEffect;

后两个参数基本上没有什么利用价值,我想到Hook IDataObject的GetData函 数,可是在Ole Drop客户端编程时,通常当我调用COleDataObject的相关成员函 数时拖放已经差不多完成,鼠标已经在我的程序窗口上了。

而我现在的想法是在拖放操作刚离开Word的文档窗口,还没有到达外部程序 窗口时就让它失效,这样Hook IDataObject的虚函数肯定不行,我只有再研究一 下最后一个没有研究过的参数pDropSource,它是一个IDropSource类型指针,我 发现它有一个虚函数QueryContinueDrag查看了一下MSDN发现它似乎就是我要找 的。

我的理解是这个函数是让Ole拖放的服务端在调用DoDragDrop启动Ole拖放操 作后,有机会取消拖放操作而设的一个CallBack,于是我写了一段代码Hook住 DoDragDrop并从DoDragDrop中进一步Hook住IDropSource的QueryContinueDrag虚 函数,我发现它会全程跟踪整个拖放操作,只要这个CallBack一返回 DRAGDROP_S_CANCEL整个拖放操作就会被取消,这样我只要知道当前鼠标下的窗 口是否是文档窗口就可以了,一旦离开了文档窗口我就让这个CallBack返回 DRAGDROP_S_CANCEL取消整个拖放操作。

这样做就可以不影响文档窗口内部的拖放操作,又可以阻止将文档窗口内部 的东西拖放到其它程序中,基本上不会让客户感到不方便,这很有意思!不是吗 ?

那么从鼠标位置得到窗口句柄可能吗?答案是肯定的! GetCursorPos函数可 以返回一个POINT变量,它指示当前的鼠标位置,而WindowFromPoint则可以返回 某一个POINT位置下的窗口句柄。写到这里我想差不多已经说完了我的思路,不 知道你是否看得明白。

总结一下,用ATL向导生成一个COM框架,增加一个ATL简单对象,在这个对象 上实现_IDTExtensibility2接口,在_IDTExtensibility2的OnConnection中Hook 住DoDragDrop API,在Word调用DoDragDrop时记录下当前的文档窗口句柄,并 Hook住第二个参数pDropSource的QueryContinueDrag虚函数,在 QueryContinueDrag里跟踪当前鼠下的窗口是否还是文档窗口(比较句柄是否等于 DoDragDrop时记录下的文档窗口句柄),如果不是则返回DRAGDROP_S_CANCE取消 拖放操作,并弹出一个警告信息的MessageBox,否则执行原有的操作(让拖放操 作正常进行)。

最后,别忘了注册你的Word插件(用Regsvr32。exe),详细的键值和代码细节 见源程序吧!

2005年10月15日夜

参考资料:

MSDN October 2001

Microsoft Office 2000/Visual Basic Programmer''s Guide

ATL Internals

Inside C++ Object Model

本文配套源码

时间: 2024-09-19 10:15:16

编写插件锁住Word文档窗口的相关文章

怎么让word文档窗口添加按钮

  第1步,打开Word文档窗口,依次单击"Office按钮"→"Word选项"命令,如图1所示 第2步,开的"Word选项"对话框中切换到"自定义"选项卡,然后在"从下列位置选择命令"列表中单击需要添加的命令,并单击"添加"按钮即可,如图2所示 第3步,重复步骤2即可向Word快速访问工具栏添加多个命令,依次单击"重置"→"仅重置快速访问工具栏"

Word文档窗口怎么添加按钮

  1.打开Word2010文档窗口,依次单击"文件"→"选项"命令. 2.在打开的"Word选项"对话框中切换到"快速访问工具栏"选项卡,然后在"从下列位置选择命令"列表中单击需要添加的命令,并单击"添加"按钮即可. 3.重复步骤2可以向Word2010快速访问工具栏添加多个命令,依次单击"重置"→"仅重置快速访问工具栏"按钮将"快速访

如何在Word文档窗口添加按钮?

  Word2010文档窗口中的"快速访问工具栏"用于放置命令按钮,使用户快速启动经常使用的命令. 默认情况下,"快速访问工具栏"中只有数量较少的命令,用户可以根据需要添加多个自定义命令,操作步骤如下所述: 第1步,打开Word2010文档窗口,依次单击"文件"→"选项"命令,如图1所示. 图1 单击"选项"命令 第2步,在打开的"Word选项"对话框中切换到"快速访问工具栏&

如何在Word 2013文档窗口内显示文字自动换行

在Word2013文档中,通过启用"文档窗口内显示文字自动换行"功能,可以在大纲视图下改变文档窗口大小时使文字自动换行,从而使Word文档窗口能够完整显示整行内容(类似于记事本中的"自动换行"效果),操作步骤如下所述: 第1步,打开Word2013文档窗口,依次单击"文件"→"选项"按钮,如图2013072514所示. 图2013072514 单击"文件"按钮 第2步,打开"Word选项"

Word 2007的文档窗口内显示文字自动换行功能

在Word2007文档中,通过启用"文档窗口内显示文字自动换行"功能,可以在大纲视图下改变文档窗口大小时使文字自动换行,从而使Word文档窗口能够完整显示整行内容(类似于记事本中的"自动换行"效果),操作步骤如下所述: 第1步,打开Word2007文档窗口,依次单击"Office按钮"→"Word选项"按钮,如图2012040422所示. 图2012040422 单击"Word选项"按钮 第2步,打开&qu

C#窗口中显示复杂Word文档

问题描述 需要一个在C#窗口中显示Word文档的功能,而且Word的格式比较复杂,有图片.图表.图形.文字等,而且板式要求高.请问有没有好的方法!先谢谢啦! 解决方案 解决方案二:我也想知道!牛人快出现!解决方案三:OFFICE在线编辑器如DSOFramer,officecontrol.cab直接在URL中打开WORD解决方案四:DSOFramerOWC解决方案五:C#编写的Word操作类,有换页,添加表格,文本功能(转)usingSystem;usingSystem.Collections.G

并排查看多个Word 2010文档窗口

Word 2010具有多个文档窗口并排查看的功能,通过多窗口并排查看,可以对不同窗口中的内容进行比较.在Word 2010中实现并排查看窗口的步骤如下所述: 第1步,打开两个或两个以上Word 2010文档窗口,在当前文档窗口中切换到"视图"功能区.然后在"窗口"分组中单击"并排查看"命令,如图2009120312所示. 图2009120312 单击"并排查看"命令 第2步,在打开的"并排比较"对话框中,选

在Word 2010文档窗口快速访问工具栏添加命令按钮

Word 2010文档窗口中的"快速访问工具栏"用于放置命令按钮,使用户快速启动经常使用的命令.默认情况下,"快速访问工具栏"中只有数量较少的命令,用户可以根据需要添加多个自定义命令,操作步骤如下所述: 第1步,打开Word 2010文档窗口,依次单击"文件"→"选项"命令,如图2009121301所示. 图2009121301 单击"选项"命令 第2步,在打开的"Word选项"对话框中

在Word 2010文档窗口中打开WPS文档

Word 2010支持WPS文件的打开和编辑,用户可以在Word 2010文档窗口中打开并编辑WPS文件.即使是金山软件最新版本的WPS2009文档,Word 2010也能提供完美支持.在Word 2010中打开WPS文件的步骤如下所述: 第1步,打开Word 2010文档窗口,依次单击"文件"→"打开"按钮,如图2009121201所示.   图2009121201 单击"打开"按钮 第2步,在打开的"打开"对话框中,单击文