基于文件的Linux基礎(chǔ)軟件依賴關(guān)系分析方法
【專利摘要】本發(fā)明提供了Linux基礎(chǔ)軟件依賴關(guān)系分析方法,可以包括:掃描一個Linux系統(tǒng),得到所有二進制可執(zhí)行文件和庫文件的列表;獲得該列表中的文件之間的依賴關(guān)系;消除二進制文件的循環(huán)依賴關(guān)系,構(gòu)建集合{X},其中集合{X}由彼此之間不存在循環(huán)依賴關(guān)系的元素組成,元素X為由處于一個循環(huán)依賴鏈上的所有文件構(gòu)成的集合或者由不存在于任何一個循環(huán)依賴鏈中的單個文件構(gòu)成的集合;對集合{X}中的每個元素,依據(jù)文件之間的依賴關(guān)系,建立元素之間的依賴關(guān)系。本發(fā)明實施例的Linux基礎(chǔ)軟件依賴關(guān)系分析方法,可以在無需軟件包描述信息的情況下,直接獲得Linux系統(tǒng)中內(nèi)核之上的所有軟件的二進制可執(zhí)行文件和庫文件之間的依賴關(guān)系。
【專利說明】基于文件的Linux基礎(chǔ)軟件依賴關(guān)系分析方法
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明總體地涉及Linux系統(tǒng),更具體地涉及Linux基礎(chǔ)軟件依賴關(guān)系分析方法。
【背景技術(shù)】
[0002] -個典型的Linux系統(tǒng)中包含數(shù)以千計的軟件包,數(shù)以萬計的可執(zhí)行文件,如果 每個軟件的功能實現(xiàn)都從Linux最底層的系統(tǒng)調(diào)用開始構(gòu)建,軟件的設(shè)計會異常復(fù)雜、工 作量很大,因此實際的Linux軟件系統(tǒng)中都包含各種面向不同目標(biāo)的軟件庫。Linux系統(tǒng) 中這些軟件包的二進制可執(zhí)行文件與庫文件之間存在互相依賴關(guān)系,不同的軟件由不同的 開發(fā)者或開發(fā)團隊進行開發(fā),為了使得軟件開發(fā)更加高效,軟件的開發(fā)者會根據(jù)自己的知 識和軟件開發(fā)效率的考慮,使得一些軟件的功能可以通過調(diào)用其他軟件庫的API調(diào)用來實 現(xiàn),從而讓整個Linux系統(tǒng)的軟件呈現(xiàn)出一種復(fù)雜的積木式結(jié)構(gòu),即每個軟件功能都不是 很大,但通過復(fù)雜的組合形成一個較為復(fù)雜、較為完備的應(yīng)用系統(tǒng)。
[0003] 傳統(tǒng)的Linux系統(tǒng)采用包管理的方式來組織管理Linux系統(tǒng)中復(fù)雜的軟件結(jié)構(gòu), 每個軟件包中都包含一個描述文件來表述該軟件包依賴哪些其他軟件包,比如RPM包管理 系統(tǒng)等,這樣的設(shè)計使得Linux系統(tǒng)的使用和管理較為方便。不過包管理系統(tǒng)中的軟件包 依賴關(guān)系描述文件是由富有經(jīng)驗的Linux系統(tǒng)開發(fā)人員手工指定的,不能自動化的生成軟 件的依賴關(guān)系圖,也不能用于Linux系統(tǒng)開發(fā)的結(jié)構(gòu)分析和Linux系統(tǒng)的安全性分析。。
【發(fā)明內(nèi)容】
[0004] 鑒于現(xiàn)有技術(shù)的以上情況,提出了本發(fā)明。
[0005] 根據(jù)本發(fā)明的一個方面,提出了一種用于分析Linux基礎(chǔ)軟件之間的依賴關(guān)系的 Linux基礎(chǔ)軟件依賴關(guān)系分析方法,可以包括:
[0006] 步驟1 :掃描一個Linux系統(tǒng),得到所有二進制可執(zhí)行文件和庫文件的列表;
[0007] 步驟2 :獲得該列表中的文件之間的依賴關(guān)系;
[0008] 步驟3 :消除二進制文件的循環(huán)依賴關(guān)系,構(gòu)建集合{X},其中集合{X}由彼此之間 不存在循環(huán)依賴關(guān)系的元素組成,元素 X為由處于一個循環(huán)依賴鏈上的所有文件構(gòu)成的集 合或者由不存在于任何一個循環(huán)依賴鏈中的單個文件構(gòu)成的集合;
[0009] 步驟4:對集合{X}中的每個元素,依據(jù)步驟2獲得的文件之間的依賴關(guān)系,建立 元素之間的依賴關(guān)系,如果一個元素中存在多個文件與另一個元素中的多個文件存在依賴 關(guān)系,兩個元素之間只記為一個依賴關(guān)系,集合{X}中各元素的依賴關(guān)系是一個內(nèi)部不存 在循環(huán)依賴的樹狀依賴關(guān)系圖。
[0010] 利用本發(fā)明實施例的Linux基礎(chǔ)軟件依賴關(guān)系分析方法,可以在無需軟件包描述 信息的情況下,直接獲得Linux系統(tǒng)中內(nèi)核之上的所有軟件的二進制可執(zhí)行文件和庫文件 之間的依賴關(guān)系。
[0011] 根據(jù)本發(fā)明的另一方面,提供了一種用于分析Linux基礎(chǔ)軟件之間的依賴關(guān)系的 Linux基礎(chǔ)軟件依賴關(guān)系分析方法,可以包括:
[0012] 步驟1 :掃描一個Linux系統(tǒng)中,得到所有二進制可執(zhí)行文件和庫文件的列表;
[0013] 步驟2 :逐個分析每個二進制可執(zhí)行文件和庫文件的函數(shù)調(diào)用關(guān)系,獲得該文件 所依賴的其他二進制可執(zhí)行文件和庫文件的集合;
[0014] 步驟3 :對上述集合中的每個被依賴的二進制文件,建立一個從被分析的二進制 文件到集合中被依賴的該二進制文件的有向依賴連接;
[0015] 步驟4 :檢查Linux系統(tǒng)中的所有二進制文件是否都被分析過,如果還有沒有被分 析的二進制文件,回到步驟2 ;否則進入步驟5 ;
[0016] 步驟5 :查找系統(tǒng)二進制文件的循環(huán)依賴關(guān)系,對于找到的每個循環(huán)依賴關(guān)系,處 于循環(huán)依賴鏈上的所有文件構(gòu)成一個集合,記為集合Xi,i = 〇... M-1,M表示整個系統(tǒng)中沒 有重疊的循環(huán)依賴鏈個數(shù);其他不存在于任何一個循環(huán)依賴鏈中的文件被記為只有一個元 素的集合Xj,j = M.. .M+N-l,N表示系統(tǒng)中不在任何一個循環(huán)依賴鏈中的文件個數(shù);由所 有的Xi和Xj構(gòu)成一個新的集合{X},該集合的大小為N+M ;
[0017] 步驟6 :對集合{X}中的每個元素,依據(jù)步驟2到步驟4獲得的文件之間的依賴關(guān) 系,建立元素之間的依賴關(guān)系,如果一個元素中存在多個文件與另一個元素中的多個文件 存在依賴關(guān)系,兩個元素之間只記為一個依賴關(guān)系,集合{X}中各元素的依賴關(guān)系是一個 內(nèi)部不存在循環(huán)依賴的樹狀依賴關(guān)系圖;
[0018] 步驟7 :初始化集合{X}中每個元素對應(yīng)的計數(shù)器A和計數(shù)器B值均為0。計數(shù)器 A的值表示該二進制文件被其他文件依賴的次數(shù),計數(shù)器B的值表示該二進制文件一共依 賴多少個其他二進制文件;
[0019] 步驟8 :逐個處理集合{X}中的每個元素,如果該元素依賴其他某個元素,則被依 賴的元素(即所述的其他某個元素)所對應(yīng)的計數(shù)器A執(zhí)行加一操作,該元素對應(yīng)的計數(shù) 器B值等于該元素依賴的其他元素的總個數(shù);
[0020] 步驟9 :集合{X}中是否存在未被處理的元素,如果還有則返回步驟8 ;否則進入 步驟10 ;
[0021] 步驟10 :此時集合{X}中每個元素對應(yīng)的計數(shù)器A值表示該元素總計被多少個其 他元素依賴,計數(shù)器B值表示該元素依賴多少個其他元素,對集合{X}中的所有元素,按對 應(yīng)的計數(shù)器A值從小到大進行排序,計數(shù)器A的值大表示該元素的重要程度;
[0022] 步驟11 :初始化一個集合{Y}為空,并為每個元素設(shè)置計數(shù)器C,計數(shù)器C值初始 化為〇 ;
[0023] 步驟12 :找到集合{X}中計數(shù)器A值為0的元素 D,即不被其他任何集合{X}中的 元素依賴的元素,如果存在多個計算器A值為0的元素,任選其中1個進行處理;
[0024] 步驟13 :對于步驟12中找到的每個元素 D,找到集合{Y}中哪些元素依賴元素 D, 計算這些元素的計數(shù)器C值之和Ve與這些元素的總個數(shù)Vf,設(shè)置則該元素的計數(shù)器C值為 Ve+Vf,然后將該元素從集合{X}中刪除,并將該元素加入集合{Y},再在集合{X}中找到被 元素 D依賴的所有元素,將這些元素的計數(shù)器A值減1 ;
[0025] 步驟14 :檢查集合{X}中是否為空,如不為空回到步驟12,否則進入步驟15 ;以及
[0026] 步驟15 :存儲結(jié)合{Y}作為Linux基礎(chǔ)軟件依賴關(guān)系分析的結(jié)果,集合{Y}中包 含了所有的元素,包括單個文件元素,也包括存在文件循環(huán)依賴關(guān)系的封閉依賴鏈元素組 成的集合元素,集合{Y}中的每個元素計數(shù)器C值代表了該元素被其他元素直接依賴和間 接依賴的總次數(shù),該值更能反映單個元素在整個Linux系統(tǒng)中的重要程度,被直接依賴和 間接依賴總次數(shù)越多的元素,其重要性越強。
[0027] 利用本發(fā)明實施例的Linux基礎(chǔ)軟件依賴關(guān)系分析方法,可以在無需軟件包描述 信息的情況下,直接掃描Linux文件系統(tǒng)中所有的二進制文件(包括可執(zhí)行文件和庫文 件),從而直接獲得Linux系統(tǒng)中內(nèi)核之上的所有軟件的二進制可執(zhí)行文件和庫文件之間 的依賴關(guān)系,并給出所有二進制文件在整個Linux系統(tǒng)中的重要程度量化評價指標(biāo),可以 為Linux系統(tǒng)安全性分析、Linux系統(tǒng)結(jié)構(gòu)分析提供有力支持。
【專利附圖】
【附圖說明】
[0028] 從下面結(jié)合附圖對本發(fā)明實施例的詳細描述中,本發(fā)明的這些和/或其它方面和 優(yōu)點將變得更加清楚并更容易理解,其中:
[0029] 圖1示出了根據(jù)本發(fā)明第一實施例的用于分析Linux基礎(chǔ)軟件之間的依賴關(guān)系的 Linux基礎(chǔ)軟件依賴關(guān)系分析方法100的總體流程圖。
[0030] 圖2示出了執(zhí)行l(wèi)dd命令的執(zhí)行結(jié)果示意圖。
[0031] 圖3示出了執(zhí)行該readelf相關(guān)命令的執(zhí)行結(jié)果示意圖。
[0032] 圖4示出了根據(jù)本發(fā)明一個實施例的消除二進制文件的循環(huán)依賴關(guān)系的示例性 方法130的流程圖。
[0033] 圖5示出了根據(jù)本發(fā)明第二實施例的Linux基礎(chǔ)軟件依賴關(guān)系分析方法200的總 體流程圖。
[0034] 圖6示出了根據(jù)本發(fā)明一個實施例的對于集合{X}中的每個元素,計算該元素被 其他元素直接依賴和間接依賴的總次數(shù)的示例性方法250的流程圖。
[0035] 圖7示出了根據(jù)本發(fā)明另一個實施例的對于集合{X}中的每個元素,計算該元素 被其他元素直接依賴和間接依賴的總次數(shù)的示例性方法250'的流程圖。
[0036] 圖8示出了根據(jù)本發(fā)明第三實施例的Linux基礎(chǔ)軟件依賴關(guān)系分析裝置300的配 置框圖。
【具體實施方式】
[0037] 為了使本領(lǐng)域技術(shù)人員更好地理解本發(fā)明,下面結(jié)合附圖和【具體實施方式】對本發(fā) 明作進一步詳細說明。
[0038] 在本文中,術(shù)語"二進制文件"是二進制可執(zhí)行文件和二進制庫文件的統(tǒng)稱。
[0039] 在本文中,除非特別說明或者和其他修飾詞結(jié)合出現(xiàn)或者根據(jù)上下文明顯為其他 含義,否則單獨出現(xiàn)的詞匯"文件"指代二進制文件。
[0040] 在本文中,"沒有重疊的依賴循環(huán)鏈"表示任意兩個循環(huán)依賴鏈上的文件集合沒有 交集。
[0041] 一、第一實施例
[0042] 圖1示出了根據(jù)本發(fā)明第一實施例的用于分析Linux基礎(chǔ)軟件之間的依賴關(guān)系的 Linux基礎(chǔ)軟件依賴關(guān)系分析方法100的總體流程圖。
[0043] 在步驟S110中,掃描一個Linux系統(tǒng),得到所有二進制可執(zhí)行文件和庫文件的列 表,然后前進到步驟S120。
[0044] 在步驟S120中,獲得該列表中的文件之間的依賴關(guān)系。這里的文件之間的依賴關(guān) 系指的是文件之間存在直接依賴關(guān)系,即直接的調(diào)用和被調(diào)用關(guān)系。
[0045] 在一個示例中,獲得文件之間的依賴關(guān)系可以包括:
[0046] 步驟1 :對列表中的每個二進制可執(zhí)行文件和庫文件,分析該文件與其他文件之 間的函數(shù)調(diào)用關(guān)系,獲得該文件所依賴的其他二進制可執(zhí)行文件和庫文件的集合;以及
[0047] 步驟2 :對上述集合中的每個被依賴的二進制文件,建立一個從被分析的二進制 文件到集合中被依賴的該二進制文件的有向依賴連接。
[0048] 下面給出得到二進制文件之間的函數(shù)調(diào)用依賴關(guān)系,從而確定兩個二進制文件之 間的依賴關(guān)系的示例性方法。
[0049] 例如,二進制文件之間的依賴關(guān)系可以用如下兩種方法獲得:
[0050] 1)方法1 :利用ldd命令分析庫調(diào)用的依賴關(guān)系。
[0051] 通過執(zhí)行"ldd待分析的二進制文件全路徑名"命令,可以獲得該文件依賴哪些二 進制庫文件。比如執(zhí)行如下命令:
[0052] ldd/usr/bin/as
[0053] 可以獲得as文件依賴libc. so. 6等二進制文件,圖2給出了執(zhí)行l(wèi)dd命令的執(zhí)行 結(jié)果示意圖。
[0054] 2)方法2 :利用readelf工具分析可執(zhí)行文件/庫的依賴性。
[0055] 通過執(zhí)行"readelf-dynamic待分析的二進制文件全路徑名"命令,可以獲得該文 件依賴哪些二進制庫文件。比如執(zhí)行如下命令 :
[0056] readelf - dynamic/usr/bin/as
[0057] 可以獲得as文件依賴libc. so. 6等二進制文件,圖3給出了執(zhí)行該readelf相關(guān) 命令的執(zhí)行結(jié)果示意圖。
[0058] 通過例如以上兩種方法的任一個或者其組合,可以逐個處理Linux系統(tǒng)中每個有 待分析的二進制可執(zhí)行文件或二進制庫文件,從而獲得所有待分析的二進制文件之間的依 賴關(guān)系。
[0059] 在步驟S120中獲得該列表中的文件之間的依賴關(guān)系之后,前進到步驟S130。
[0060] 在步驟S130中,消除二進制文件的循環(huán)依賴關(guān)系,構(gòu)建集合{X},其中集合{X}由 彼此之間不存在循環(huán)依賴關(guān)系的元素組成,元素 X為由處于一個循環(huán)依賴鏈上的所有文件 構(gòu)成的集合或者由不存在于任何一個循環(huán)依賴鏈中的單個文件構(gòu)成的集合。
[0061] 下面參考圖4描述根據(jù)本發(fā)明一個實施例的消除二進制文件的循環(huán)依賴關(guān)系的 示例性方法130的過程。
[0062] 在步驟S131中,查找系統(tǒng)二進制文件的循環(huán)依賴關(guān)系,然后前進到步驟S132。
[0063] 下面詳細描述查找系統(tǒng)二進制文件的循環(huán)依賴關(guān)系的一個示例性方法。
[0064] 由于Linux系統(tǒng)是一個復(fù)雜的積木式軟件系統(tǒng),經(jīng)過長期的演化和發(fā)展,一些軟 件之間可能存在互相依賴關(guān)系,比如二進制文件A依賴二進制文件B,同時二進制文件B又 依賴二進制文件A。再比如二進制文件A依賴二進制文件B,二進制文件B依賴二進制文件 C,而二進制文件C又依賴二進制文件A,從而構(gòu)成一個環(huán)形的循環(huán)依賴關(guān)系。上述環(huán)形的循 環(huán)依賴關(guān)系僅為示例,可以存在其他形式的或者更復(fù)雜的循環(huán)依賴關(guān)系。
[0065] 以上循環(huán)依賴關(guān)系可能導(dǎo)致圖1中的步驟4及可選的其后的步驟形成無限循環(huán)操 作,導(dǎo)致處理流程死鎖。為避免該問題,需要將所有存在循環(huán)依賴關(guān)系的相關(guān)二進制文件合 并成一個文件集合,在新的集合中被視為一個元素,從而讓所有元素呈現(xiàn)為一種單向的樹 狀依賴圖。
[0066] 作為示例,可以利用下述方法來遍歷查找出Linux系統(tǒng)中的所有二進制文件循環(huán) 依賴關(guān)系:
[0067] 步驟1 :將系統(tǒng)中的所有二進制文件加入集合{S},以及初始化一個集合{C}為空, 用于記錄后續(xù)步驟中發(fā)現(xiàn)的循環(huán)依賴文件集合。
[0068] 步驟2 :從集合{S}中隨機選取一個文件T,并將該文件T從集合{S}中刪除。將 該二進制文件T加入集合{P},初始情況下集合P只包含該文件T本身一個元素。
[0069] 步驟3 :利用深度優(yōu)先搜索算法搜索文件X依賴的所有二進制文件,每執(zhí)行一步深 度搜索,將相應(yīng)的二進制文件加入集合{P},如果新加入集合{P}的二進制文件為T,則表示 該深度優(yōu)先搜索路徑構(gòu)成了一個二進制文件循環(huán)依賴,跳至步驟5 ;否則繼續(xù)深度優(yōu)先搜 索,直到?jīng)]有進一步依賴的二進制文件時該條深度優(yōu)先搜索路徑結(jié)束,再遞歸進入下一條 深度優(yōu)先搜索路徑,從集合{P}中刪除遞歸之前的相關(guān)文件。
[0070] 步驟4 :將文件T從集合{S}中刪除,跳轉(zhuǎn)至步驟8。
[0071] 步驟5 :將集合{P}中的所有仍在集合{S}中的二進制文件從集合{S}中刪除。
[0072] 步驟6 :檢查集合{P}與集合{C}中已有的元素是否存在重疊,如果有重疊,則合 并兩個集合,刪除集合{C}中原有與集合{P}存在重疊的元素,將合并后的集合做為一個新 的元素重新放入集合{C},跳至步驟7。
[0073] 步驟7 :如集合{P}與集合{C}中已有的元素不存重疊,則將集合{P}做為一個新 元素放入集合{C}。
[0074] 步驟8 :清空集合{P}。
[0075] 步驟9 :判斷集合{S}是否為空,如為空,則結(jié)束處理;如果集合{S}不為空,即表 示還有尚未分析的二進制文件,則回到步驟2。
[0076] 經(jīng)過上述步驟的遍歷搜索,集合{C}中的元素個數(shù)即為系統(tǒng)中存在的不互相交叉 的循環(huán)依賴關(guān)系的個數(shù),集合{C}中的每個元素為存在循環(huán)依賴關(guān)系的若干個二進制文件 的集合,可用于圖1中的步驟S130中集合{X}的構(gòu)建。
[0077] 在步驟S131中查找系統(tǒng)二進制文件的循環(huán)依賴關(guān)系之后前進到步驟S132。
[0078] 在步驟S132中,對于找到的每個循環(huán)依賴關(guān)系,由處于循環(huán)依賴鏈上的所有文件 構(gòu)成一個集合,記為集合Xi,i = 〇. ..M-1,其中Μ表示整個系統(tǒng)中沒有重疊的循環(huán)依賴鏈 個數(shù),Μ為大于等于1的正整數(shù)。然后,前進到步驟S132。
[0079] 在步驟133中,將其他不存在于任何一個循環(huán)依賴鏈中的文件記為只有一個元素 的集合Xj,j = M. . . M+N-l,Ν表示系統(tǒng)中不在任何一個循環(huán)依賴鏈中的文件個數(shù),Ν為大于 等于1的正整數(shù)。然后,前進到步驟S134。
[0080] 在步驟S134中,由所有的Xi和Xj構(gòu)成所述集合{X},該集合{X}的大小為N+M。
[0081] 返回到圖1,在步驟S130中消除二進制文件的循環(huán)依賴關(guān)系并構(gòu)建集合{X}之后, 前進到步驟S140。
[0082] 在步驟S140中,對集合{X}中的每個元素,依據(jù)步驟S120獲得的文件之間的依賴 關(guān)系,建立元素之間的依賴關(guān)系,其中如果一個元素中存在多個文件與另一個元素中的多 個文件存在依賴關(guān)系,兩個元素之間只記為一個依賴關(guān)系,集合{X}中各元素的依賴關(guān)系 是一個內(nèi)部不存在循環(huán)依賴的樹狀依賴關(guān)系圖。
[0083] 不同于常見及的基于軟件包信息的軟件包依賴關(guān)系分析方法,利用結(jié)合圖1描述 的本發(fā)明實施例的Linux基礎(chǔ)軟件依賴關(guān)系分析方法,在無需軟件包描述信息的情況下, 直接掃描Linux文件系統(tǒng)中所有的二進制文件(包括可執(zhí)行文件和庫文件),從而能夠直接 獲得Linux系統(tǒng)中內(nèi)核之上的所有軟件的二進制可執(zhí)行文件和庫文件之間的依賴關(guān)系,可 以為Linux系統(tǒng)安全性分析、Linux系統(tǒng)結(jié)構(gòu)分析提供有力支持。
[0084] 二、第二實施例
[0085] 圖5示出了根據(jù)本發(fā)明第二實施例的Linux基礎(chǔ)軟件依賴關(guān)系分析方法200的總 體流程圖。
[0086] 相比于結(jié)合圖1描述的根據(jù)本發(fā)明第一實施例的Linux基礎(chǔ)軟件依賴關(guān)系分析方 法,圖5所示的根據(jù)本發(fā)明第二實施例的Linux基礎(chǔ)軟件依賴關(guān)系分析方法多了步驟S250, 即元素重要性評估步驟。下面將詳細描述步驟S250的示例性實現(xiàn)方法。關(guān)于步驟S210到 步驟S240的功能和實現(xiàn)可以參考結(jié)合圖1描述的步驟S110到步驟S140的功能和實現(xiàn)。 [0087] 如圖5所示,在步驟S250中,依據(jù)元素之間的依賴關(guān)系,對集合{X}中的每個元 素,計算該元素被其他元素直接依賴和間接依賴的總次數(shù),得出該元素的重要性評估。
[0088] 下面描述對集合{X}中的每個元素,計算該元素被其他元素直接依賴和間接依賴 的總次數(shù)的兩種示例性方法。
[0089] 圖6示出了根據(jù)本發(fā)明一個實施例的對于集合{X}中的每個元素,計算該元素被 其他元素直接依賴和間接依賴的總次數(shù)的示例性方法250的流程圖。
[0090] 在步驟S251中,初始化集合{X}中每個元素對應(yīng)的計數(shù)器A和計數(shù)器B值均為0, 其中計數(shù)器A的值表示該元素被其他元素依賴的次數(shù),計數(shù)器B的值表示該元素一共依賴 多少個其他元素,然后前進到步驟S252。
[0091] 在步驟S252中,逐個處理集合{X}中的每個元素,如果該元素依賴其他某個元素, 則被依賴的所述其他某個元素所對應(yīng)的計數(shù)器A執(zhí)行加一操作,該元素對應(yīng)的計數(shù)器B值 等于該元素依賴的其他元素的總個數(shù),然后前進到步驟S253。
[0092] 在步驟S253中,判斷集合{X}中是否存在未被處理的元素,如果存在則返回步驟 S252 ;否則結(jié)束該迭代處理,前進到步驟S254。
[0093] 在步驟S254中,依據(jù)各個元素對應(yīng)的計數(shù)器A和計數(shù)器B,得到每個元素被其他元 素直接依賴和間接依賴的總次數(shù)。
[0094] 圖7示出了根據(jù)本發(fā)明另一個實施例的對于集合{X}中的每個元素,計算該元 素被其他元素直接依賴和間接依賴的總次數(shù)的示例性方法250'的流程圖。圖7的步驟 S251-S253與圖6所示的對應(yīng)步驟S251-S253的功能和操作相同,這里不再贅述。
[0095] 圖7與圖6的不同在于步驟S254' -S258,這是基于如下考慮:對集合{X}中的所 有元素,可以按對應(yīng)的計數(shù)器A值從小到大進行排序,計數(shù)器A的值大表示該元素的重要程 度,即該元素在整個Linux系統(tǒng)中越重要。但是這一判斷并不準(zhǔn)確,比如某個基礎(chǔ)元素被依 賴的次數(shù)很少,但是依賴它的幾個元素被更高層的元素依賴次數(shù)很多,因此該基礎(chǔ)元素實 際上非常重要,因此可以執(zhí)行步驟S254' -S258,以進一步準(zhǔn)確反映集合{X}中每個元素的 重要性。
[0096] 在步驟S254'中,初始化一個集合{Y}為空,并為每個元素設(shè)置計數(shù)器C,計數(shù)器C 值初始化為〇,然后前進到步驟S255。
[0097] 在步驟S255中,找到集合{X}中計數(shù)器A值為0的元素 D,即不被其他任何集合 {X}中的元素依賴的元素,如果存在多個計數(shù)器A值為0的元素,任選其中1個進行處理,然 后前進到步驟S256。
[0098] 在步驟S256中,對于步驟S255中找到的每個元素 D,找到集合{Y}中哪些元素依 賴元素 D,計算這些元素的計數(shù)器C值之和Ve與這些元素的總個數(shù)Vf,設(shè)置該元素 D的計 數(shù)器C值為Ve+Vf ;然后將該元素 D從集合{X}中刪除,并將該元素加入集合{Y},再在集合 {X}中找到被元素 D依賴的所有元素,將這些元素的計數(shù)器A值減1,然后前進到步驟S257。
[0099] 在步驟S257中,判斷集合{X}中是否為空,如不為空回到步驟S255 ;否則進入步 驟 S258。
[0100] 在步驟S258中,依據(jù)集合{Y}中的每個元素的元素計數(shù)器C值,得到該元素的重 要性評估。
[0101] 可選地,在一個示例中,例如可以根據(jù)用戶的要求,將元素按照重要性評估排序, 并且按照元素的重要性評估順序,將集合{X}中的元素輸出,例如以可視化形式輸出元素 X 代表的循環(huán)依賴鏈,例如環(huán)形的鏈表。
[0102] 利用本發(fā)明實施例的Linux基礎(chǔ)軟件依賴關(guān)系分析方法,可以在無需軟件包描述 信息的情況下,直接掃描Linux文件系統(tǒng)中所有的二進制文件(包括可執(zhí)行文件和庫文 件),從而直接獲得Linux系統(tǒng)中內(nèi)核之上的所有軟件的二進制可執(zhí)行文件和庫文件之間 的依賴關(guān)系,并給出所有二進制文件在整個Linux系統(tǒng)中的重要程度量化評價指標(biāo),可以 為Linux系統(tǒng)安全性分析、Linux系統(tǒng)結(jié)構(gòu)分析提供有力支持。
[0103] 三、第三實施例
[0104] 圖8示出了根據(jù)本發(fā)明第三實施例的Linux基礎(chǔ)軟件依賴關(guān)系分析裝置300的配 置框圖。
[0105] 如圖8所示,Linux基礎(chǔ)軟件依賴關(guān)系分析裝置300可以包括Linux系統(tǒng)掃描部 件310、文件間依賴關(guān)系獲得部件320、循環(huán)依賴關(guān)系去除部件330、元素間依賴關(guān)系圖構(gòu)建 部件340。
[0106] Linux系統(tǒng)掃描部件310配置為掃描一個Linux系統(tǒng),得到所有二進制可執(zhí)行文件 和庫文件的列表。
[0107] 文件間依賴關(guān)系獲得部件320配置為獲得該列表中的文件之間的依賴關(guān)系。
[0108] 循環(huán)依賴關(guān)系去除部件330配置為消除二進制文件的循環(huán)依賴關(guān)系,構(gòu)建集合 {X},其中集合{X}由彼此之間不存在循環(huán)依賴關(guān)系的元素組成,元素 X為由處于一個循環(huán) 依賴鏈上的所有文件構(gòu)成的集合或者由不存在于任何一個循環(huán)依賴鏈中的單個文件構(gòu)成 的集合。
[0109] 元素間依賴關(guān)系圖構(gòu)建部件340配置為對集合{X}中的每個元素,依據(jù)步驟2獲 得的文件之間的依賴關(guān)系,建立元素之間的依賴關(guān)系,其中如果一個元素中存在多個文件 與另一個元素中的多個文件存在依賴關(guān)系,兩個元素之間只記為一個依賴關(guān)系,集合{X} 中各元素的依賴關(guān)系是一個內(nèi)部不存在循環(huán)依賴的樹狀依賴關(guān)系圖。
[0110] 有關(guān)Linux系統(tǒng)掃描部件310、文件間依賴關(guān)系獲得部件320、循環(huán)依賴關(guān)系去除 部件330、元素間依賴關(guān)系圖構(gòu)建部件340的功能和實現(xiàn)可以參考前面結(jié)合圖1到圖7所做 的描述,這里不再贅述。
[0111] 需要說明的是,上述Linux基礎(chǔ)軟件依賴關(guān)系分析裝置的各個部件可以用軟件程 序來實現(xiàn),例如通過通用計算機中的CPU結(jié)合RAM和ROM等以及其中運行的軟件代碼來實 現(xiàn)。軟件程序可以存儲在諸如閃存、軟盤、硬盤、光盤等存儲介質(zhì)上,在運行時加載到諸如隨 機訪問存儲器RAM上來由CPU執(zhí)行。另外,除了通用計算機上,還可以通過專用集成電路和 軟件之間的合作來實現(xiàn)。所述集成電路包括通過例如MPU (微處理單元)、DSP (數(shù)字信號處 理器)、FPGA(現(xiàn)場可編程門陣列)、ASIC(專用集成電路)等中的至少一個來實現(xiàn)。另外, Linux基礎(chǔ)軟件依賴關(guān)系分析裝置的各個部件可以用專門的硬件來實現(xiàn),例如特定的現(xiàn)場 可編程門陣列、專用集成電路等。另外,圖像編碼器的各個部件也可以利用軟件和硬件的結(jié) 合來實現(xiàn)。
[0112] 上述Linux基礎(chǔ)軟件依賴關(guān)系分析裝置中的各個單元的結(jié)構(gòu)和數(shù)量不對本發(fā)明 的范圍構(gòu)成限制。根據(jù)本發(fā)明的一個實施例,各個部件可以合并為一個獨立的部件來執(zhí)行 和實現(xiàn)相應(yīng)的功能和操作,或者各個部件進一步拆分為更小的單元來實現(xiàn)他們各自的功能 和操作。
[0113] 以上已經(jīng)描述了本發(fā)明的各實施例,上述說明是示例性的,并非窮盡性的,并且也 不限于所披露的各實施例。在不偏離所說明的各實施例的范圍和精神的情況下,對于本技 術(shù)領(lǐng)域的普通技術(shù)人員來說許多修改和變更都是顯而易見的。因此,本發(fā)明的保護范圍應(yīng) 該以權(quán)利要求的保護范圍為準(zhǔn)。
【權(quán)利要求】
1. 一種用于分析Linux基礎(chǔ)軟件之間的依賴關(guān)系的Linux基礎(chǔ)軟件依賴關(guān)系分析方 法,包括: 步驟1 :掃描一個Linux系統(tǒng),得到所有二進制文件的列表,二進制文件包括二進制可 執(zhí)行文件和庫文件; 步驟2 :獲得該列表中的二進制文件之間的依賴關(guān)系; 步驟3 :消除二進制文件的循環(huán)依賴關(guān)系,構(gòu)建集合{X},其中集合{X}由彼此之間不存 在循環(huán)依賴關(guān)系的元素組成,元素 X為由處于一個循環(huán)依賴鏈上的所有二進制文件構(gòu)成的 集合或者由不存在于任何一個循環(huán)依賴鏈中的單個二進制文件構(gòu)成的集合; 步驟4:對集合{X}中的每個元素,依據(jù)步驟2獲得的二進制文件之間的依賴關(guān)系,建 立元素之間的依賴關(guān)系,其中如果一個元素中存在多個二進制文件與另一個元素中的多個 二進制文件存在依賴關(guān)系,兩個元素之間只記為一個依賴關(guān)系,集合{X}中各元素的依賴 關(guān)系是一個內(nèi)部不存在循環(huán)依賴的樹狀依賴關(guān)系圖。
2. 根據(jù)權(quán)利要求1的Linux基礎(chǔ)軟件依賴關(guān)系分析方法,所述步驟2的獲得二進制文 件之間的依賴關(guān)系包括: 步驟2-1 :對列表中的每個二進制文件,分析該二進制文件與其他二進制文件之間的 函數(shù)調(diào)用關(guān)系,獲得該二進制文件所依賴的其他二進制文件的集合;以及 步驟2-2 :對上述集合中的每個被依賴的二進制文件,建立一個從被分析的二進制文 件到集合中被依賴的該二進制文件的有向依賴連接。
3. 根據(jù)權(quán)利要求1或2的Linux基礎(chǔ)軟件依賴關(guān)系分析方法,所述步驟3的消除二進 制文件的循環(huán)依賴關(guān)系包括: 步驟3-1 :查找系統(tǒng)二進制文件的循環(huán)依賴關(guān)系; 步驟3-2 :對于找到的每個循環(huán)依賴關(guān)系,由處于循環(huán)依賴鏈上的所有二進制文件構(gòu) 成一個集合,記為集合Xi,i = 〇. ..M-1,其中Μ表示整個系統(tǒng)中沒有重疊的循環(huán)依賴鏈個 數(shù),Μ為大于等于1的正整數(shù); 步驟3-3 :將其他不存在于任何一個循環(huán)依賴鏈中的二進制文件記為只有一個元素的 集合Xj,j = M. . . Μ+Ν-1,Ν表示系統(tǒng)中不在任何一個循環(huán)依賴鏈中的二進制文件個數(shù),Ν為 大于等于1的正整數(shù);以及 步驟3-4 :由所有的Xi和Xj構(gòu)成所述集合{X},該集合{X}的大小為Ν+Μ。
4. 根據(jù)權(quán)利要求1或2的Linux基礎(chǔ)軟件依賴關(guān)系分析方法,還包括: 步驟5:依據(jù)元素之間的依賴關(guān)系,對集合{X}中的每個元素,計算該元素被其他元素 直接依賴和間接依賴的總次數(shù),得出該元素的重要性評估。
5. 根據(jù)權(quán)利要求4的Linux基礎(chǔ)軟件依賴關(guān)系分析方法,所述步驟5的對集合{X}中 的每個元素,計算該元素被其他元素直接依賴和間接依賴的總次數(shù)包括: 步驟5-1 :初始化集合{X}中每個元素對應(yīng)的計數(shù)器A和計數(shù)器B值均為0,計數(shù)器A 的值表示該元素被其他元素依賴的次數(shù),計數(shù)器B的值表示該元素一共依賴多少個其他元 素; 步驟5-2:逐個處理集合{X}中的每個元素,如果該元素依賴其他某個元素,則被依賴 的所述其他某個元素所對應(yīng)的計數(shù)器A執(zhí)行加一操作,該元素對應(yīng)的計數(shù)器B值等于該元 素依賴的其他元素的總個數(shù), 步驟5-3 :判斷集合{X}中是否存在未被處理的元素,如果還有則返回步驟S5-2 ;否則 結(jié)束該迭代處理; 步驟5-4 :依據(jù)各個元素對應(yīng)的計數(shù)器A和計數(shù)器B,得到每個元素被其他元素直接依 賴和間接依賴的總次數(shù)。
6. 根據(jù)權(quán)利要求4的Linux基礎(chǔ)軟件依賴關(guān)系分析方法,所述步驟5的對集合{X}中 的每個元素,計算該元素被其他元素直接依賴和間接依賴的總次數(shù)包括: 步驟5-1 :初始化集合{X}中每個元素對應(yīng)的計數(shù)器A和計數(shù)器B值均為0,計數(shù)器A 的值表示該元素被其他元素依賴的次數(shù),計數(shù)器B的值表示該元素一共依賴多少個其他元 素; 步驟5-2:逐個處理集合{X}中的每個元素,如果該元素依賴其他某個元素,則被依賴 的所述其他某個元素所對應(yīng)的計數(shù)器A執(zhí)行加一操作,該元素對應(yīng)的計數(shù)器B值等于該元 素依賴的其他元素的總個數(shù), 步驟5-3 :判斷集合{X}中是否存在未被處理的元素,如果還有則返回步驟5-2 ;否則 結(jié)束該迭代處理; 步驟5-4 :初始化一個集合{Y}為空,并為每個元素設(shè)置計數(shù)器C,計數(shù)器C值初始化為 〇 ; 步驟5-5 :找到集合{X}中計數(shù)器A值為0的元素 D,即不被其他任何集合{X}中的元 素依賴的元素,如果存在多個計數(shù)器A值為0的元素,任選其中1個進行處理, 步驟5-6 :對于步驟5-5中找到的每個元素 D,找到集合{Y}中哪些元素依賴元素 D,計 算這些元素的計數(shù)器C值之和Ve與這些元素的總個數(shù)Vf,設(shè)置該元素 D的計數(shù)器C值為 Ve+Vf;然后將該元素 D從集合{X}中刪除,并將該元素加入集合{Y},再在集合{X}中找到 被元素 D依賴的所有元素,將這些元素的計數(shù)器A值減1 ; 步驟5-7 :檢查集合{X}中是否為空,如不為空回到步驟5-5 ;否則進入步驟5-8 ;以及 步驟5-8:依據(jù)集合{Y}中的每個元素的元素計數(shù)器C值,得到該元素的重要性評估。
7. 根據(jù)權(quán)利要求1或2的Linux基礎(chǔ)軟件依賴關(guān)系分析方法,所述步驟2的獲得二進 制文件之間的依賴關(guān)系包括下述操作中的至少一個: 利用ldd命令分析庫調(diào)用的依賴關(guān)系;以及 利用readelf工具分析二進制可執(zhí)行文件或庫的依賴性。
8. 根據(jù)權(quán)利要求1的Linux基礎(chǔ)軟件依賴關(guān)系分析方法,所述步驟3的消除二進制文 件的循環(huán)依賴關(guān)系包括: 步驟3-1 :將系統(tǒng)中的所有二進制文件加入集合{S},初始化一個集合{C}為空,用于記 錄后續(xù)步驟中發(fā)現(xiàn)的循環(huán)依賴二進制文件集合; 步驟3-2 :從集合{S}中隨機選取一個二進制文件T,并將該二進制文件T從集合{S} 中刪除,將該二進制文件T加入集合{P},初始情況下集合P只包含該二進制文件T本身一 個元素; 步驟3-3 :利用深度優(yōu)先搜索算法搜索二進制文件T依賴的所有二進制文件,每執(zhí)行一 步深度搜索,將相應(yīng)的二進制文件加入集合{P},如果新加入集合{P}的二進制文件為T,則 表示該深度優(yōu)先搜索路徑構(gòu)成了一個二進制文件循環(huán)依賴,跳至步驟3-5 ;否則繼續(xù)深度 優(yōu)先搜索,直到?jīng)]有進一步依賴的二進制文件時該條深度優(yōu)先搜索路徑結(jié)束,再遞歸進入 下一條深度優(yōu)先搜索路徑,從集合{p}中刪除遞歸之前的相關(guān)二進制文件; 步驟3-4 :將二進制文件T從集合{S}中刪除,跳轉(zhuǎn)至步驟3-8 ; 步驟3-5 :將集合{P}中的所有仍在集合{S}中的二進制文件從集合{S}中刪除; 步驟3-6:檢查集合{P}與集合{C}中已有的元素是否存在重疊,如果有重疊,則合并 兩個集合,刪除集合{C}中原有與集合{P}存在重疊的元素,將合并后的集合做為一個新的 元素重新放入集合{C},跳至步驟3-7 ; 步驟3-7 :如集合{P}與集合{C}中已有的元素不存重疊,則將集合{P}做為一個新元 素放入集合{C}; 步驟8 :清空集合{P}; 步驟9:判斷集合{S}是否為空,如為空,則結(jié)束處理;如果集合{S}不為空,即表示還 有尚未分析的二進制文件,則回到步驟2 ; 步驟10 :將集合{C}中的每個元素作為存在循環(huán)依賴關(guān)系的若干個二進制文件的集合 加入集合{X}中,作為元素 X,其中集合{C}中的元素個數(shù)即為系統(tǒng)中存在的不互相交叉的 循環(huán)依賴關(guān)系的個數(shù),集合{C}中的每個元素為存在循環(huán)依賴關(guān)系的若干個二進制文件的 集合。
9. 一種用于分析Linux基礎(chǔ)軟件之間的依賴關(guān)系的Linux基礎(chǔ)軟件依賴關(guān)系分析方 法,包括: 步驟1 :掃描一個Linux系統(tǒng)中,得到所有二進制文件的列表,二進制文件包括二進制 可執(zhí)行文件和庫文件; 步驟2 :逐個分析每個二進制文件的函數(shù)調(diào)用關(guān)系,獲得該文件所依賴的其他二進制 文件的集合; 步驟3 :對上述集合中的每個被依賴的二進制文件,建立一個從被分析的二進制文件 到集合中被依賴的該二進制文件的有向依賴連接; 步驟4 :檢查Linux系統(tǒng)中的所有二進制文件是否都被分析過,如果還有沒有被分析的 二進制文件,回到步驟2 ;否則進入步驟5 ; 步驟5 :查找系統(tǒng)二進制文件的循環(huán)依賴關(guān)系,對于找到的每個循環(huán)依賴關(guān)系,處于循 環(huán)依賴鏈上的所有二進制文件構(gòu)成一個集合,記為集合Xi,i = 〇. . . M-1,M表示整個系統(tǒng)中 沒有重疊的循環(huán)依賴鏈個數(shù);其他不存在于任何一個循環(huán)依賴鏈中的二進制文件被記為只 有一個元素的集合Xj,j = M. . . M+N-l,N表示系統(tǒng)中不在任何一個循環(huán)依賴鏈中的二進制 文件個數(shù);由所有的Xi和Xj構(gòu)成一個新的集合{X},該集合的大小為N+M ; 步驟6 :對集合{X}中的每個元素,依據(jù)步驟2到步驟4獲得的二進制文件之間的依賴 關(guān)系,建立元素之間的依賴關(guān)系,如果一個元素中存在多個二進制文件與另一個元素中的 多個二進制文件存在依賴關(guān)系,兩個元素之間只記為一個依賴關(guān)系,集合{X}中各元素的 依賴關(guān)系是一個內(nèi)部不存在循環(huán)依賴的樹狀依賴關(guān)系圖; 步驟7:初始化集合{X}中每個元素對應(yīng)的計數(shù)器A和計數(shù)器B值均為0。計數(shù)器A的 值表示該二進制文件被其他二進制文件依賴的次數(shù),計數(shù)器B的值表示該二進制文件一共 依賴多少個其他二進制文件; 步驟8:逐個處理集合{X}中的每個元素,如果該元素依賴其他某個元素,則被依賴的 元素(即所述的其他某個元素)所對應(yīng)的計數(shù)器A執(zhí)行加一操作,該元素對應(yīng)的計數(shù)器B 值等于該元素依賴的其他元素的總個數(shù); 步驟9 :集合{X}中是否存在未被處理的元素,如果還有則返回步驟8 ;否則進入步驟 10 ; 步驟10 :此時集合{X}中每個元素對應(yīng)的計數(shù)器A值表示該元素總計被多少個其他元 素依賴,計數(shù)器B值表示該元素依賴多少個其他元素,對集合{X}中的所有元素,按對應(yīng)的 計數(shù)器A值從小到大進行排序,計數(shù)器A的值大表示該元素的重要程度; 步驟11 :初始化一個集合{Y}為空,并為每個元素設(shè)置計數(shù)器C,計數(shù)器C值初始化為 〇 ; 步驟12:找到集合{X}中計數(shù)器A值為0的元素 D,即不被其他任何集合{X}中的元素 依賴的元素,如果存在多個計算器A值為0的元素,任選其中1個進行處理; 步驟13:對于步驟12中找到的每個元素 D,找到集合{Y}中哪些元素依賴元素 D,計 算這些元素的計數(shù)器C值之和Ve與這些元素的總個數(shù)Vf,設(shè)置則該元素的計數(shù)器C值為 Ve+Vf,然后將該元素從集合{X}中刪除,并將該元素加入集合{Y},再在集合{X}中找到被 元素 D依賴的所有元素,將這些元素的計數(shù)器A值減1 ; 步驟14 :檢查集合{X}中是否為空,如不為空回到步驟12,否則進入步驟15 ;以及 步驟15 :存儲結(jié)合{Y}作為Linux基礎(chǔ)軟件依賴關(guān)系分析的結(jié)果,集合{Y}中包含了 所有的元素,包括單個二進制文件元素,也包括存在二進制文件循環(huán)依賴關(guān)系的封閉依賴 鏈元素組成的集合元素,集合{Y}中的每個元素計數(shù)器C值代表了該元素被其他元素直接 依賴和間接依賴的總次數(shù),該值更能反映單個元素在整個Linux系統(tǒng)中的重要程度,被直 接依賴和間接依賴總次數(shù)越多的元素,其重要性越強。
10.根據(jù)權(quán)利要求9的Linux基礎(chǔ)軟件依賴關(guān)系分析方法,所述步驟2的逐個分析每個 二進制文件的函數(shù)調(diào)用關(guān)系,獲得該文件所依賴的其他二進制文件的集合包括下述操作中 的至少一種: 利用ldd命令分析庫調(diào)用的依賴關(guān)系;以及 利用readelf工具分析二進制可執(zhí)行文件或庫的依賴性。
【文檔編號】G06F17/30GK104063220SQ201410291217
【公開日】2014年9月24日 申請日期:2014年6月25日 優(yōu)先權(quán)日:2014年6月25日
【發(fā)明者】陶品, 馮立新 申請人:清華大學(xué)