官术网_书友最值得收藏!

第四章 軟件源代碼鑒定技術

第一節 軟件源代碼非公知性鑒定

由于以主張著作權進行軟件知識產權民事訴訟的時間周期較長,越來越多的軟件企業在知識產權遭到侵犯時,采取以侵犯商業秘密為由的刑事訴訟,以此對侵權人形成心理威懾,達到快速阻止侵權的目的。在此過程中,作為商業秘密關鍵要素的軟件非公知性成為訴訟的先決條件之一。在此背景下,軟件非公知性鑒定案件數量驟然增多。其中,最主要的是針對軟件源代碼的非公知性鑒定。由于軟件技術復雜和鑒定人知識有限,使軟件非公知性鑒定相對于同一性鑒定具有更大的操作難度。本節從軟件源代碼非公知性鑒定的法律依據入手,分析影響源代碼非公知性的最主要的八項因素,進而提出司法鑒定人進行軟件源代碼非公知性鑒定的流程。同時,本節還探討了作為軟件算法或核心技術的源代碼非公知性鑒定思路。

一、軟件源代碼非公知性鑒定的背景與法律依據

非公知性鑒定源于商業秘密訴訟。《中華人民共和國刑法》《中華人民共和國反不正當競爭法》,國家工商行政管理局《關于禁止侵犯商業秘密行為的若干規定(修正)》中均提及商業秘密的概念。商業秘密是指不為公眾所知悉、能為權利人帶來經濟利益、具有實用性并經權利人采取保密措施的技術信息和經營信息。由此可以看出,構成商業秘密的要件有:非公知性、價值性(經濟價值和實用價值)、保密性。在訴訟過程中,價值性和保密性由法官判斷,非公知性的判斷則需要具有專業技術知識的司法鑒定人進行判斷。軟件源代碼的技術特性顯著,非公知性的判斷自然成為司法鑒定的鑒定對象。

對于有關技術信息的非公知性判斷,我國《最高人民法院關于審理不正當競爭民事案件應用法律若干問題的解釋》第九條規定:“有關信息不為其所屬領域的相關人員普遍知悉和容易獲得,應當認定為反不正當競爭法第十條第三款規定的‘不為公眾所知悉’。”

“具有下列情形之一者,可以認定有關信息不構成不為公眾所知悉:(一)該信息為其所屬技術或者經濟領域的人的一般常識或者行業慣例。(二)該信息僅涉及產品的尺寸、結構、材料、部件的簡單組合等內容,進入市場后相關公眾通過觀察產品即可直接獲得。(三)該信息已經在公開出版物或者其他媒體上公開披露。(四)該信息已通過公開的報告會、展覽等方式公開。(五)該信息從其他公開渠道可以獲得;(六)該信息無須付出一定的代價而容易獲得。”

司法鑒定中很難從正面直接判斷一個技術信息具有非公知性,鑒定實踐中多通過對上面列舉情形進行一一排除,最終給出鑒定意見。為此,筆者結合軟件源代碼的具體特征,對上面列出的情形進行進一步細化,分析影響源代碼非公知性的主要因素,提出應對措施,建立鑒定思路。

二、軟件源代碼非公知性鑒定方法

(一)影響源代碼非公知性的技術因素分析

在建立源代碼非公知性鑒定思路之前,本節首先結合軟件源代碼的技術特征分析總結影響源代碼非公知性的技術因素,具體歸納為以下八項主要因素。

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的流程進行判斷。

以源代碼非公知性鑒定為支撐的軟件商業秘密維權案件迅速增加,在看到這種方式對知識產權保護起到積極作用的同時,也應注意到其對促進市場競爭、技術進步、防止知識產權濫用上的弊端。無論是對訴訟的控訴方而言,還是被訴方,源代碼非公知性對于整個訴訟起到了至關重要的作用。一旦訴訟成功,對被訟方的處罰力度較大。因此,軟件源代碼非公知性鑒定,對鑒定人的技術能力、鑒定經驗和職業道德都提出了極高的要求。

主站蜘蛛池模板: 海淀区| 庆元县| 阿鲁科尔沁旗| 上蔡县| 铁岭县| 金阳县| 游戏| 陆川县| 康马县| 普兰店市| 弋阳县| 疏勒县| 忻州市| 娄烦县| 肥东县| 逊克县| 来凤县| 博兴县| 海安县| 肥乡县| 土默特左旗| 祁门县| 衢州市| 英超| 南木林县| 乌苏市| 益阳市| 万全县| 山东| 读书| 平昌县| 兴安县| 瑞金市| 喀什市| 梁山县| 屯留县| 清新县| 克山县| 永仁县| 麻城市| 阿尔山市|