绪论
20世纪七八十年代,许多重要的新技术相继出现。例如:出现了复印技术、录像技术、方便家庭录制的盒式磁带技术、卫星广播技术、有线电视技术,而且计算机程序、计算机创作的作品以及电子数据库的重要性也日益显现出来。当时,各国陷入计算机软件保护模式之争,主要存在两类分歧:第一类主张将计算机软件纳入《版权法》进行保护;第二类主张将计算机软件作为一种新的知识产权类型加以保护。由于各国极力主张用沿用本国现行法律加以保护,所以最后WIPO釆取了折中做法:在计算机软件保护领域采取"指导发展"战略1,而不是试图制定新的国际规范,即明确计算机软件是需要法律保护,至于各国适用何种形式的法律加以保护在所不问。由于计算机软件与文字作品有其相似之处,所以各国陆续开始将计算机软件纳入到本国《版权法》保护。随着计算机软件业在我国迅猛发展,我国《版权法》保护客体也已经延伸至计算机软件。
计算机软件反向工程就像一把双刃剑,版权人视它为版权法的敌人,而软件反向工程开发者却视它为突破技术垄断的最后一根稻草。归根到底,计算机软件反向工程的合法性之争,就是软件权人与软件反向工程开发者的利益之争。很多学者认为,计算机软件反向工程技术是对版权人专有权中复制权的严重侵害,应当严格禁止其适用;也有学者认为,反向工程技术有利于促进科技的进步,同时也是市场竞争中的激励因子。笔者认为,对于计算机软件反向工程采取任何法律规定都应采取谨慎的态度,同时有条件地承认部分计算机软件反向工程行为的合法性不失为一种变通之举。
如果对计算机软件反向工程行为的探析单纯停留在法律层面,不免有失偏颇。想要正确厘清计算机软件反向工程技术和计算机软件保护之间的关系,我们应该从实际情况入手,从市场经济、法律及公共利益层面加以综合分析,得出一个客观的结论和解决方案。最后,本文梳理了不同法律保护下的计算机软件反向工程条件,用来平衡软件开发者、运营者和社会公众之间的利益分配问题,为计算机软件反向工程的适用奠定新的立法基础。
1计算机软件反向工程基本理论
1.1计算机软件反向工程概念
反向工程最早应用于集成电路布图领域,随着科技的发展,反向工程已经被广泛应用到许多技术领域。在计算机软件领域,反向工程一词最早在1960年代被使用,当时该技术主要用于软件运行平台的移植。通常来说,计算机软件反向工程是指通过对他人软件进行逆向解剖、分析,采取反向编译、直接观察法、体验软件功能和操作流程等方式推导出他人软件产品的功能、软件结构、处理流程、算法、界面设计等。在计算机版权保护领域,反向工程有时可以被缩小解释为"反向编译".世界知识产权组织在其所发表的《世界知识产权组织知识产权手册:政策、法律及其适用》一书中对软件反向编译作了如下定义:"反向编译是一种对计算机程序进行复制和翻译,从而使其编码与结构可被观察和分析的过程。这种过程即指,通过对计算机软件目标代码的分析反推出其相应源代码的过程。" 2其实在计算机领域,反向工程的内涵要比反向编译更为广泛。计算机软件方向工程技术从广义上讲,主要包含以下四种方式:第一,阅读软件的说明书、软件的功能等文字性说明;第二,体验软件在电脑上运行时的功能、操作等情况;第三,对计算机软件的结构、功能进行静态分析;第四,对计算机软件的结构、功能进行动态分析。3在多数情况下,软件工程师只有借助反向编译手段才能对目标软件进行"反向工程",从而开发出具有兼容性的软件产品。所以,计算机软件反向编译技术己经成为计算机软件反向工程的一种主要手段,同时也是各国法律规制的主要对象。现今,各国法律针对计算机软件反向工程的规制,主要集中在计算机软件"反向编译"部分。
1.2从技术角度看计算机软件反向工程
在了解计算机软件反向工程之前,我们有必要先了解下计算机软件的一般开发方法。计算机软件的开发方法有很多种模式,不同种模式所具有的开发步骤也不相同。一般的计算机软件开发步骤应该包括以下几个步骤:第一步,规范说明书(Specification),计算机软件的规范说明书包括软件的结构、功能、软件实现的想法,规范说明书包含所有的抽象信息。这些抽象信息包括软件的需求分析,编写该软件的规模和时间及该软件的核心算法;第二步,编写源代码,源代码是一种可以为人所直接阅读的文字信息。不同语言编写的源代码,有不同的编写规则,一般包含逻辑结构、存储结构及软件接口,但源代码不能被电脑直接运行;第三步,生成目标代码,目标代码可以通过编译器对源代码直接编译获得,它是一种直接可以被电脑所运行的"0","1"信息。所有的软件都包含两种形态一一 "源代码"和"目标代码",人们日常使用的软件是经过封装、可被计算机直接执行的目标代码,同时也计算机反向编译技术所针对的对象。
软件工程师主要有三种计算机软件反向工程策略:第一种,阅读计算机软件文档,计算机软件文档包含大量的有用信息,如软件的功能和使用技巧等;第二种,黑盒测试("Black Box"Observation),将程序看作一个不能打幵的黑盒,在不完全考虑程序内部结构和内部特性的情况下,通过软件接口输入一连串的信息和软件返回的一连串数据信息,分析出该软件所具有的功能和算法,从而写出功能类似的新软件;第三种,通过研宄目标静态代码,然后监测运行过程中程序的内部运行情况。市面上发行的软件,大多是可执行的软件目标代码,所以要想通过软件目标代码对该软件进行反向工程,则只能选择第二种、第三种反向工程策略,即直接观察软件功能法4和反向编译目标软件的目标代码。其中反向编译是计算机软件反向工程的主要手段之一,但反向编译也是一个费时、费力的浩大工程。我将带领大家领略下,将计算机目标代码反向编译成源代码的艰难历程:
第一步,获取目标代码。由于市面上发行的软件都是封装后的目标代码,所以获取软件的目标代码不费吹灰之力。但目标代码包含的"0"、"1"信息量却十分巨大:一个八行代码的小程序,就能产生50页的二进制代码。而日常生活中一个普普通通的程序在50万字节大小左右,它将产生62500行二进制代码,需要1250页纸才可以将它打印下来。5第二步,将目标代码转换成Hex码和ASCII码。这一步可以由电脑自动完成,将二进制代码变成了十六进制代码。十六进制转换存储虽然改变了原来目标目标代码的面貌,但这种转换并没有添加任何信息。某些反向工程的反对者声称,程序员可以直接阅读Hex码和ASCII码,并以此撰写出功能类似的软件。如果在20世纪60年代中后期,这种说法有一定的价值。
因为在当时,高级语言并未出现,程序员只能看着十六进制转储(hex dump)进行调试。高级语言出现后,已经没有程序员通过阅读十六进制转储来调试自己的程序了,因为随着高级语言的出现,软件代码量迅速增长,通过十六进制转储(hex dump)进行反向编译变得不切实际。
第三步,查看CPU指令。计算机程序的目标代码并不是按照我们平常书写文章时的逻辑顺序所写。目标代码的"0","1"数据同时包含指令和数值,而这些指令和数值又是通过各种跳转联系在一起。所以在反向编译过程中,工程师第一步所要做的事情是发现首条CPU指令。
然后将这条指令作为一个旅程的起点,然后逐步执行指令,如果出现"分支"或者"跳转"指令,则要记下这些指令用来找到下一条所要执行的指令,然后通过CPU指令手册来查看每一条指令的意义。实际上,此过程十分复杂,每条CPU指令的长度也不一定是相等,加之指令和数值混在一起,所以要完成这个步骤非常耗时耗力,同时需要结合工程师的大量个人经验。
第四步,翻译成汇编语言并为其添加注释。汇编语言(Assembly Language)是面向机器的程序设计语言。在汇编语言中,用助记符(Memoni)代替机器指令的操作码,用地址符号(Symbol)或标号(Label)代替指令或操作数的地址,如此就增强了程序的可读性和编写难度。
第五步,通过对汇编代码注释翻译出相应的源代码语句。此步骤需要软件工程师大量的个人经验,很多时候源代码语句是根据实际工作经验猜出来的。最后,将源代码语句拼凑成完整的计算机软件源代码,完成整个反向编译工作。
综上所述,计算机软件反向编译是一个费时、费力的工程,它不仅需要投入大量具有丰富经验的计算机软件专家,而且在大多数情况,反向工程软件目标代码的时间甚至比重新开发新软件的时间更长。同时反向编译的幵发者还要面临竞争对手随时可能改变软件接口、函数等风险。想必稍有经验的软件开发人员宁愿独立开发一个功能类似的程序,也不会试着去反向编译计算机软件的目标代码。现实中的计算机软件反向编译技术,也并不像版权商们宣传的那样,是十恶不赦的毒瘤。软件开发者通过对计算机软件的"0","1"目标代码进行反向编译,还原成的源代码和原软件的源代码只有很少的相似之处。6与其说反向编译是一个拷贝过程,不如说是对"原软件思想"的一次再表述。《版权法》只保护作品的表达,而不保护作品的思想,所以单从《版权法》角度来遣责计算机软件反向工程技术对数字版权保护造成了巨大的侵害是站不住脚的。
本文完整地向读者描述了计算机软件反向编译的全过程,是为了更好地向读者展示反向编译技术的复杂程度,以及反向编译过程的真实面貌。软件公司在软件开发上投入了巨大的人力、物力,但这并不成为阻止计算机软件反向工程获得合法性地位的理由。如前所述,反向工程目标软件的目标代码是一件耗时耗力的工程,并不是像劉窃文字作品那么简单,软件开发者已经通过发行软件目标代码的方式,自然地创造出一定的"技术壁垄",即使在没有法律的保护下,这个"技术壁垒"也足以为软件幵发者带来不小利润和市场占有率。所以笔者认为,不宜对计算机软件采取过度的保护,尤其是针对"非开源软件".保护软件权人的利益时,应当兼顾其他软件开发者的自由开发权和公众利益,适当扩大计算机软件反向工程的适用条件,而不是仅仅将计算机软件反向工程的实施条件局限在一一以"兼容"为目的。虽然各国立法者想以软件"兼容"为突破口,为软件市场提供更多的竞争因子,同时明确计算机软件反向工程的范围。
但由于"兼容" 一词在计算机软件领域的含义过于狭小,导致计算机软件反向工程的范围也变窄,这对于计算机软件反向编译来说是致命的,甚至会导致整个软件市场的萎靡。就如一个羊群突然之间没有了天敌一一狼群,那么羊群也不会得到健康地发展。
1.3从软件市场角度看计算机软件反向工程
计算机软件反向工程一直被软件业视为一种社会竞争激励因子。大众观点认为:"计算机软件反向工程对市场产生的正面激励作用要大于其可能潜在的侵权危害".从市场经济角度看计算机软件反向工程,自然要回归市场,一般来说从市场经济角度评估计算机反向工程活动,应该分为四个阶段:
第一阶段,评估阶段。后进入市场的竞争者评估该市场上已存在商品的潜在价值,反向工程该商品的时间、费用及反向工程的可能性。对于不同商品来说,评估阶段的时间也不相同,可能很长,也可能很短。在评估阶段,在先开发者可以利用这段时间回收成本,并建立自己的客户群体。对于某些消费者来说,其看重的是公司的信誉及高质量的服务,而不完全是该商品本身。在这样的情况下,即使后来的竞争者完全模仿了一个相同的软件产品,该软件对消费者的吸引力也不是很大。这种情况在软件领域尤为突出,比如ADOBE公司的一系列软件(AdobePDF阅读器,Adobe图形系列处理软件,Adobe视频处理软件,Adobe音频处理软件)都受到了消费者的追捧。这种现象在软件业尤为突出,不仅是消费者的依赖心理起到了一定的作用,软件的兼容性也占到了一定的作用。
第二阶段,着手实施反向工程。在这一阶段,竞争者首先需要获得该商品,并组织物力、人力对该商品进行反向工程,这一阶段将十分耗时,耗钱,同时面临反向工程失败的风险7.
不过一个富有经验的软件反向工程师一般会花较少的时间和金钱就会发现商品中的核心技术,但这也和所反向工程商品的领域有关。还有一个降低花费的原因是,随着技术的进步及相关领域技术的公开使用,都会降低反向工程的技术成本。如今随着技术保护措施的发展,软件反向工程的成本节节攀升,随着未来云服务技术的流行,软件反向工程技术可能彻底论为过去。
第三阶段,改进及制造阶段。竞争者会根据原产品的特性、用户群体,来改进该产品,并尽最大可能性改变与原产品的相似之处。在软件业中,改进其功能并不是一件麻烦的事,由于软件是功能性产品,很大程度上通过增加、减少功能都可以改变一个软件的功能特性。很多时候,两个功能类似的软件重新设计一个用户界面就能使两个软件看起来截然不同,如Office文字处理软件和WPS文字处理软件。虽然这两个软件功能也有很大的不同,但两者的功能和用途基本一致,从用户实际使用角度来说,两者区别并不明显,且两者都兼容office2003版本格式。其实,这两个软件也可以用来涂释计算机软件反向工程的作用,因为在开发过程中,这两个企业对对方的软件都有不同程度的借鉴(在借鉴的过程中,难免会用到广义的反向工程技术),并把这些东西应用到自己的软件中去。
第四阶段,将反向工程出来的产品投入到市场。计算机软件投入市场将额外遭受到一个技术瓶颈一一文件存储格式。计算机软件存储的文件格式由开发者制定并执行,且各软件公司都想自己的软件存储格式成为软件业内的标准格式,从而引发软件存储格式兼容性大战。软件业内,巨型软件公司为了巩固自己软件的市场占有率,倾向性地推销自己的软件存储格式,以获得更长的软件市场垄断地位。如ADOBE公司推出的电子阅读器就采用PDF格式,而中国知网则推出电子阅读器就釆用CAJ格式。在这场文件存储格式大战中,我国企业处于劣势地位。
美国国家技术标准机构(National Institute of Standards & Technology)估计从1999年开始,软件格式的兼容性问题将导致美国汽车产业每年损失10亿美元。8法国达梭公司的软件系统格式CATIA3D与CAD软件的存储文件格式兼容性问题,致使美国飞机制造设计产业损失60亿美元,并延迟了 A380空中客机的制造。9所以即使到了可以将新软件投放市场的地步,仍然要面临前所未有的软件文件存储格式兼容性问题。
从市场经济角度来说,反向工程出来的计算机软件不仅要面临开发成本、时间的考验,同样也要接受消费者接受度和依赖度的考验,最重要的是将面临竞争对手恶意改变文件存储格式的巨大考验。竞争对手凭借在市场上的优势地位,只要稍微改变下软件文件存储格式,就很可能对竞争对手带来毁灭性地打击,这种毁灭性打击尤其体现在附属软件la市场。所以主动权永远掌握在原软件权人手中,而不是反向工程者手中。曾经有软件开发工程师调侃道:"我这一生大多数时间不是在写新的软件,而是修改旧的软件,以使其兼容新的应用平台".所以即使通过计算机软件反向工程技术获取信息,开发出与之"兼容"的软件,并不意味着一劳永逸。