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.O语言进行窗体程序的开发。这类程序的窗体布局代码,大多是程序设计人员将设计好的控件“拖”到窗体后由集成开发环境自动生成。除非特别复杂的控件布局,其他程序设计人员可以通过观察程序运行效果对其界面进行模仿,得到相同或相似窗体代码。这类窗体代码除与业务功能源代码混合外,在司法鉴定实践中不宜鉴定为具有非公知性。
基于数据库结构的代码生成器自动生成的数据库操作源代码。目前,AVA和C#语言的代码生成器较多。其中,一些代码生成器根据数据库结构设计自动生成数据库操作相关的源代码。应用比较普遍的代码生成器包括软代码生成器、CodeSmith、MyGeneration’’等。比如,动软代码生根据数据库结构设计生成数据层、业务层C#源代码。对于这类源代码非公知性鉴定,本质上是由生成这些源代码的输入条件——数据库结一决定的。因此,在司法鉴定过程中这类源代码的非公知性,本质上是由数据厍结构的非公知性决定的。
基于UML统一建模语言生成的源代码。在面向对象应用程序开发不断发展的时代,UML不仅支持面向对象的分析和设计,而且可以支持从需求分析到系统实现的软件开发的全过程,它代表了面向对象的软件开发技术的发展方向。因此,学术研究和开发实践中,利用UML自动生成源代码的代码生成工具被设计开发出来,用于软件的设计。这类代码的非公知性同样由产生这些代码的UML决定。
语言转化工具用来对不同编程语言的源代码进行转化,以便增强源代码的重复利用能力。典型的有JAVA 转 C#工具,.Net 平台下各种语言相互转化工具。对于通过转化工具生成的源代码非公知性鉴定,要考虑转化前原始源代码的非公知性。
除此之外,还有一些基于特定的开发工具和开发平台设计的软件系统,其源代码也存在自动生成的情况。无论哪一种情况自动生成的代码,在对其进行非公知鉴定时,都要综合这些代码生成的条件进行判断,而不能仅仅从源代码本身给出鉴定意见。
对于源代码是否为自动生成的代码,需要鉴定人根据经验来判断。一般情况下, 自动生成的源代码在变量、函数、类、文件的命名上遵循相同的规则,源代码的格式安排,空行、空格、注释的使用规范等具铜愚度的一致性。
4.来自开源软件的源代码
开源软件(Open Source Software,oss)以免费使用和公布源代码的主要特征。其开放源代码使全球无数程序员户可以不断复制、修改、再发布开源软件源代码。大量企业为了节省人力成本、时间成本,往往会在其设计开发的软件中或多或少地使用开源软件源代码,甚至一些软件就是在开源软件的基础上进行修改得到的。因此,开源软件源代码是影响源代码非公知性的重要因素之一。在司法鉴定实践中,对于这类源代码应认为不具有非公知性。然而,由于开源社区分散、开源软件数量众多,而鉴定人知识有限,使鉴定中如何判断源代码为来自开源软件的源代码变得十分困难。就笔者的鉴定实践来说,可以从以下方面辅助作出判断。
第一,通过源代码的“协议声明”判断源代码来自于开源软件。一般情况下,开源软件的源代码文件头都会有开源软件遵循的协议声明。如果是简单、机械地引用这些代码,司法鉴定人员是可以通过协议声明辨识其来源和版权情况的,而这种情况在作者参与的司法鉴定案件中是出现频率最高的。
第二,利用商业或非商业开源源代码搜索引擎系统。如果程序开发人在使用开源软件时将相关声明信息删除,或者仅仅使用了开源代码中一个片段,这时司法鉴定人员就很难发现了。。目前,存在一些商业和非商业开源源代码搜索引擎系统。这些搜索引擎系统收录了海量的开源代码,并提取开源代码技术特征。商业类搜索引擎系统的使用价格往往较高,一根据被鉴定代码的代码量多少来收费。非商业类的开源代码搜索引擎系统主要有Krugle、Ohlohe、Docjar、Coogle、CodeSoso,等。商业类与非商业类源代码搜索引擎系统的区别主要在于:商业类系统根据其独特算法自动提取被比对代码的技术特征进行批量比对,非商业类的搜索系统则要由搜索人员自己提取关键代码到系统中进行搜索。同时,也要注意到,由于开源数据库的收录范围有限,鉴定人不能直接给出被鉴定源代码不具有非公知性的意见,,还要结合第三种方式进行综合判断。
第三,鉴定人对被鉴定代码整体进行阅读理解,发现源代码编写风格与整体风格具有差异的部分,并就差异部分的代码,分析其功能,在主要的开源社区和搜索引擎中查找与之具有类似功能的开源项目。
如果被鉴定源代码通过上面第一种方法、第二种方法和第三种方法的检测,在司法鉴定实践中一般认为其为非开源软件源代码。
5.第三方源代码
第三方源代码是指程序设计人员 由于使用了特定的软硬件平台,从平台服务商获得的与平台开发相关的、能够节省开发周期的源代码。这种源代码既可以是免费的,也可以是通过硬件采购,与硬件搭配获得的。例如,应用微软. Net 平台进行软件开发的程序员,经常在自己开发的项目中使用微软企业库的免费源代码。采购了Broadcom 公司硬件设备时,经常用到 由其提供的与设备操作相关的源代码。对于这类源代码本领域内的程序设计人员容易通过开发经验将其识别出来。而且这类源代码基本都有版权声明信息,部分源代码会在服务商提供的硬件使用说明书中有。所体现。与开源软件源代码相似,来源于第三方的源代码也是影响源代码非公知性的因素之一。对于非公知性鉴定来说,二者没有本质区别,只是在软件使用范围、条件、知识产权保护形式上有所区别。因此,在司法鉴定实践中,二君的鉴定思路相同。6.网络搜索或教科书中的源代码
些软件开发人员在网络论坛中以问答的形式对完成某一特定功能的代码实现进行提问和回答,将源代码放到 网络论坛中。这种源代码一般都是比较短小的,大部分通过搜索引擎可以检索得到。另外,与程序设计相关的教科书中的一些源代码实例,特别是算法实现的源代码实例,也会在现实的软件程序中出现。这两种源代码都比较短,而且是解决程序设计中一些通用的技术问题。这两种类型的源代码是大众非常容易获取的,接影响源代码的非公知性。在司法鉴定中,鉴定人在阅读源代码时,根据经验,选择解决共性技术问题的源代码,并在搜索引擎中进行搜索,尽量发现这类源代码。例如,Pudn、Oreilly,均有针对计算机书籍中的源代码搜索功能。7.业界通用的源代码
存在这样一类源代码,它们完成的功能是某一领域内比较通用的功能。比如,管理信息系统中常用的用户登录验证、角色管理和权限管理。这些功能都具有非常的普遍性,很多程序设计人员的设计思路和代码实现基本一致,而且这类代码经常在程序员 之间、企业之间传递,有些已经成为业界通用的源代码,一般不具有非公知性。当然,有些企业从保护知识产权、促进创新角度,设计出不同于大众的源代码,则应划入具有非公知性的范畴。在鉴定实践中,鉴定人要结合具体情况具体分析。8.表达唯一的源代码
这里所说的表达唯一,是指使用某一计算机语言编写、完成特定功能的源代码,其代码编写形式有限。例如,采用C++或C#获取计算机硬件信息的代码。这种代码由于表达形式有限,不同程序设计人员编写出相同源码的概率比较大。因此,它们直接影响了源代码的非公知性。司法鉴定中,在判断源代码唯一性上,需要注意两个问题:一是表达“唯一”,并不是真正的一种表达;二是以函数为划分单元,判断源代码否表达唯一.不应孤立地判断某一行代码是否为表达唯一的源代码。
当然实务中还有更多的鉴定技巧,但上述8个方面却最为基础的给出了判断和鉴定软件代码非公知性的思路。