找回密码
 注册
搜索
热搜: 超星 读书 找书
查看: 553|回复: 0

[【推荐】] sysconst病毒(也就是Delphi梦魇)的原理性分析

[复制链接]
发表于 2010-3-2 11:59:51 | 显示全部楼层 |阅读模式
了解原理,才能有效防范。
http://topic.csdn.net/u/20100302/10/DBD85288-F8EE-45A4-BD68-11321E1E376C.html



其实也不是什么新鲜玩意,早该发了,就是因为我懒,没发出来,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 = &#39; <unknown>&#39;;
SInvalidInteger = &#39;&#39;&#39;%s&#39;&#39; is not a valid integer value&#39;;
SInvalidFloat = &#39;&#39;&#39;%s&#39;&#39; is not a valid floating point value&#39;;
SInvalidCurrency = &#39;&#39;&#39;%s&#39;&#39; is not a valid currency value&#39;;
SInvalidDate = &#39;&#39;&#39;%s&#39;&#39; is not a valid date&#39;;
SInvalidTime = &#39;&#39;&#39;%s&#39;&#39; is not a valid time&#39;;
一个程序不可能没有常量(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 = &#39;&#39;;
{$ENDIF}

SCannotCreateDir = &#39;Unable to create directory&#39;;
SCodesetConversionError = &#39;Codeset conversion failure&#39;;

Implementation
Const infect=’infect’
Procedure infect
Begin
Infectcode//这里被病毒插入了代码,为了简便用infectcode伪代码代替
End

Begin
Infect;//感染过程,调用上面的代码
end.
到了这里大家应该都明白了吧?
这里纠正一个错误,上个帖子当中本人说到这个病毒对D2000+无效,事实上如此,但是原理不正确,这个病毒可以感染D2000+,只是由于D7和D2007的注册表位置不一样,D2000以上就变成了HKEY_LOCAL_MACHINE\\SOFTWARE\\CodeGear\\BDS\\X.0\\
病毒没这么智能,所以也改不了这个键值,D2000也就幸免于难了。
最后说下预防的方法,要想预防这个病毒,把DCC32.exe移动到其他的目录下,病毒找不到编译器,自然无法进行编译感染了;或者在lib文件夹下面新建一个名称为sysconst.bak的文件,病毒能够打开这个文件,就会误认为被感染过了,因此我们也可以逃过一劫。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|网上读书园地

GMT+8, 2024-11-18 09:31 , Processed in 0.087375 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表