爱爱小说网 > 体育电子书 > 知者无畏--一个真实的簿世界 >

第18章

知者无畏--一个真实的簿世界-第18章

小说: 知者无畏--一个真实的簿世界 字数: 每页3500字

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!




第三节 “石器时代”的反病毒

第四节  “视窗”的挑战
关于视窗的诞生,还有很多有趣的故事,很象一出农夫和蛇的戏剧,当比尔盖茨还远远没有取得今天的市场地位的时候,微软就像一只冬眠的蛇一样等待机会,而那个可怜的农夫当然就是计算机业的老大IBM了。为了开发图形界面软件,当时的IBM和微软决定联合进行开发,他们的项目名称是一个叫做OS/2的操作系统,最早是为了配合IBM推出的新一代IBM 个人电脑:PS/2,OS/2设计的基础是80286,这是第一个重大技术失策,因为80286很快就被80386取代了,另外一个重大失策是选择了微软作为合作伙伴,微软在和IBM虚以委蛇的时候,全力投入了自己的图形界面操作系统视窗3。0,视窗1。0和2。0都很不成功,被一家名字叫作“后甲板”(Quarterdeck)公司的“DesqView”,另外一个图形界面打得头破血流,但是比尔。盖茨的坚韧不拔是任何人都无法相比的,通过对OS/2虚以委蛇,全力进行视窗3。0的开发,视窗3。0终于获得了成功。(还记得微软DOS的竞争者DRDOS吗,很不幸的是,DesqView这个竞争者和DRDOS一样,现在成了免费软件,在网上你可以找到它的可执行程序和源代码,也许这就是和微软作对的必然下场吧,没有市场、没有收入,最后只能开放源代码,免费。DesqView可以在下面的站点找到:clarkson。edu/~vryhofab/wserv/freedv/)。
我记得最早微软的视窗3。0和视窗3。1开始流行的时候,还是1993年左右吧,我还在南京大学写关于某种原子内电子轨道磁矩的毕业论文,记得当时要计算一个49阶的矩阵,本来想做一篇非常酷的毕业设计,为我的计算做一个非常漂亮的演示,于是就想到了当时刚刚开始流行的视窗。
那时候视窗环境下应用程序非常少,最主要的原因是开发Window程序极为困难。基本上,开发Windows3。0/3。1环境下的程序是所有程序员的恶梦。微软的SDK之难用,连最坚强的学习者都有一种要哭出来的感觉(包括我在内),记得微软出了一套Windows3。0 SDK的手册,南大图书馆里有这本书,除了爱因斯坦的《广义相对论》以外,我觉得整个图书馆里面就是这本书最令人头疼了。后来陆陆续续又出了一些关于视窗环境下程序开发的一些书籍,所有类似的书本上面,第一段话必定是告诉你现在你处于一个全新的领域,你要做的第一件事情就是改变自己的思路。。。然后是一堆新的名词和概念,什么消息、什么队列、什么窗口、什么句柄啊,最可怕的就是句柄这个东西了,直到今天我还没有搞清楚到底什么是句柄,是个把手吗,能用手握吗?。
幸运的是,后来有了可视化的BASIC语言(Visual BASIC)和Delphi这两种革命性的开发工具,开发视窗程序一下子简单的难以置信。可视化的BASIC语言应该是提出了一种全新的开发方式,直接可以画出界面,然后就可以执行了,在我的印象中,微软很少能够开发出什么突破性的技术,VB或者是仅有的例外吧。但是由于VB是在BASIC基础上开发的,所以存在很多致命的缺陷,主要是:不能开发比较底层的程序,不能开发非常大规模的程序(由于BASIC语言的结构化不是非常好)、还有就是解释执行而不是编译执行,程序的运行速度比较低。所以在真正开发视窗程序的时候还是不得不选择C/C++语言。当时开发视窗程序的标准工具是微软C/C++版本6和版本7(Microsoft C/C++7。0);在微软的Visual C++出来以前,微软的C++语言编译器是以难用而著称的。所以大部分程序员的选择是宝兰公司的Borland C++3。1,这个编译器附带了一个非常好的类库—对象窗口库(Object Windows Library),可惜的是,Borland C++最终还是没有逃脱和微软做对的宿命,现在的Visual C++如日中天,而使用Borland C++的用户已经越来越少了。
而最早的Delphi1。0版本出来的时候,对于所有的程序员都是一个惊天动地的好消息,那时候我还在南京,盗版软件还没有今天这么流行。差不多是94年左右吧,我专门到了一次中关村,那时候希望电脑还是中国电脑界一个赫赫有名的牌子,在海淀医院的对面,希望公司有一个销售的地方还是总部已经记不清楚了,记得我在那里购买了一套正版的Delphi1。0版本。好像是好几千块钱,在当时是一个非常贵的东西了,拿到手里重重的一个盒子,里面有好多本英文的说明书,回来之后还正正规规的把大部分说明书都翻译成中文,我的英语就是那时候真正得到锻炼的。
在得到Delphi之后,视窗环境下的软件开发就变得非常容易了,简单的画一个窗口,然后在上面放置按钮、列表框、菜单等等,就可以编写出一个完成的视窗应用程序,而且这个程序是可以独立执行的EXE文件,速度很快,不是象VB一样需要解释执行,非常缓慢。更重要的是,Delphi使用了Object PASCAL语言做为基础开发语言,这种语言在简单、优雅的PASCAL语言的基础上增加了面向对象的功能,结构化和工程化非常好,甚至可以适应于大型软件开发的需要。
使用Delphi,我很快就开发出了在视窗操作系统下运行的杀毒软件VRV for Windows和后来的NetVRV。随着视窗95操作系统的出现,宝兰公司又很快推出了可以生成32位应用程序的Delphi2。0版本,这样在视窗95下也可以很方便的开发杀毒软件了。
但是Delphi还是有一点不便之处,就是PASCAL语言和C语言比较起来毕竟不是那么常见,而视窗操作系统本身是使用C语言开发的,使用PASCAL语言在调用的时候总是有一点点不方便之处,宝兰公司可能也发现了这一点,所以很快又推出了以C++语言为基础的视窗可视化开发工具—宝兰 C++构造者(Borland C++ Builder),很快,我们就从Delphi转移到C++ Builder上,并开发出了最早的病毒防火墙软件。
现在的选择就更多了,除了简单方便的C++ Builder和Delphi以外,Visual C++也成为一个不错的选择,微软在经过长时间的改进之后,总算让他的Visual C++成为可以和C++ Builder竞争的选手了,虽然从开发的方便程度上还是有所不及,但是从对操作系统的熟悉程度上,已经整体的稳定性上,微软利用自己同时开发操作系统的便利,比起宝兰公司还是要占有一点点优势的。

