原因找到后。肖远将钻进god程序代码段隐藏起來的种子抓了出來。却沒有对它的主体进行修改。但是为了便于观察。肖远在种子进化出的代码的基础上。给它增加了一个监视模块。并将这个模块的规则设置成必须存在。这样做是为了防止种子在继续进化的时候。将这个模块给破坏掉。
将种子改造完之后。肖远将被破坏掉了的god程序恢复了正常。并将种子发现并利用的那个漏洞给打了补丁。但是为了验证他的想法。他在将漏洞堵掉的同时。有刻意的加入了另一个漏洞。
搞完这一切之后。肖远运行了god程序。一个初始状态的世界被创造了出來。种子随后被放了进去。静态平衡瞬间被打破了。god和种子之间的新一轮对抗开始了。
因为这次放进去的是进化后的种子。god监控程序绘制出來的图像上能够看得出來。它在进到世界之后。比起最初的版本进去后对god的围追堵截疲于应付的情况來。显得轻松自如的多。以至于世界内只看到种子在快速的到处移动。所到之处。引起的波澜却小了很多。而在它离开后。原本激荡的波澜也不会持续多久。就快速平息了下來。
肖远沒有去过多关注这个图像。他将这个监控程序扔到了后台。将刚刚植入种子的监控模块调了出來。这个模块会将种子程序的每一步操作记录下來。并将之存储成一个标准的记录文件。
为了减少种子的代码长度。肖远设计的种子的监控程序记录下來的操作是二进制机器码。因此他如果想要阅读这些操作。还需要进行进一步转换。这个转换肖远用到了另外一个分析工具。这个分析工具读取记录文件。并实时将每一步操作反汇编成汇编程序显示在他的一个侧窗口中。而汇编语言虽然读起來不如高级语言那么清晰。但是阅读汇编语言对于肖远來说。并不是什么难事。
仔细观察着这些汇编代码。肖远发现种子在进入世界后。并沒有马上去入侵那个已经被肖远堵住的漏洞。而像是在适应着环境。很长一段的汇编操作。都是利用汇编的跳转命令。在内存空间跳转。跳转。再跳转。不停的变换着自己的方位。
当然在变换方位的时候。它还做了其他一些操作。其中最让肖远感兴趣的是它在转移后对原來现场的清理。肖远在编制这个程序的时候。给出的设定规则是。当种子利用跳转命令从一个内存区域离开的时候。它在原來区域造成的不平衡会弃之不顾。恢复平衡的工作完全交由god程序來完成。这种策略就像一个旅游者在某一个地方制造了一堆垃圾。离开时完全不理会。清理工作将会有景区的清洁工來完成。
但是现在的情况是。这个旅游者好像变得文明了。他离开之前。将垃圾清理。甚至还帮着将他弄乱的环境给恢复了原状。种子跳转离开后。会将他原來搞得失去平衡的区域重新恢复平衡。
看到这里。肖远将这种情况和god监控程序显示的情况进行了对比。发现两者是一致的。
种子为什么会进化出这样的功能出來。肖远有些想不通。他以人类的思维考虑了一番。觉得如果他要是到了一个地方。被这个地方的人追杀。为了顺利逃脱。他一定会竭尽所能将这个地方彻底搅乱。而不是反其道而行之。
这样的情况持续了一段时间。情况开始有了变化。种子每过一处都会自己清理现场。必然会耗费一定的计算时间。反过來说。也给god节省了大量的计算时间。此消彼长间。种子有六次被god都被god将代码段给破坏掉了。
肖远在最初设计种子程序的时候。这种情况实际上已经考虑到了。针对这种情况。他专门为种子设计了一个备份器。这个备份器会将种子最近一个稳定版本存储下來。而种子的代码一旦被破坏。这个备份器就会被触发。然后将他存储的正常代码把被破坏掉的代码覆盖掉。从而达到修复种子的目的。
六次种子被god破坏。其中五次都是通过上面的方法进行修复的。但是第六次却发生了意外。这次意外源于时间上的巧合。god在对种子代码段的破坏刚刚开始之时。种子也正好发出代码跳转命令。于是种子的代码被破坏掉了两个字节后就跳转到另外的区域去了。
因为跳转命令执行成功。所以备份模块认为种子沒有遭到破坏。因此备份程序的恢复功能沒有被触发。反而备份功能被触发了。备份功能是将此时正常的种子代码拷贝到备份存储器中一份。
此时种子程序显然是有问題的。为了防止备份程序采样到这种有问題的程序。当初肖远在设计的时候。给它设计了一个校验功能。这个校验功能会对它读取到的代码进行校验。如果发现有问題。就会进一步判定种子代码出问題了。进而启动恢复功能。使用备份存储器中的正常代码覆盖有问題的代码。
这是正常的流程。如果不发生其他意外的话。种子同样会被恢复正常。然而另一个巧合再次发生了。这段被破坏掉的代码实际上仍然是一个二进制字符串。这个字符串和CPU的某一个指令非常巧合的完全一样。以至于它竟然鱼目混珠般的通过了校验。混进