一、引言
麒麟操作系統是由國防科技大學、中軟公司、聯想公司、浪潮公司和民族恆星公司五家單位合作研制的服務器操作系統。按照麒麟官方的說法:
“Kylin服務器操作系統是國家863計劃的重大研究成果,擁有完全自主版權的內核,與Linux在應用上二進制兼容,並支持64位,是中國獨立研發成功的、具有完全自主知識產權的服務器操作系統。”
--- 來自麒麟官方網站 http://www.kylin.org.cn/news.htm和
?863計劃官方網站
http://www.863.org.cn/863_105/indust/indust_news/200409160008.html
“銀河麒麟操作系統是針對未來的主流網絡服務和高性能計算服務的需求,參照國際主流標准,參考Darwin、FreeBSD、Linux和其它商用操作系統,借鑒UNIX操作系統和微內核操作系統的設計思想,設計並實現具有自主版權的、可支持多種CPU芯片和多種計算機體系結構的、具有高性能、高可用性與高安全性的、並與Linux應用和設備驅動二進制兼容的中文服務器操作系統,”
摘自麒麟操作系統2.0.21內自帶的幫助文檔
近日,有不少人對麒麟操作系統宣稱的“完全自主版權”和“中國獨立研發成功”這兩個核心問題產生了質疑。隨著麒麟2.0.14和2.0.21系統可以通過麒麟的官方網站下載後( http://www.kylin.org.cn/download.htm ),這種質疑的聲音越來越大。麒麟除內核以外的應用大部分都來自自由組織GNU的代碼,這些代碼並不屬於“中國獨立研發”,而且他們的版權也不屬於麒麟操作系統的開發者。更有甚者,有人開始通過反匯編麒麟操作系統內核發現和美國的FreeBSD開放源代碼操作系統非常相似。隨後又有人成功的用FreeBSD的內核啟動了麒麟操作系統。按照麒麟官方的介紹,麒麟具有Linux的二進制兼容的能力,可是絲毫沒有提及與FreeBSD的兼容性,使得麒麟內核與FreeBSD的關系變得比較引人注目。在官方介紹中的簡簡單單的“參考”是無法解釋這種相似程度的。
在強烈的關注聲中,麒麟開發人員在2006年2月16日,給出了一個說明,《關於銀河麒麟操作系統的說明》[3],發布在 http://www.kylin.org.cn/download.htm 。其中提到了和FreeBSD的關系:
“課題組通過評測和分析,認為當時正在研發中的FreeBSD 5.0 具有比Unix SVR4.2 更好的發展勢頭,特別是SMPng 項目的開展,為FreeBSD 5.0 支持SMP 對稱多處理器系統奠定了良好的基礎,因此銀河麒麟操作系統的系統服務層從SVR4.2 升級到當時正在研發中的FreeBSD 5.0。”
聲明發出後一定程度上得到了大家諒解,可是雖然提及和FreeBSD的關系,卻又十分隱晦,既沒有明確的對官方網站新聞中的報道失實承認錯誤,沒有明確闡述麒麟的操作系統是否具有“完全知識產權”以及是否是“中國獨立研發”,甚至也沒有對官方頁面上的事實報道進行修正。而且,既然說明使用了FreeBSD 5.0的代碼,卻又說僅限於系統服務層,而絲毫未提及所占比例。這依舊讓人們對這個獲得863計劃軟件重大專項的資助的操作系統到底有多少創新產生一個大大的疑問。
為了調查清楚麒麟操作系統內核自主創新的百分比,以及與其它操作系統之間的關系,我將麒麟操作系統內核與FreeBSD、NetBSD、OpenBSD、Linux和Solaris的內核進行了可執行代碼的相似度分析。
在整個過程中,我將盡量保持客觀的原則進行分析。由於麒麟操作系統屬於封閉源代碼系統,因此在無法獲得內核源代碼的情況下,我將只進行二進制可執行代碼文 件的相似度分析。由於可執行代碼受編譯環境、內存分布情況以及模塊的變動的影響很大,因此,會產生即使采用同一套代碼,卻產生很低的相似度情況。但是,對 操作系統內核這種大型軟件系統來說,卻不會因為不同的代碼而產生很高的相似度的情況。因此,我們將這次對二進制可執行代碼分析所得的相似度作為相似度的下 限。換句話說,真實的相似度應該會高於此次分析結果,但是由於分析方法的局限性,無法取得上限。
二、可執行文件的相似度比較
二進制可執行文件的相似度分析一直是一個難題。大家都知道,即使是同一份源代碼,使用同一個編譯器,可用不同的編譯參數進行編譯後,代碼也會產生極大的差異。
當 發生有人因為盜用別人的源代碼而產生的侵權後,如果不能夠將二者的源代碼拿出進行比較的話,判斷是否抄襲非常困難。因此,一直以來或多或少,總會有人無所 顧忌的將開放源代碼的軟件拿來加入到自己的軟件中,或者干脆就是在那些源代碼的基礎上稍加修改和更換了版權信息就宣稱是自己研發的。因為他們知道,只要不 把自己的源代碼公諸於眾,那麼抄襲就很難判定。
下面我就詳細說一下我采用的分析方法。
2.1 ELF可執行文件相似度分析方法
這次分析起始,我就碰到了一些難題。如果對二進制可執行文件進行基於字節的相似性分析,即使匹配上某些字節,也很難說明兩段代碼的相似性,另外匹配也很容易受到各種噪音的干擾而產生很低的相似度,可是噪音卻無法被去除。
因此,使最小比較單元具有明確的語義和合理的過濾噪音是我首先要解決的問題。
2.1.1 反匯編
二進制文件的比較難以確定最小單元語義的根本問題在於二進制文件是以字節為單位,然而每個字節卻沒有特定的含義。你很難說89 e5和83 EC 89中的89相同說明什麼,在這個例子中,前者的89 e5是i386的一條指令,而後者的89則是一個立即數,所以他們相同實際上什麼都不說明。
針對這次分析,由於都是可執行代碼,而且都采用了ELF的文件格式。由於這個特點,我首先將所有操作系統的內核通過objdump反 匯編成匯編代碼。這樣做有一個直接的好處,就是每一行都是一條匯編語句,而每一條匯編語句又是一個程序不可分的最小邏輯單元。這樣,接下來的分析就可以基 於行來進行相似性的分析,因為每出現一行相同就說明有一個最小的邏輯單元相同,如果出現連續的行相似,那麼就說明有連續的代碼段相似。相同的行越多兩個內 核就越相似。
並且經過反匯編後,就避免了因文件內包含的其他無關信息,如字符串、資源文件、數據文件等,對分析結果產生的影響。
這個方法依舊無法避免因編譯參數差異所造成的相似度下降的影響。雖然如此,但是我很幸運,從這次分析的結果看,依舊得到了不低的相似度。
2.1.2 過濾噪音
噪音的出現有很多原因,可能是內存分布不同、代碼的增刪導致的偏移地址的變化,對相同含義的常量而數值卻不同等等。這些值的差異,可能會造成不同的執行結果,但是卻對兩段代碼的相似性比較影響不大。
詳細代碼比較請看:http://www.dancefire.org/article/Kernel_Similarity_Analysis.html
來自:www.dancefire.org