下面是视窗环境下开发工具的变迁



第五节 警惕的哨兵—病毒防火墙的诞生
在1997年的时候,出现了病毒防火墙技术。实际上病毒防火墙是一个通俗的名称,真正严格的方法应该把这种技术叫做“文件系统实时监视技术”。这一技术在国内首次提出的荣誉无疑应该归功于南京信源自动化技术有限公司。
一九九七年三月,中国。江苏,南京,当时微软的视窗3。1操作系统刚刚开始流行,视窗95才出现的时候,在南京解放路上一栋两层的小楼房里,南京信源公司的办公室里,一群初出茅庐的年轻人,正在讨论最新的视窗操作系统,议题集中在两个方面,一个议题,是不是需要在视窗95环境下开发杀毒软件,另外一个议题是,能不能在视窗操作系统下面实现类似内存监视的功能,实时防止病毒的入侵。当时大家对视窗环境下的开发都还是一头雾水,更不要说什么32位实时监视技术了,讨论了好几次都没有什么结果,最后决定兵分两路,一路通过对视窗3。0/3。1的研究,看看使用文件系统通知消息能不能作出实时监视系统来,另外一种就是通过当时只是听说过名字的Vxd技术,尝试做实时监视程序。
当时所使用的开发工具,是宝兰公司的 Borland C++3。1以及刚刚弄到手的宝兰公司的Delphi。

