震网的主体是一个超大的DLL文件。里面包含数十个小的DLL文件和其他组件,这些文件层层加密、嵌套在一起
第四章 解构震网(接上)
钱哥刚入职的时候,病毒研究员的工作有点像电器公司的维修工,有很多停工等待的空闲时间。病毒很稀少,一般以软盘为载体、通过人为携带病毒文件的方式缓慢传播。认为自己遭到病毒感染的客户,会把存有可疑文件的软盘寄给赛门铁克公司。然后,软盘可能会在某个文件盒里面呆上一个星期,然后钱哥或另一位同事接到通知,再过去把它拿过来。有趣的是,大多数时候,软盘上的文件都不是病毒。当偶尔发现病毒时,他们会立即把病毒的特征码加到检测工具中,然后把“更新包”放在另一张软盘中寄回给客户,并提供升级杀毒软件的说明。
这种慢节奏持续了很长时间。随着Win98和Office软件的出现、互联网的扩张和电子邮件的泛滥,情况发生了变化。病毒进化了。快速传播的病毒和网络蠕虫可以在几分钟内感染数百万台计算机。1999年的梅丽莎(Melissa)病毒就是其中的翘楚。新泽西州一位名叫大卫•史密斯(David Smith)的31岁程序员制作了它,把它嵌入到Word文档中,然后把它放到了alt.sex.usenet新闻组上。他非常了解这里的目标受众,他宣称,文档中有登录色情网站的用户名和密码,以此怂恿他们打开染毒文档。一旦文档被打开,梅丽莎病毒就会利用Word宏功能中的漏洞,把自己发送到本机Outlook(Office套件中的邮件服务程序)账户中前50个联系人的邮箱中。作为世界上首个通过电邮实现大规模传播的病毒,它在3天之内感染了超过10万台计算机,创造了当时的记录。当然,以今天的标准,肯定是不值一提啦。除了通过Outlook传播之外,病毒还会在遭感染计算机的文件中插入一段与Scrabble拼字游戏有关的奇怪文字:“22分。加上分数的3倍,再用我的全部字母加上50。游戏结束,我走啦!”(注:来自动画片《辛普森一家》第1季第2集,Bart在一局Scrabble游戏中说的话。)梅丽莎病毒没有造成什么大的破坏,但在它的示范效应下,具有快速传播能力的病毒和蠕虫成为接下来几年里的主流威胁。
随着威胁不断增长,赛门铁克公司意识到,必须在病毒大规模爆发之前就将其快速杀灭。而当公司刚进入杀毒领域时,确定的响应时间“良好”标准是:从发现病毒起,在一周之内发布特征码。现在,公司打算将这个标准提高到一天之内。要实现这个目标,公司需要在不同时区安排值班分析师,以便能第一时间发现病毒,并在美国客户起床并点击带毒的邮件附件之前,把特征码分发给他们。
此时,钱哥已经完成了自己在赛门铁克的“两年计划”。攒够了读研究生的钱哥,打算先去科罗拉多滑滑雪,再回学校攻读科学学位。不过公司给了他一个充满诱惑的合约——去荷兰任职。公司在阿姆斯特丹附近有一个技术支持和销售办公室,急需成立一个病毒分析团队。这么好的机会放在眼前,钱哥没理由不答应。他刚去荷兰没几天,就赶上了2000年5月的“求爱信”病毒(Love Letter worm)大爆发。病毒来自菲律宾,开始像是大学生搞的恶作剧,但之后一发不可收拾,感染了全球数百万台计算机。这个事件,很好的检验了赛门铁克欧洲团队的应急响应能力,虽然这个团队只有一个人。钱哥以创纪录的不到20分钟的速度,完成了代码分析,并发布了用于检测病毒的特征码。然并卵。因为病毒占用了几乎全部网络带宽,客户根本连不上赛门铁克服务器,更别说下载病毒库升级包了。当危机过后,钱哥在阿姆斯特丹招募了4名员工,充实了团队。增加的人手,在一年后迎战“红色代码”的工作中派上了用场。
后来,为组建另一个团队,钱哥到东京呆了一小段时间。2004年,赛门铁克将欧洲公司从阿姆斯特丹搬到了都柏林,钱哥也跟着去了爱尔兰。很快,钱哥又把包括莫楚在内的十几名新人招至麾下。 2008年,他和曾在赛门铁克公司工作过的一名法国妹纸——他的新任妻子一起回到了美国。再后来,他加入了莫楚负责的加州团队。
现在,卡尔弗城的钱哥、莫楚和巴黎的法里耶要打一场解构震网病毒的硬仗。
当他们尝试解密震网全部代码时,出现了第一个真正的障碍。如莫楚之前发现的,震网的主体是一个超大的DLL文件。里面包含数十个小的DLL文件和其他组件,这些文件层层加密、嵌套在一起。必须把这么多层加密机制全部破解,才能开始分析代码。幸运的是,密钥就保存在代码当中。每当震网进入一台计算机时,它都会根据情况需要,用这些密钥解密里面的DLL文件和其他组件,并将它们提取出来。这应该是病毒设计者预想的工作模式。但是,在实验计算机上,用于解密“载荷”的最后那些密钥并没有被激活。
莫楚仔细侦查代码中的蛛丝马迹,终于,在看到与西门子PLC有关的注释文字时,他悟出了其中原因。震网只会入侵安装了西门子公司Step 7或WinCC软件的计算机,而且,这些软件所对应的PLC还必须是S7-315和S7-417这两个型号。只有软硬件环境同时满足上述条件,才能激活震网解密并释放载荷代码的密钥。
问题是,钱哥和莫楚到哪儿去找西门子的产品呢?所以,他们只好用调试器(debugger)来一遍又一遍的摆弄代码,以求找到密钥、并手工解锁载荷。
调试工具(debugging program)是逆向工程师的大杀器,可以用它们一步一步的观察代码的执行过程,就像定格动画摄像机一样。这样,可以逐步将每一个函数分离出来,记录这些函数的功能和任务。用这种方法,他们摘出了所有包含解密代码指令的代码块,然后顺藤摸瓜,找到了密钥。但这只完成了任务的一半。找到密钥之后,还要猜解出每个密钥对应的加密算法。整个挖掘过程持续了好几天。当他们完成了对病毒所有部分的解密后,他们终于看透了震网在开始感染计算机时所执行的每一个动作。
震网做的第一件事,就是判断计算机到底是32位还是64位,如果是64位,放弃。它还会检查计算机是否曾被震网病毒感染过,如果发现上面已有旧的震网版本,就会将其清除并用新版本替换掉。如果发现未被感染的计算机,它就会“演出一段精心彩排过的舞蹈”:迅速通过一系列步骤进驻这台计算机,并确定下一步行动计划。
在这个过程中,会有一匹木马(rootkit)抢先“登陆”并实现U盘上病毒文件对系统的“隐身”。具体手段是,先嵌入系统(hooking the system),使反病毒引擎无法看到文件名,从而躲避扫描。如果扫描器要扫描U盘上的内容,木马可以将扫描器的命令拦截下来并进行修改,最终给系统返回一个没有震网病毒文件的结果清单。但这一招无法骗过所有的反病毒产品。震网病毒的设计者事先考虑到了这个问题,并提前做好了应对预案。如果震网发现计算机上安装了这种厉害的反病毒软件,就会立即停止感染,什么也不做。(待续)
注释:
Scrabble是西方流行的英语文字图版游戏,在一块15×15方格的图版上,2至4名参加者拼出词汇而得分。词汇以填字游戏的方式横竖列出,并必须收录在普通词典里。不同字母有不同分数,是根据在标准书写英语中出现频率订定,如经常出现的E和O只值1分,但不常用的Q和Z则值10分。图版上有不同颜色的格子,参加者可从中获得额外分数。一个游戏版,一百个游戏字卡,四个字卡尺和字卡袋一个。
Twenty-two points, plus triple-word-score, plus fifty points for using all my letters. Game’s over. I’m outta here.
这段话来自动画片《辛普森一家》第一季第二集。
译者:李云凡