其实也不是什么新鲜玩意,早该发了,就是因为我懒,没发出来,sysconst病毒(也就是Delphi梦魇)的原理性分析,大多是翻译自E文,也有自己的一点研究,欢迎大家拍砖。
  进入正题,病毒会通过注册表搜索Delphi的安装目录,然后查找sysconst.bak文件,以此判断文件是否感染,如果未被感染,则打开sysconst.pas文件,写入病毒代码,把原来的sysconst.scu改成sysconst.bak,之后调用dcc32.exe编译生成sysconst.dcu文件,并且同步时间戳,最后删除更改过的pas文件。
  而大家都知道,dcu是Delphi IDE生成的二进制映像文件,里面有保存的pas代码信息,很多控件为了避免开源,都用dcu格式发布自己的第三方控件,使得其他人无法得到源代码。如此说来,dcu是可以被编译进EXE文件的,病毒利用了这一点邪恶了编译器。
  关于病毒的流程这里就不多说了,大家可以去看我的上一篇文章关于sysconst病毒的一点分析
  既然我们知道了,sysconst.dcu是由sysconst.pas编译而来,那么病毒在pas文件中做了什么,那就是很重要的一个步骤了,我们也知道,pas当中包含了各种常量的定义,比如:
  SUnknown = '<unknown>';
  SInvalidInteger = '''%s'' is not a valid integer value';
  SInvalidFloat = '''%s'' is not a valid floating point value';
  SInvalidCurrency = '''%s'' is not a valid currency value';
  SInvalidDate = '''%s'' is not a valid date';
  SInvalidTime = '''%s'' is not a valid time';
  一个程序不可能没有常量(Consts),因为这个缘故,所有进行编译的EXE都要引用这个单元,这样就正中病毒作者的下怀。当然这里大家可能会有一个疑问,既然Pas没有被感染(Pas被感染后就被病毒删除了,留下的是干净的pas),生成的EXE为什么会被感染呢?答案很简单,因为Delphi的编译器引用常量单元的时候,不是引用sysconst.pas而是sysconst.dcu,所以病毒不需要感染pas文件,只要保证dcu文件被感染过就行了。
事实上,每个EXE被编译的过程,都要经过dcu这个中间文件:
1、 首先编译器把目标pas文件编译成dcu文件,实现代码到二进制的转换。
2、 编译器当中的链接器(linker)将所有的dcu文件汇编成exe文件。
编译生成的EXE当中,首先运行的是初始化代码,然后会转到程序当中的Begin处,而sysconst.pas掌管的就是初始化(initialization)部分,因此,无论在Begin事件后怎样编写代码,都无法影响到这个病毒,在sysconst.dcu当中加入的代码会被直接编译进EXE文件,而EXE当中的附加代码则会重复查找Sysconst.pas并且感染文件这一过程。
这个病毒是否无法察觉呢?答案是否定的。编译生成的新sysconst.dcu一般会比原来的那个大好几KB,笔者的电脑上,这个文件有20KB,而未被感染的同名文件只有13-14kb左右,而编译生成的带毒EXE和普通EXE在大小上也有5-6KB的差距。
  如果利用各种防御措施,在病毒感染pas之后,没有让其自删除(可以利用主动防御拦截deleteFile操作),而是保留了罪证的话,那样嘿嘿
  查看被感染的pas代码,会有如下发现:
{$IFDEF LINUX}
  SEraEntries = '';
{$ENDIF}  SCannotCreateDir = 'Unable to create directory';
  SCodesetConversionError = 'Codeset conversion failure';Implementation
Const infect=’infect’
Procedure infect
Begin
Infectcode//这里被病毒插入了代码,为了简便用infectcode伪代码代替
EndBegin
Infect;//感染过程,调用上面的代码
end.
  到了这里大家应该都明白了吧?
  这里纠正一个错误,上个帖子当中本人说到这个病毒对D2000+无效,事实上如此,但是原理不正确,这个病毒可以感染D2000+,只是由于D7和D2007的注册表位置不一样,D2000以上就变成了HKEY_LOCAL_MACHINE\SOFTWARE\CodeGear\BDS\X.0\
病毒没这么智能,所以也改不了这个键值,D2000也就幸免于难了。
  最后说下预防的方法,要想预防这个病毒,把DCC32.exe移动到其他的目录下,病毒找不到编译器,自然无法进行编译感染了;或者在lib文件夹下面新建一个名称为sysconst.bak的文件,病毒能够打开这个文件,就会误认为被感染过了,因此我们也可以逃过一劫。

解决方案 »

  1.   

    没空,先MARK 
    我日你的 回复内容太短了!
      

  2.   

    Thanks.           学习了   
      

  3.   

    没空,先MARK 
    我日你的 回复内容太短了
      

  4.   

    http://www.bvbuy.cn/TopSales.html
      

  5.   

    还以为是讲delphi坎坷的前景呢
      

  6.   

    delphi 好像很久没有用了。项目不让用了。
      

  7.   

    xue  xi   xue xi
      

  8.   

    明白了,看了一下sysconst.dcu的属性,没中毒
      

  9.   

    当学生就是好,有时间去搞这些东西,羡慕,cai bu hao ne 一点不好
      

  10.   

    此病毒貌似是有delphi的机子上,拷回了一个染过毒的delphi程序,运行后便进行感染。
    昨天是第二次中delphi梦魇顶一个~
      

  11.   

    这个病毒本来是一个俄罗斯人写的,之后他肯定感染了某个Delphi IDE,之后使得每个运行过带毒EXE的IDE都感染。其实只要第一个人写出来了,传播是一件很容易的事
      

  12.   

    很不幸我的SysConst.dcu只有11.3K所以估计没中但据体也没研究过原文件多大,所以也没法估算
    有一次我要读写注册表起动项都被杀了,所以我对病毒不是很感冒,杀软只是软件不是人工智能,我相信我自已多一点
      

  13.   

    先MARK我日你的 回复内容太短了