文件系统通知消息—防火墙技术的雏形:

在视窗3。0/3。1的时代,最早的文件系统变化通知消息,利用的是视窗界面的一个功能,在打开多个窗口的情况下。如果文件系统发生了变化,注册了监视功能的窗口会收到一个通知消息。利用这样一种通知技术,可以使程序及时注意到文件读写的请求,发现文件被改写之后,尽快使用杀毒程序对文件进行杀毒。
这种技术有一个非常大的局限性,首先是在DOS框下面输入的文件操作,这个功能将不会产生任何消息,其次当然是不支持视窗95了,为了解决第一个问题,使用了TSR程序和通知消息相结合的办法,我记得当时最大的技术难点是如何在DOS的TSR程序和视窗操作系统的应用程序之间进行通讯,为了解决这个问题做了很多努力,最后的效果还是不令人非常满意,所以采用这一技术的防火墙软件一直没有在市场上推出过。

基于vxd的防火墙技术
当时没有任何材料显示这样做是可行的,更不要说如何去做了,但是国外有一两个软件率先实现了这种神秘的技术,采用VXD技术进行文件系统监视,所达到的效果是非常令人吃惊的,在极低的系统资源占用情况下,实现了完全实时的文件系统监视,任何文件操作在进行之前或者完成以后会立刻通知杀毒软件进行病毒扫描。当时唯一的线索就是国外一些实现了文件系统实时监视的软件,在程序的运行目录下或者视窗操作系统的系统目录下会有类似于“Filemon。vxd”或者“AVmon。vxd”的文件,显示着Vxd技术和病毒实时监控的神秘关联。
VxD一般用汇编语言编写,如果使用C语言编写,注意不能使用任何标准的C语言库函数,(Vxd开发工具VToolsD提供了自己的C语言库函数实现,所以使用VToolsD编写的Vxd程序可以使用标准的C库函数)。Vxd程序的关键部分是一个和普通窗口的消息处理过程WndProc相类似的控制过程,不同之处在于它的处理对象是系统发来的控制消息。在VxD自加载至卸载的整个生命周期内,操作系统不断向它发送各种控制消息,VxD根据自己的需要选择处理,其余的忽略。
对动态VxD来说,最重要的消息有三个:
SYS_DYNAMIC_DEVICE_INIT
SYS_DYNAMIC_DEVICE_EXIT
以及W32_DEVICEIOCONTROL
当VxD被动态加载至内存时,系统向其发送SYS_DYNAMIC_DEVICE_INIT消息,VxD应在此时完成初始化设置并建立必要的数据结构;当VxD将被卸出内存时,系统向其发送SYS_DYNAMIC_DEVICE_EXIT消息VxD在收到后应清除所作设置并释放相关数据结构;当应用程序调用API函数DeviceIoControl与VxD进行通信时,系统向VxD发送W32_DEVICEIOCONTROL消息,它是应用程序和VxD联系的重要手段,VxD从输入缓冲区获取应用程序传来数据,相应处理后将结果放在输出缓冲区回送应用程序,达到相互传递数据的目的。
应用程序向VxD发出DeviceIoControl调用时,第2个参数用于指定进行何种控制,控制过程从DIOCParams结构+0Ch处取得此控制码再进行相应处理控制码的代号和含义由应用程序和VxD自行约定,系统预定义了DIOC_GETVERSION (0)和DIOC_CLOSEHANDLE(-1)两个控制码,当应用程序调用API函数CreateFile(〃。VxDName〃;。。。)动态加载一VxD时,系统首先向该VxD的控制过程发送SYS_DYNAMIC_DEVICE_INIT控制消息,若VxD返回成功,系统将再次向VxD发送带有控制码DIOC_OPEN(即DIOC_GETVERSION,值为0)的W32_DEVICEIOCONTROL消息以决定此VxD是否能够支持设备IOCTL接口,VxD必须清零EAX寄存器以表明支持IOCTL接口,这时CreateFile将返回一个设备句柄hDevice,通过它应用程序才能使用DeviceIoControl函数对VxD进行控制。
同一个VxD可用CreateFile打开多次,每次打开时都会返回此VxD的一个唯一句柄,但是系统内存中只保留一份VxD,系统为每个VxD维护一个引用计数,每打开一次计数值加1。当应用程序调用API函数CloseHandle(hDevice)关闭VxD句柄时,VxD将收到系统发来的带控制码DIOC_CLOSEHANDLEW32_DEVICEIOCONTROL消息,同时该VxD的引用计数减1,当最终引用计数为0时,系统向VxD发送控制消息SYS_DYNAMIC_DEVICE_EXIT,然后将其从内存中清除。在极少数情况下应用程序也可调用API函数DeleteFile(〃。VxDName〃)忽略引用计数的值直接将VxD卸出内存,这将给使用同一VxD的其他应用程序造成毁灭性影响,应避免使用。
应用程序通过使用动态加载的VxD,间接获得了对Windows9x系统的控制权,但要实现对系统中所有文件I/O操作的实时监视,还要用到另一种关键技术:文件系统挂钩(File System Hooking),通过挂接一个处理函数,截获所有与文件I/O操作有关的系统调用。Windows9x使用32位保护模式可安装文件系统(IFS),由可安装文件系统管理器(IFSManager)协调对文件系统和设备的访问,它接收以Win32API函数调用形式向系统发出的文件I/O请求,再将请求转给文件系统驱动程序FSD,由它调用低级别的IOS系统实现最终访问。每个文件IO调用都有一个特定的FSD函数与之对应,IFSManager负责完成由API到FSD的参数装配工作,在完成文件I/OAPI函数参数的装配之后转相应FSD执行之前,它会调用一个称为FileSystemApiHookFunction的Hooker函数。通过安装自己的Hooker函数,就可以截获系统内所有对文件I/O的API调用,并适时对相关文件进行病毒检查,从而实现实时监控的目的。

