注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

阿山的博客

My Colourful Life

 
 
 
 
 

日志

 
 
 
 

Delphi也来打造U盘防火墙  

2007-06-02 15:25:10|  分类: 机器们 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

文/图:举世^杰伦(DJun)

大家好!我是举世^杰伦,大菜鸟一个,第一次投稿,请高手们多多指点!

大家都知道,近来计算机病毒异常猖狂,杀毒软件防不胜防。很多病毒是通过U盘等可移动磁盘进行传播的,原理很简单,就是利用在磁盘根目录创建关联病毒程序的Autorun.inf。《黑防》向来关于Delphi的文章不多,看了2007年第一期文章P60《VC打造U盘防火墙》,觉得仅通过检查U盘中是否有Autorun.inf似乎还不够,于是就写了这片短文与大家分享。同样的话:为了不让这个病毒害人,掏出我们的武器——Delphi!

窗体大家自己设计好了,我的简陋吧(如图一)?如果要把程序做成监控模样的,可以写一个系统托盘图标,我为了方便,使用了别人写好的控件Cool Tray。

Delphi也来打造U盘防火墙 - 不死鸟 - Phoenix图1

 

设置全局变量:

  s,vfname:string;f,f1,f2:text; //读Autorun.inf用,等下看主要代码就知道意思了

  Drive:integer;driveletter:char; //枚举磁盘用

加入一个Timer控件,取名work,用来实时检测U盘。下面是检测U盘的代码,多了对Autorun.inf的分析:

for Drive := 2 to 25 do   //通过循环枚举磁盘

  begin  //1

    DriveLetter := Chr(Drive + ord('A'));

     if(GetDrivetype(PChar(DriveLetter+':\'))= DRIVE_REMOVABLE) then  //用GetDrivetype判断磁盘是否为可移动磁盘

      begin  //2

      if (FileExists(DriveLetter+':\autorun.inf')) then begin  //如果检测到Autorun.inf

       assignfile(f,driveletter+':\autorun.inf');

       reset(f);

       while not eof(f) do

        begin //3

        readln(f,s);  //逐行读取

        if pos('open=',s)=1

         then vfname:=copy(s,6,length(s));

        if pos('shellexecute=',s)=1

         then vfname:=copy(s,14,length(s));

        if pos('shell\Auto\command=',s)=1

         then vfname:=copy(s,20,length(s));  //若读取到三行关键的语句,截取后面的程序文件名,赋值给vfname

        end;  //3

       closefile(f);

       //以下是对检测到的Autorun.inf和病毒程序进行处理

       if vfname<>'' then begin  //vfname默认为无,不为无则说明检测到了带有病毒的Autorun.inf和病毒程序。这样可以排除用于更改磁盘图标的Autorun.inf

        dfile(DriveLetter+':\'+vfname);

dfile(DriveLetter+':\autorun.inf');  //使用自己定义的用于删除文件的过程

        ctray.ShowBalloonHint('请注意!', '在您的可移动磁盘('+driveletter+':)中发现可疑的Autorun.inf文件及其中关联的可疑程序!'+#13+'操作:删除它并删除可疑程序',bitWarning,10);  //显示气球信息

        showlog.Lines.Add('在您的可移动磁盘('+driveletter+':)中发现可疑的Autorun.inf文件及其中关联的可疑程序!操作:删除它并删除可疑程序');  //在Memo控件中添加显示的气球信息内容

       end;

      end;

      vfname:='';  //记得设置vfname为空

只要利用Pascal中最基本的操作字符串的函数pos和copy,就能在清除Autorun.inf的同时顺带将关联的病毒程序也清除掉,是不是很简单?

为了使U盘不再被病毒利用作为传播的媒介,可以参考《黑防》2007年第一期文章《三板斧消灭电脑上的病毒与木马》P71的方法,继续添加代码:

      if not DirectoryExists(DriveLetter+':\autorun.inf') then begin //判断U盘根目录是否有Autorun.inf文件夹,没有就免疫

        defend(driveletter);  //使用自己定义的用于免疫磁盘的过程

        ctray.ShowBalloonHint('免疫磁盘', '您的可移动磁盘('+driveletter+':)已免疫!',bitInfo,10);

        showlog.Lines.Add('免疫磁盘:您的可移动磁盘('+driveletter+':)已免疫!');

        end;

       end; //2

      end;  //1

自定义的删除文件的过程代码:

setfileattributes(pchar(pathandfilename),FILE_ATTRIBUTE_NORMAL);  //设置文件为普通属性

DeleteFile(pathandfilename);

自定义的免疫磁盘的过程代码(这里使用创建并运行批处理的方法):

assignfile(f2,ExtractFileDir(Application.Exename)+'\d'+driveletter+'.bat');  //在程序所在目录创建批处理文件,以磁盘盘符命名

rewrite(f2);

writeln(f2,'@echo off');

writeln(f2,driveletter+':');

writeln(f2,'cd\');

writeln(f2,'attrib autorun.inf -h -s -r');

writeln(f2,'del autorun.inf /f /q');  //此行和上一行用于删除Autorun.inf文件,写得不好,与work的OnTimer事件中的代码有点矛盾(不能排除用于更改磁盘图标的Autorun.inf)

writeln(f2,'md autorun.inf');

writeln(f2,'attrib autorun.inf +h +s +r');

writeln(f2,'del "'+ExtractFileDir(Application.Exename)+'\d'+driveletter+'.bat"'+' /f /q');

closefile(f2);

Winexec(pchar(ExtractFileDir(Application.Exename)+'\d'+driveletter+'.bat'), sw_hide);  //运行批处理

像前段时间的QQPass(QQ通行证)病毒,不仅会在U盘也会在硬盘各分区的根目录下创建Autorun.inf。我们可以在work的OnTimer事件中继续添加对于硬盘分区的检测和免疫的代码。这里就不写出来了。

把其他代码补充完整后,Delphi版U盘防火墙增强版就做好了!愿拜高手为师傅,我的QQ:226540242。

 

 

 

 

呵呵,这是我一好友的作品。这篇稿子刊登在《黑客防线》的2007第5期。

点击进入ADefender2r.exe G宝盘下载页面

  评论这张
 
阅读(404)| 评论(0)
推荐

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018