第四章 软件源代码鉴定技术
第一节 软件源代码非公知性鉴定
由于以主张著作权进行软件知识产权民事诉讼的时间周期较长,越来越多的软件企业在知识产权遭到侵犯时,采取以侵犯商业秘密为由的刑事诉讼,以此对侵权人形成心理威慑,达到快速阻止侵权的目的。在此过程中,作为商业秘密关键要素的软件非公知性成为诉讼的先决条件之一。在此背景下,软件非公知性鉴定案件数量骤然增多。其中,最主要的是针对软件源代码的非公知性鉴定。由于软件技术复杂和鉴定人知识有限,使软件非公知性鉴定相对于同一性鉴定具有更大的操作难度。本节从软件源代码非公知性鉴定的法律依据入手,分析影响源代码非公知性的最主要的八项因素,进而提出司法鉴定人进行软件源代码非公知性鉴定的流程。同时,本节还探讨了作为软件算法或核心技术的源代码非公知性鉴定思路。
一、软件源代码非公知性鉴定的背景与法律依据
非公知性鉴定源于商业秘密诉讼。《中华人民共和国刑法》《中华人民共和国反不正当竞争法》,国家工商行政管理局《关于禁止侵犯商业秘密行为的若干规定(修正)》中均提及商业秘密的概念。商业秘密是指不为公众所知悉、能为权利人带来经济利益、具有实用性并经权利人采取保密措施的技术信息和经营信息。由此可以看出,构成商业秘密的要件有:非公知性、价值性(经济价值和实用价值)、保密性。在诉讼过程中,价值性和保密性由法官判断,非公知性的判断则需要具有专业技术知识的司法鉴定人进行判断。软件源代码的技术特性显著,非公知性的判断自然成为司法鉴定的鉴定对象。
对于有关技术信息的非公知性判断,我国《最高人民法院关于审理不正当竞争民事案件应用法律若干问题的解释》第九条规定:“有关信息不为其所属领域的相关人员普遍知悉和容易获得,应当认定为反不正当竞争法第十条第三款规定的‘不为公众所知悉’。”
“具有下列情形之一者,可以认定有关信息不构成不为公众所知悉:(一)该信息为其所属技术或者经济领域的人的一般常识或者行业惯例。(二)该信息仅涉及产品的尺寸、结构、材料、部件的简单组合等内容,进入市场后相关公众通过观察产品即可直接获得。(三)该信息已经在公开出版物或者其他媒体上公开披露。(四)该信息已通过公开的报告会、展览等方式公开。(五)该信息从其他公开渠道可以获得;(六)该信息无须付出一定的代价而容易获得。”
司法鉴定中很难从正面直接判断一个技术信息具有非公知性,鉴定实践中多通过对上面列举情形进行一一排除,最终给出鉴定意见。为此,笔者结合软件源代码的具体特征,对上面列出的情形进行进一步细化,分析影响源代码非公知性的主要因素,提出应对措施,建立鉴定思路。
二、软件源代码非公知性鉴定方法
(一)影响源代码非公知性的技术因素分析
在建立源代码非公知性鉴定思路之前,本节首先结合软件源代码的技术特征分析总结影响源代码非公知性的技术因素,具体归纳为以下八项主要因素。
1.通过反编译可以获得的源代码
一些高级计算机语言编写的软件程序,在没有对目标程序进行加密或混淆技术处理的情况下,很容易通过目标程序反编译得到其对应的源代码,而且反编译得到的源代码与生成目标程序的原始源代码相似程度较高、可读性较强,是影响源代码非公知性的一个重要因素。目前,在常见的软件源代码非公性鉴定中,由C、C++、VB等语言编写的软件程序不容易被反编译;由JAVA、.NET平台下的编程语言(如C#、VB.NET、C++. NET、F #. NET)编写的软件程序容易被反编译;由Delphi设计的软件程序中窗体代码容易被反编译,而逻辑执行部分代码不容易被反编译。
在对源代码进行非公知性鉴定时,如果能够通过反编译得到源代码,一般认为其具有公知性。但有两种情况除外,一是软件销售时对目标程序采用了加密或混淆的技术方式阻止反编译的实施;二是无法获得目标代码,即无法获得反编译的对象。例如,在软件销售时与客户签订保密协议限制客户向非授权用户进行软件目标程序的复制,从而使其他非授权用户很难获得目标程序,也就难以获得反编译的对象。又如,由于目标代码存在的方式比较复杂,无法通过简单的方法从销售的产品中获取目标代码,所以也就难以获得反编译的对象。
2.B/S架构下浏览器可获得的源代码
随着互联网技术的发展,B/S(Browser/Server,浏览器/服务器)架构的软件程序已经成为主要的软件应用模式。在这种架构下,用户工作界面通过浏览器来实现,主要业务逻辑都在服务器端实现,极少部分业务逻辑在浏览器端实现。对于源代码来说,一部分在服务器端经过编译以后成为目标码,在服务器端运行;一部分没有经过编译的脚本,由客户端浏览器运行。比如,用C#或JAVA设计的B/S系统,服务器端运行C#或JAVA目标程序,而用于进行页面显示控制或简单业务逻辑实现的JAVASCRIPT脚本、CSS样式单、HTML页面、图片等都是由客户端的浏览器来运行或显示的。对于客户端来说,这些脚本、样式单、网页和图片是可获得的。如果基于B/S架构的程序面向公众用户,那么运行于浏览器端的各种源代码具有公知性。
在司法鉴定中,根据程序开发和运行环境判断程序是否为B/S架构,再结合程序面向的用户,判断源代码是否具有非公知性。
3.自动生成的源代码
计算机自动生成的源代码,是指非程序编写人员直接编写的源代码,而是采用一些辅助的软件工具得到的源代码。其非公知性不能简单地通过代码本身去判断,需要结合代码自动生成的条件综合考虑。典型的自动生成的源代码包括集成开发环境(Integrated Development Environment, IDE)自动生成的窗体代码,基于数据库结构的代码生成器自动生成的数据库操作源代码,基于UML统一建模语言生成的源代码,以及通过语言转化工具转化的其他编程语言源代码。
IDE自动生成的窗体源代码,如采用.NET平台下的编程语言、Delphi语言、VB6.0语言进行窗体程序的开发。这类程序的窗体布局代码,大多是程序设计人员将设计好的控件“拖”到窗体后由集成开发环境自动生成。除非特别复杂的控件布局,其他程序设计人员可以通过观察程序运行效果对其界面进行模仿,得到相同或相似窗体代码。这类窗体代码除与业务功能源代码混合外,在司法鉴定实践中不宜鉴定为具有非公知性。
基于数据库结构的代码生成器自动生成的数据库操作源代码。目前,JAVA和C#语言的代码生成器较多。其中,一些代码生成器根据数据库结构设计自动生成数据库操作相关的源代码。应用比较普遍的代码生成器包括动软代码生成器[10]、CodeSmith[11]、MyGeneration[12]等。比如,动软代码生成器根据数据库结构设计生成数据层、业务层C#源代码。对于这类源代码的非公知性鉴定,本质上是由生成这些源代码的输入条件——数据库结构——决定的。因此,在司法鉴定过程中这类源代码的非公知性,本质上是由数据库结构的非公知性决定的。
基于UML统一建模语言生成的源代码。在面向对象应用程序开发不断发展的时代,UML不仅支持面向对象的分析和设计,而且可以支持从需求分析到系统实现的软件开发的全过程,它代表了面向对象的软件开发技术的发展方向。因此,学术研究和开发实践中,利用UML自动生成源代码的代码生成工具被设计开发出来,用于软件的设计。这类代码的非公知性同样由产生这些代码的UML决定。
语言转化工具用来对不同编程语言的源代码进行转化,以便增强源代码的重复利用能力。典型的有JAVA转C#工具,.Net平台下各种语言相互转化工具。对于通过转化工具生成的源代码非公知性鉴定,要考虑转化前原始源代码的非公知性。
除此之外,还有一些基于特定的开发工具和开发平台设计的软件系统,其源代码也存在自动生成的情况。无论哪一种情况自动生成的代码,在对其进行非公知鉴定时,都要综合这些代码生成的条件进行判断,而不能仅仅从源代码本身给出鉴定意见。
对于源代码是否为自动生成的代码,需要鉴定人根据经验来判断。一般情况下,自动生成的源代码在变量、函数、类、文件的命名上遵循相同的规则,源代码的格式安排,空行、空格、注释的使用规范等具有高度的一致性。
4.来自开源软件的源代码
开源软件(Open Source Software, OSS),即公开源代码的软件,具备可以免费使用和公布源代码的主要特征[13]。其开放源代码使全球无数程序员和用户可以不断复制、修改、再发布开源软件源代码。大量企业为了节省人力成本、时间成本,往往会在其设计开发的软件中或多或少地使用开源软件源代码,甚至一些软件就是在开源软件的基础上进行修改得到的。因此,开源软件源代码是影响源代码非公知性的重要因素之一。
在司法鉴定实践中,对于这类源代码应认为不具有非公知性。然而,由于开源社区分散、开源软件数量众多,而鉴定人知识有限,使鉴定中如何判断源代码为来自开源软件的源代码变得十分困难。就笔者的鉴定实践来说,可以从以下方面辅助作出判断。
第一,通过源代码的“协议声明”判断源代码来自于开源软件。一般情况下,开源软件的源代码文件头都会有开源软件遵循的协议声明。如果是简单、机械地引用这些代码,司法鉴定人员是可以通过协议声明辨识其来源和版权情况的,而这种情况在作者参与的司法鉴定案件中是出现频率最高的。
第二,利用商业或非商业开源源代码搜索引擎系统。如果程序开发人员在使用开源软件时将相关声明信息删除,或者仅仅使用了开源代码中一个片段,这时司法鉴定人员就很难发现了。目前,存在一些商业和非商业的开源源代码搜索引擎系统。这些搜索引擎系统收录了海量的开源代码,并提取开源代码技术特征。商业类搜索引擎系统的使用价格往往较高,一般根据被鉴定代码的代码量多少来收费,如Black Duck Software[14]。非商业类的开源代码搜索引擎系统主要有Krugle[15]、Ohlohe[16]、Docjar[17]、Google Codes[18]、CodeSoso[19]等。商业类与非商业类源代码搜索引擎系统的区别主要在于:商业类系统根据其独特算法自动提取被比对代码的技术特征进行批量比对,非商业类的搜索系统则要由搜索人员自己提取关键代码到系统中进行搜索。同时,也要注意到,由于开源数据库的收录范围有限,鉴定人不能直接给出被鉴定源代码不具有非公知性的意见,还要结合第三种方式进行综合判断。
第三,鉴定人对被鉴定代码整体进行阅读理解,发现源代码编写风格与整体风格具有差异的部分,并就差异部分的代码,分析其功能,在主要的开源社区和搜索引擎中查找与之具有类似功能的开源项目。
如果被鉴定源代码通过上面第一种方法、第二种方法和第三种方法的检测,在司法鉴定实践中一般认为其为非开源软件源代码。
5.第三方源代码
第三方源代码是指程序设计人员由于使用了特定的软硬件平台,从平台服务商获得的与平台开发相关的、能够节省开发周期的源代码。这种源代码既可以是免费的,也可以是通过硬件采购,与硬件搭配获得的。例如,应用微软.Net平台进行软件开发的程序员,经常在自己开发的项目中使用微软企业库的免费源代码。采购了Broadcom公司硬件设备时,经常用到由其提供的与设备操作相关的源代码。对于这类源代码本领域内的程序设计人员容易通过开发经验将其识别出来。而且这类源代码基本都有版权声明信息,部分源代码会在服务商提供的硬件使用说明书中有所体现。与开源软件源代码相似,来源于第三方的源代码也是影响源代码非公知性的因素之一。对于非公知性鉴定来说,二者没有本质区别,只是在软件使用范围、条件、知识产权保护形式上有所区别。因此,在司法鉴定实践中,二者的鉴定思路相同。
6.网络搜索或教科书中的源代码
一些软件开发人员在网络论坛中以问答的形式对完成某一特定功能的源代码实现进行提问和回答,将源代码放到网络论坛中。这种源代码一般都是比较短小的,大部分通过搜索引擎可以检索得到。另外,与程序设计相关的教科书中的一些源代码实例,特别是算法实现的源代码实例,也会在现实的软件程序中出现。这两种源代码都比较短,而且是解决程序设计当中一些通用的技术问题。这两种类型的源代码是大众非常容易获取的,直接影响源代码的非公知性。在司法鉴定中,鉴定人在阅读源代码时,根据经验,选择解决共性技术问题的源代码,并在搜索引擎中进行搜索,尽量发现这类源代码。例如,Pudn[20]、Oreilly[21]均有针对计算机书籍中的源代码搜索功能。
7.业界通用的源代码
存在这样一类源代码,它们完成的功能是某一领域内比较通用的功能。比如,管理信息系统中常用的用户登录验证、角色管理和权限管理。这些功能都具有非常的普遍性,很多程序设计人员的设计思路和代码实现基本一致,而且这类代码经常在程序员之间、企业之间传递,有些已经成为业界通用的源代码,一般不具有非公知性。当然,有些企业从保护知识产权、促进创新角度,设计出不同于大众的源代码,则应划入具有非公知性的范畴。在鉴定实践中,鉴定人要结合具体情况具体分析。
8.表达唯一的源代码
这里所说的表达唯一,是指使用某一计算机语言编写、完成特定功能的源代码,其代码编写形式有限。例如,采用C++或C#获取计算机硬件信息的代码。这种代码由于表达形式有限,不同程序设计人员编写出相同源代码的概率比较大。因此,它们直接影响了源代码的非公知性。
司法鉴定中,在判断源代码唯一性上,需要注意两个问题:一是表达“唯一”,并不是真正的一种表达;二是以函数为划分单元,判断源代码是否表达唯一,不应孤立地判断某一行代码是否为表达唯一的源代码。
(二)源代码非公知性鉴定的适用流程
上述影响源代码非公知性因素的第1、2、3点可归结为“该信息无须付出一定的代价而容易获得”,第4、5、6点可归结为“该信息从其他公开渠道可以获得”,第7、8点可归结为“该信息为其所属技术或者经济领域的人的一般常识或者行业惯例”。在鉴定过程中,通过对这些因素的综合分析,判断源代码的非公知性。同时,可以通过建立规范化的鉴定流程,来降低鉴定人的工作强度,加快鉴定的实施。基于以上八项主要因素的分析,本节设计从简单到复杂的软件源代码非公知性鉴定流程,如图4-1所示。
图4-1 软件源代码非公知性鉴定流程
首先,判断源代码是否容易获得。
在不阅读源代码功能含义条件下,理解源代码所应用的技术特征,源代码编译后的目标码运行环境特征,依次逐步深入判断源代码是否为B/S架构软件浏览器(客户端)可获得的源代码、反编译可获得的源代码、自动生成的源代码。如果三种情况均不满足,转而判断源代码是否为常识和行业惯例。
如果源代码满足(一)中“为B/S架构软件浏览器(客户端)可获得的源代码”或“为自动生成的源代码”或“为反编译可获得的源代码,并且容易获得目标代码”,继续看源代码的使用情况,即源代码编译的目标码构成的软件系统在销售给客户时,是否有限制客户向非授权用户进行泄露软件相关信息的保密协议。若没有保密协议,说明源代码容易获取,具有公知性。若存在保密协议,转而判断源代码是否为常识和行业惯例。如果满足“为反编译可获得的源代码,但目标代码不易获取”,直接判断源代码是否为常识和行业惯例。
其次,判断源代码是否为常识和行业惯例。在不进行检索的条件下,阅读代码功能含义,根据鉴定人的知识和经验,依次判断源代码是否表达唯一、是否业界通用。满足两个条件中的任一条件,源代码即具有公知性;否则,转而判断源代码是否公开。
最后,判断源代码是否公开。鉴定人的知识是有限的,在判断源代码是否公开的问题上,鉴定人以了解技术进展、丰富知识为目的,进行基本的信息检索,是十分必要的。因此,鉴定人在理解源代码含义的条件下,应充分利用搜索引擎、开源社区等网络资源,结合自己的知识和经验积累判断源代码是否公开。如果源代码经过这一步的层层验证,那么在司法鉴定实践中一般认为源代码具有非公知性。
三、作为特征算法或核心(专有)技术的源代码非公知性鉴定
以上影响源代码非公知性的因素分析和鉴定流程,适用于大部分的源代码非公知性鉴定。但在司法鉴定实践中,往往会出现这样的情况:作为软件某个特征算法或核心(专有)技术的部分源代码具有公知性,另一部分则不具有公知性;而源于委托方的鉴定事项则是针对算法或核心技术涉及的整体源代码。针对这种情况,在鉴定实践中应从两个视角考虑,一是局部视角,二是全局视角。局部视角不考虑代码之间的调用关系、组织结构,依据图4-1的鉴定流程,针对各个部分的源代码分别给出非公知性的鉴定意见。全局视角考虑代码之间的逻辑调用关系,将这种逻辑调用关系作为源代码非公知性判断依据之一,从整体上给出鉴定意见。这是因为对于技术秘密纠纷案件中普遍存在的“某一全部由公知信息组成的技术信息是否具有非公知性”这一问题的判断,取决于形成该技术信息的过程中,各公知要素的选取和组合是否蕴含创造性劳动。也就是说,该技术信息并不是由随意选取的公知信息进行简单罗列、堆砌而形成,而是需要以专业知识为基础,有目的、有依据地从海量公知信息中选取特定信息,并进行取舍、整合、反复校验,并最终形成可行的技术路线或方案。
在具体鉴定操作方法上,在考虑源代码之间的逻辑调用关系、组织结构时,首先通过对源代码的阅读,梳理出源代码逻辑关系“鱼骨图”,如图4-2所示。任何算法或关键技术的源代码都可以归结为代码文件、类和函数的表现形式。算法和关键技术的实现按照一条主线进行;同时,不断地调用各个代码文件、类和函数、构成支线。如果算法或核心技术主线上的源代码具有非公知性,那么整体上可以给出代码非公知性的意见。
图4-2 源代码调用关系“鱼骨图”
四、JAVA编程语言源代码非公知鉴定
JAVA是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由Sun Microsystems公司于1995年5月推出的。JAVA程序在JAVA平台上被编译为字节码格式,然后可以在实现这个JAVA平台的任何系统中运行。在运行时,JAVA平台中的JAVA解释器(JVM又称JAVA虚拟机)对这些字节码进行解释执行。在执行过程中需要的类在连接阶段被载入运行环境中。整个的编译运行过程如图4-3所示。
图4-3 JAVA语言的编译运行机制图
JAVA语言编写的软件目标代码以.Class格式存在,多个.Class文件可打包成.Jar文件或者.Zip文件。由于JAVA语言是解释性语言,可以通过反编译工具将.Class文件反编译成.JAVA文件,并且这个反编译过程可以通过软件工具快速地、自动地完成,反编译得到的源代码和原始源代码差异较小,可读性非常高,有时甚至可以得到与原始源代码完全一致的反编译代码。因此,在司法鉴定实践中,对于JAVA语言源代码的非公知性判断,主要集中在目标代码是否简单容易获得。如果普通用户可以通过简单的方式获取JAVA目标代码,而且这个目标代码没有进行任何的加密或混淆技术处理,那么JAVA源代码就不具有非公知性。关于有JAVA语言反编译工具的使用方法,参见第三部分JAVA反编译工具一节。
五、.NET平台编程语言源代码非公知鉴定
.NET Framework(.NET框架)是微软2002年2月推出的跨平台开发框架,也称.NET平台。.NET平台下的编程语言有C#. NET、VB. NET、C++. NET、J#. NET、F#. NET等。. NET平台下编程语言的编译、执行与JAVA有些类似,具体编译执行过程参见“. Net平台软件跨语言鉴定”一节。同样,. NET平台编程语言编译的目标代码容易反编译,反编译得到的源代码和原始源代码差异较小,可读性非常高,有时甚至可以得到与原始源代码完全一致的反编译代码。因此,对于.NET平台编程语言源代码非公知性判断,同样集中在目标代码是否简单容易获得。如果普通用户可以通过简单的方式获取目标代码,而且这个目标代码没有进行任何的加密或混淆技术处理,. NET平台语言源代码就不具有非公知性。关于有.NET平台语言反编译工具的使用方法参见“第三部分.NET反编译工具”一节。
六、C/C++编程语言源代码非公知鉴定
C/C++编程语言是应用最为广泛、发展历史最为久远的编程语言之一。与JAVA、.NET平台编程语言不同,C/C++直接编译为机器码,目标代码不容易被反编译。即便是反编译,也只能进行汇编语言的反编译,即将C/C++目标代码反编译为汇编代码。汇编代码与原始的C/C++源代码差异巨大,可读性较差。因此,对于C/C++语言的源代码非公知性判断,宜采用本节的源代码非公知性判断流程。
七、基于KV STUDIO平台的PLC语言源代码非公知鉴定
KV STUDIO是日本KEYENCE公司的可编程序逻辑控制器(Programmable Logic Controller, PLC)的软件开发平台,使用KV脚本语言编写,它能自动转换为梯形图语言(一种PLC编程语言)执行。基于该平台编写并烧录到硬件设备中的源代码或目标代码的非公知性决定因素是,这些源代码或目标代码是否简单容易地获取。因为PLC目标代码容易实现反编译,易于破坏PLC代码的非公知性。但是,KV STUDIO平台具有写保护的功能,在烧录过程中,可以控制目标代码不能简单容易地进行拷贝。因此,进行KV STUDIO平台的PLC语言源代码非公知性鉴定,首先判断目标代码是否进行了写保护,之后再依据图4-1的流程进行判断。
以源代码非公知性鉴定为支撑的软件商业秘密维权案件迅速增加,在看到这种方式对知识产权保护起到积极作用的同时,也应注意到其对促进市场竞争、技术进步、防止知识产权滥用上的弊端。无论是对诉讼的控诉方而言,还是被诉方,源代码非公知性对于整个诉讼起到了至关重要的作用。一旦诉讼成功,对被讼方的处罚力度较大。因此,软件源代码非公知性鉴定,对鉴定人的技术能力、鉴定经验和职业道德都提出了极高的要求。