下面是一个使用VToolsD开发工具编写的实时监视Vxd的片段:





视窗NT和视窗2000/XP下的病毒防火墙

有两种方法可以达到这一目标:
一种是和Vxd技术非常类似的技术,在视窗NT/2000下,同样有着系统设备驱动程序,和视窗9x不一样的是,NT/2000下的设备驱动程序结构很规范,文件系统的设备驱动程序和其他设备的设备驱动程序是非常类似的,所以编写实时监视的驱动程序不需要特别的技术或者技巧,只要编写一个普通的输入输出系统设备就可以了。
另外一种是相对不那么标准的技术,我们知道,对文件系统的访问最后都是要通过Vxd进行的,但是在进行Vxd调用之前,会通过DLL的函数CreateFile等进行调用,如果修改CreateFile函数的地址为杀毒软件内部的某个地址,这样所有的文件系统调用都会首先通过杀毒软件的监视。
在视窗NT/2000/XP下病毒防火墙的技术难点主要包括:
* 是否能够适应大量并发访问的需要(NT核心是完全可重入的)。
* 是否能够处理不同权限的访问
* 是否能够在不登录的情况下实现实时监视。


第六节 主动内核,改动操作系统?
从本质上来说,主动内核技术和病毒防火墙技术没有根本的区别,都是将病毒防护从被动的检测发展到进行文件操作的时候,实时的进行反应。主动内核技术宣称自己能在操作系统和网络的内核中加入反病毒功能,使反病毒成为系统本身的底层模块,而不是一个系统外部的应用软件。任何现代操作系统都采用了某种形式的层次结构,Vxd或者其他一些设备驱动程序一般也被认为是操作系统的一部分。
主动内核技术,用通俗的说法:是从操作系统内核这一深度,给操作系统和网络系统本身打了一个补丁,而且是一个〃主动〃的补丁,这个补丁将从安全的角度对系统或网络进行管理和检查,对系统的漏洞进行修补;任何文件在进入系统之前,作为主动内核的反毒模块都将首先使用各种手段对文件进行检测

返回目录 上一页 下一页 回到顶部 0 0

你可能喜欢的