第四章 脆弱的程序?
磁芯大战吗?”萧云飞喃喃自语,眼中闪过一丝笑意 磁芯大战,一种程序游戏,它应该算是电脑病毒最早的一种形式。 早在电脑还是独立存在的个体时,为了缓解编程带来的枯燥,为自己的业余生活增添一丝乐趣,贝尔实验室的三个年轻人就创造了这种名叫“磁芯大战”的程序游戏。 大名鼎鼎的“莫里斯蠕虫”正是当年磁芯大战中的KinggOffTheHilll,“莫里斯蠕虫”仅仅只有99行,采用纯汇编语言编写而成,该蠕虫病毒在一夜之间感染了上万台Unixcao作系统的SUNN工作站和VAX小型机,使这些工作站处于瘫痪或半瘫痪状态,M国国家航空和航天局、军事基地和主要大学的计算机因为病毒停止运行,不计其数的数据和资料毁于一夜之间,“莫里斯蠕虫”一夜之间就造成一场损失近亿美元的空前大劫难。 “莫里斯蠕虫”的创造者罗特里斯,正是“磁芯大战”游戏创造者之一莫里斯的儿子,显然,罗特里斯得到了他父亲的真传。 “磁芯大战”是一种充满魅力的游戏,很多程序员对这种直观的游戏极为推崇,它不但是可以缓解程序员的工作压力,同时它还能加强程序员对底层代码的深刻认识。 在游戏的时候又能学习,所以“磁芯大战”备受程序员的推崇。 我为什么说“磁芯大战”很直观呢? 我们知道,病毒感染我们的文件大多数都是悄无声息的进行,在不知不觉中,病毒可能就已经感染了电脑中的Exe文件或者Dll文件,病毒如何复制,如何传播,如果感染文件的过程,我们地rou眼是无法看到的。 但是“磁芯大战”不一样,磁芯大战的玩法是游戏双方各写一套程序或者几套程序,输入同一部电脑中,然后将两套程序保存在电脑的存储系统内。 双方地程序进入存储磁芯开始“并发”运行后。玩游戏地人就只能看着屏幕上显示地战况。而不能做任何更改。所以我们可以通过电脑屏幕看到病毒是如何移动。如何复制。如何对其它文件进行感染或者吞噬地。 程序员编写地程序可以是短短地几行。也可以是几十行。但是程序必须拥有复制、移动、吞噬地功能。因为程序地移动是体现在进程上地。程序移动性地强弱性对程序地存活起着至关重要地作用。当程序本体被对方地程序控制时。程序可以进行自我复制。逃离对方地控制范围。吞噬地功能就是程序地破坏力。这是“磁芯大战’地实力比拼。 早期地“磁芯大战”通常都是在Mars体系结构地计算机上运行。Ma机器由一个组内存单元。一个CUU单元。一个简单进程管理系统和一组指令集构成。程序通过系统指令编写。每一个程序加载到内存地随机位置。当多个程序都加载完后系统给每个程序创建一个进程。这些进程在进程队列中地位置是随机地。系统开始运行后。各个程序开始进行对抗。通过进程地观察。可以看到谁存活到最后。 现今地“磁芯大战”工作地环境通常都是在软件模拟系统上运行。不过大多数模拟器都是模拟Mars系统地工作原理。 “磁芯大战”可以看作是原始地病毒对抗。每个程序都要尽力地消灭其他程序。为了能够生存。程序应该能保护自己。不断移动自身来躲过其他程序地攻击或当自身受到攻击后能自我修复。 正是因为“磁芯大战”地程序具有隐蔽性、攻击性和传染性。所以。很多人都说“磁芯大战”是病毒地起源。 在国外,专门有磁芯大战爱好者定期组织比赛,并以此来证明自己的实力和奇思妙想,参赛地胜利者获得KinggOffTheHill的荣誉称号。 ******************************** 薛亚妮笑了笑对萧云飞解释道:“罗杰斯教授用于磁芯大战的程序可不同于一般的程序,它有着一定程度的智能性。” “程序智能?”萧云飞有点好奇的问道。 “恩,”薛亚妮点了点头,“传统的磁芯大战程序虽然具有自我复制与攻击性,但这是程序员赋予它的特性,在比赛开始后程序就不能进行自我更变了,如果遇到轰炸地址指令更为刁钻的程序,它就只能坐以待毙。” “但是罗杰斯教授用于磁芯大战的程序却加入了一段经过加密处理的程序代码,这段代码的功能就是令他的程序具备一定的智能。” “如果它第一次在某一个特定的内存单元被对手轰炸后,只要它能够通过自身的移动逃过猎杀,那么它就会自动将这个缺陷记录在自己的扩展核心中,经过修复,第二次遇到对手这样的轰炸指令,它完全可以避免了,所以,它不会在同一个地方栽两次跟斗……” “还 为程序的攻击性,它吞噬了对方的程序后,它将会根情况保留其他程序的优越性,变为自己所有。” 薛亚妮笑了笑,脸上闪过一丝自豪的表情:“这是程序人工智能的雏形哦。” “师姐,要不我们也去凑凑热闹?”萧云飞的脸上浮现出一抹淡淡的笑意。 “你?”薛亚妮捂着嘴有点惊讶看着萧云飞,“师弟,你要去挑战罗杰斯教授的擂台吗?” “去看看也无妨啊,”萧云飞耸了耸肩笑了笑,“况且我并没有告诉过你,我计算机不行哦……” 萧云飞推开车门,东西也没有拿,径直朝着科技广场人多的地方走了过去。 薛亚妮看着萧云飞的背影,好像觉得萧云飞的身上似乎有一种强烈的自信,真不知道他地自信从哪里来的? 哼,这个师弟,我到要看看他如何打败自己设计的程序? 薛亚妮的脸上闪过一丝狡黠地笑意,打开后备箱,提着大包小包的东西跟着萧云飞挤进了人群。 广场中央有一张长方形的桌子,桌子上面放在三台计算机,中间一台计算机的面前坐着一个脑袋略微谢顶,戴着一副近视眼镜的老头子,想必这个老头应该就是薛亚妮说的罗杰斯教授,不过此时罗杰斯教授正眯着眼睛在打盹呢。 罗杰斯教授的两旁分别有两个一年级新生,其中一个亚洲人,一个欧洲人,虽然这两个学生的肤色完全不同,但是他们的脸上,透露着专注和自信地神采。 两个学生在计算机键盘上噼里啪啦地敲打着,很显然,他们在编写“磁芯大战”的程序。 亚洲学生重重扣下回车键后,站起身对罗杰斯鞠了一躬,礼貌的对罗杰斯教授说道:“教授,我的对抗程序已经编写好了,要不我们现在就开始?” 一看这个学生的架势,萧云飞就知道这是个日本人无了。 罗杰斯睁开眼睛看了看说话的日本学生,摘下眼镜在自己地西服上擦了擦淡淡的说道:“这么快就编写好了?你不需要修改修改?” 日本学生摇了摇头:“不用了,我对自己的程序有足够的信心。” 罗杰斯看了看正在忙碌的欧洲学生,淡淡的笑了笑:“我们等一下这位同学吧,等他地程序编写好了,我们三个程序一起投进虚拟机的内存中并发运行,这样节省时间,你也不会输得太难看……” 听到罗杰斯的话,日本学生的脸色有点难看,但是还是朝着又罗杰斯鞠了一躬,然后坐在计算机前打开自己的程序重新修改了起来。 围观地学生中当然不乏这方面的高手,他们看了看日本学生重新修改地程序代码,不禁议论纷纷,觉得这个程序经过修改后肯定必败无疑。 日本学生修改的程序采用了著名地死循环跳转,即跳转自身,这是对抗当中最简单的生存代码,但是这种跳转到自身地程序,自己并没有攻击能力,唯一取胜的方法就是期望对手自己死亡,是一种守株待兔的方法。 但这个程序设计有一个致命的缺陷,那就是自己在内存中的地址是固定的,它不会跳转,所以程序本体很容易遭到攻击。 萧云飞仔细看了看日本学生改写的程序,其实他倒不觉得日本学生的程序就真的那么脆弱,这种脆弱只是一种表象而已。 虽然萧云飞对日本人的看法不怎么样,但是日本人的变通却是令他觉得佩服,从这个日本学生更改的程序就可见一斑。 因为这个死循环跳转,主要功能在于自保,正是它没有攻击性,所以在多个程序对抗的时候,它就不会容易遭到其他程序的攻击。 举个例子,比如三个国家打仗,没有结成同盟的可能,其中两个都是超级大国,另一个则是毫无还手之力的小国,两个超级大国肯定最先做的事情就是把与自己实力相当的对手干掉,然后再回过头来收拾这个毫无还手之力的小国。 历史上发生这样的事情不少,不过通常都是这个像小绵羊一样温顺的小国笑到了最后。 日本学生既然听到罗杰斯要三个程序并发运行,他当然要先隐藏自己的实力,等罗杰斯和另一个学生的程序斗得两败俱伤的时候,他的程序再厚积薄发。 通过程序代码,确实可以看出这个日本人有点阴险。 为什么这么说呢? 大多数观战的学生都认为日本学生修改程序为死循环跳转,目的是想罗杰斯和另一个学生的程序对抗对,双双死亡,他捡便宜而已。 但是萧云飞却看到,这个程序中在模块跳转的时候采用了三次调用:调用了程序中一段经过加密的代码;调用复制指令;调用内存数据A、B区轰炸指令! 三个调用指令在程序中很隐蔽,况且调用的那段加密代码,那肯定不可能没有用途的! 有了这三个调用指令,这个看起来脆弱得只会送死的程序,变得给人一种神秘莫测的感觉。