以前,我曾认为只要不随便运行网友发来的文件就不会中病毒或木马,但后来出现了利用漏洞传播的冲击波、震荡波;以前,我曾认为不上小网站就不会中网页木马,但后来包括国内某知名游戏网站在内的多个大网站均在其首页被黑客挂上了木马。从此,我知道:安全,从来没有绝对的。
虽然没有绝对的安全,但如果能知已知彼,了解木马的公开手段,对于木马即使不能百战百胜,也能做到及时发现,使损失最小化。那么,木马究竟是如何躲在我们的系统中的呢?
最基本的公开:不可见窗体+公开文件
木马程序无论如何神秘,但归根究底,仍是Win32平台下的一种程序。windows下常见的程序有两种:
1.Win32应用程序(Win32 Application),比如qq、Office等都属于此行列。
2.Win32控制台程序(Win32 Console),比如硬盘引导修复程序FixMBR。
其中,Win32应用程序通常会有应用程序界面,比如系统中自带的“计算器”就有提供各种数字按钮的应用程序界面。木马虽然属于Win32应用程序,但其一般不包含窗体或公开了窗体(但也有某些特殊情况,如木马使用者与被害者聊天的窗口),并且将木马文件属性设置为“公开”,这就是最基本的公开手段,稍有经验的用户只需打开“任务管理器”,并且将“文件夹选项”中的“显示所有文件”勾选即可轻松找出木马(见图1),于是便出现了下面要介绍的“进程公开”技术。
第一代进程公开技术:windows 98的后门
在windows 98中,微软提供了一种能将进程注册为服务进程的方法。尽管微软没有公开提供这种方法的技术实现细节(因为windows的后续版本中没有提供这个机制),但仍有高手发现了这个秘密,这种技术称为RegisterServiceProcess。只要利用此方法,任何程序的进程都能将自己注册为服务进程,而服务进程在windows 98中的任务管理器中恰巧又是不显示的,所以便被木马程序钻了空子。
要对付这种公开的木马还算简单,只需使用其他第三方进程管理工具即可找到其所在,并且采用此技术进行公开的木马在windows 2000/XP(因为不支持这种公开方法)中就得现形!中止该进程后将木马文件删除即可。可是接下来的第二代进程公开技术,就没有这么简单对付了。
第二代进程公开技术:进程插入
在windows中,每个进程都有自己的私有内存地址空间,当使用指针(一种访问内存的机制)访问内存时,一个进程无法访问另一个进程的内存地址空间,就好比在未经邻居同意的情况下,你无法进入邻居家吃饭一样。比如qq在内存中存放了一张图片的数据,而MSN则无法通过直接读取内存的方式来获得该图片的数据。这样做同时也保证了程序的稳定性,如果你的进程存在一个错误,改写了一个随机地址上的内存,这个错误不会影响另一个进程使用的内存。
你知道吗——进程(Process)是什么
对应用程序来说,进程就像一个大容器。在应用程序被运行后,就相当于将应用程序装进容器里了,你可以往容器里加其他东西(如:应用程序在运行时所需的变量数据、需要引用的DLL文件等),当应用程序被运行两次时,容器里的东西并不会被倒掉,系统会找一个新的进程容器来容纳它。
一个进程可以包含若干线程(Thread),线程可以帮助应用程序同时做几件事(比如一个线程向磁盘写入文件,另一个则接收用户的按键*作并及时做出反应,互相不干扰),在程序被运行后中,系统首先要做的就是为该程序进程建立一个默认线程,然后程序可以根据需要自行添加或删除相关的线程(见图2 进程关系图)。
1.进程插入是什么
独立的地址空间对于编程人员和用户来说都是非常有利的。对于编程人员来说,系统更容易捕获随意的内存读取和写入*作。对于用户来说,*作系统将变得更加健壮,因为一个应用程序无法破坏另一个进程或*作系统的运行。当然,*作系统的这个健壮特性是要付出代价的,因为要编写能够与其他进程进行通信,或者能够对其他进程进行*作的应用程序将要困难得多。但仍有很多种方法可以打破进程的界限,访问另一个进程的地址空间,那就是“进程插入”(Process Injection)。一旦木马的DLL插入了另一个进程的地址空间后,就可以对另一个进程为所欲为,比如下文要介绍的盗qq密码。
2.木马是如何盗走qq密码的
普通情况下,一个应用程序所接收的键盘、鼠标*作,别的应用程序是无权“过问”的。可盗号木马是怎么偷偷记录下我的密码的呢?木马首先将1个DLL文件插入到qq的进程中并成为qq进程中的一个线程,这样该木马DLL就赫然成为了qq的一部分!然后在用户输入密码时,因为此时木马DLL已经进入qq进程内部,所以也就能够接收到用户传递给qq的密码键入了,真是“家贼难防”啊!