本技術(shù)涉及代碼分析,尤其涉及源代碼靜態(tài)分析方法、裝置、設(shè)備及存儲(chǔ)介質(zhì)。
背景技術(shù):
1、c#編程語言為運(yùn)行于.net?framework和.net?core(完全開源,跨平臺(tái))之上的高級(jí)程序設(shè)計(jì)語言。在c#和.net?framework的早期版本中,它們主要被限制在windows平臺(tái)上運(yùn)行,并依賴于windows平臺(tái)特有的api(application?programming?interface,應(yīng)用程序編程接口)和dll(dynamic?link?library,動(dòng)態(tài)鏈接庫(kù))結(jié)構(gòu)。目前,市面上多數(shù)源代碼靜態(tài)代碼分析工具主要面向windows平臺(tái),而在其他平臺(tái)(如linux平臺(tái))無法直接加載dll文件,從而無法實(shí)現(xiàn)跨平臺(tái)的靜態(tài)代碼分析。
2、上述內(nèi)容僅用于輔助理解本發(fā)明的技術(shù)方案,并不代表承認(rèn)上述內(nèi)容是現(xiàn)有技術(shù)。
技術(shù)實(shí)現(xiàn)思路
1、本技術(shù)的主要目的在于提供一種源代碼靜態(tài)分析方法、裝置、設(shè)備及存儲(chǔ)介質(zhì),旨在解決現(xiàn)有技術(shù)中的靜態(tài)代碼分析工具依賴于windows平臺(tái)特有的dll結(jié)構(gòu),無法實(shí)現(xiàn)跨平臺(tái)的靜態(tài)代碼分析的技術(shù)問題。
2、為實(shí)現(xiàn)上述目的,本技術(shù)提出一種源代碼靜態(tài)分析方法,所述的方法包括:
3、基于預(yù)設(shè)數(shù)據(jù)讀取框架動(dòng)態(tài)加載動(dòng)態(tài)鏈接庫(kù)文件;
4、對(duì)所述動(dòng)態(tài)鏈接庫(kù)文件進(jìn)行解析,以提取所述動(dòng)態(tài)鏈接庫(kù)文件中的元數(shù)據(jù);
5、對(duì)所述元數(shù)據(jù)進(jìn)行格式轉(zhuǎn)換處理,獲得目標(biāo)庫(kù)元數(shù)據(jù);
6、通過預(yù)設(shè)靜態(tài)代碼分析工具基于所述目標(biāo)庫(kù)元數(shù)據(jù)和源代碼構(gòu)建抽象語法樹;
7、基于所述抽象語法樹生成所述源代碼對(duì)應(yīng)的源代碼分析結(jié)果。
8、在一實(shí)施例中,所述對(duì)所述動(dòng)態(tài)鏈接庫(kù)文件進(jìn)行解析,以提取所述動(dòng)態(tài)鏈接庫(kù)文件中的元數(shù)據(jù)的步驟,包括:
9、對(duì)所述動(dòng)態(tài)鏈接庫(kù)文件進(jìn)行解析,以獲取所述動(dòng)態(tài)鏈接庫(kù)文件對(duì)應(yīng)的程序集;
10、獲取所述程序集中所有類型對(duì)應(yīng)的類型基本信息,所述類型包括:類和接口;
11、根據(jù)所述類型基本信息確定各類型對(duì)應(yīng)的方法信息、屬性信息和成員變量信息;
12、基于所述方法信息、所述屬性信息和所述成員變量信息確定所述動(dòng)態(tài)鏈接庫(kù)文件中的元數(shù)據(jù)。
13、在一實(shí)施例中,所述對(duì)所述元數(shù)據(jù)進(jìn)行格式轉(zhuǎn)換處理,獲得目標(biāo)庫(kù)元數(shù)據(jù)的步驟,包括:
14、基于預(yù)設(shè)數(shù)據(jù)結(jié)構(gòu)和標(biāo)準(zhǔn)數(shù)據(jù)格式對(duì)所述元數(shù)據(jù)進(jìn)行格式轉(zhuǎn)換處理,以生成命名空間信息數(shù)組、類型信息數(shù)組、方法信息數(shù)組和字段信息數(shù)組;
15、基于所述命名空間信息數(shù)組、所述類型信息數(shù)組、所述方法信息數(shù)組和所述字段信息數(shù)組構(gòu)建目標(biāo)庫(kù)元數(shù)據(jù);
16、其中,所述預(yù)設(shè)數(shù)據(jù)結(jié)構(gòu)為以命名空間為組織單位的類型信息集合,所述命名空間信息數(shù)組中的元素為所述命名空間對(duì)應(yīng)的字符串表示,所述類型信息數(shù)組中的元素用于表示類型信息,所述方法信息數(shù)組中的元素用于表示方法信息,所述字段信息數(shù)組中的元素用于表示字段信息。
17、在一實(shí)施例中,所述通過預(yù)設(shè)靜態(tài)代碼分析工具基于所述目標(biāo)庫(kù)元數(shù)據(jù)和源代碼構(gòu)建抽象語法樹的步驟之前,還包括:
18、實(shí)時(shí)檢測(cè)所述目標(biāo)庫(kù)元數(shù)據(jù)是否滿足用戶項(xiàng)目需求;
19、若否,則基于用戶項(xiàng)目需求確定待添加庫(kù)元數(shù)據(jù);
20、基于所述待添加庫(kù)元數(shù)據(jù)對(duì)所述目標(biāo)庫(kù)元數(shù)據(jù)進(jìn)行更新;
21、所述通過預(yù)設(shè)靜態(tài)代碼分析工具基于所述目標(biāo)庫(kù)元數(shù)據(jù)和源代碼構(gòu)建抽象語法樹的步驟,包括:
22、通過預(yù)設(shè)靜態(tài)代碼分析工具基于更新后的目標(biāo)庫(kù)元數(shù)據(jù)和源代碼構(gòu)建抽象語法樹。
23、在一實(shí)施例中,所述通過預(yù)設(shè)靜態(tài)代碼分析工具基于所述目標(biāo)庫(kù)元數(shù)據(jù)和源代碼構(gòu)建抽象語法樹的步驟,包括:
24、通過預(yù)設(shè)靜態(tài)代碼分析工具基于所述目標(biāo)庫(kù)元數(shù)據(jù)和源代碼提取所述源代碼中的代碼關(guān)鍵信息;
25、將所述代碼關(guān)鍵信息轉(zhuǎn)換為代碼中間表示,所述代碼中間表示為代碼屬性圖識(shí)別的中間表示;
26、根據(jù)所述代碼中間表示確定所述代碼屬性圖對(duì)應(yīng)的節(jié)點(diǎn)和邊,以基于所述節(jié)點(diǎn)和所述邊構(gòu)建抽象語法樹。
27、在一實(shí)施例中,所述基于所述抽象語法樹生成所述源代碼對(duì)應(yīng)的源代碼分析結(jié)果的步驟,包括:
28、對(duì)所述抽象語法樹進(jìn)行解析,確定所述抽象語法樹中的代碼屬性圖節(jié)點(diǎn)信息;
29、基于所述代碼屬性圖節(jié)點(diǎn)信息生成目標(biāo)圖結(jié)構(gòu),所述目標(biāo)圖結(jié)構(gòu)包括:控制流圖、數(shù)據(jù)依賴圖和程序依賴圖;
30、通過安全掃描引擎基于所述目標(biāo)圖結(jié)構(gòu)和預(yù)設(shè)安全規(guī)則生成所述源代碼對(duì)應(yīng)的源代碼分析結(jié)果。
31、在一實(shí)施例中,所述方法還包括:
32、定義類型存儲(chǔ)類、方法存儲(chǔ)類和字段存儲(chǔ)類;
33、其中,所述類型存儲(chǔ)類用于存儲(chǔ)元數(shù)據(jù)信息中類型的全名、方法和字段,所述方法存儲(chǔ)類用于存儲(chǔ)所述元數(shù)據(jù)信息中方法的名稱、返回值和參數(shù)列表,所述字段存儲(chǔ)類用于存儲(chǔ)所述元數(shù)據(jù)信息中的字段名稱和類型相關(guān)信息。
34、此外,為實(shí)現(xiàn)上述目的,本技術(shù)還提出一種源代碼靜態(tài)分析裝置,所述裝置包括:
35、文件加載模塊,用于基于預(yù)設(shè)數(shù)據(jù)讀取框架動(dòng)態(tài)加載動(dòng)態(tài)鏈接庫(kù)文件;
36、文件解析模塊,用于對(duì)所述動(dòng)態(tài)鏈接庫(kù)文件進(jìn)行解析,以提取所述動(dòng)態(tài)鏈接庫(kù)文件中的元數(shù)據(jù);
37、格式轉(zhuǎn)換模塊,用于對(duì)所述元數(shù)據(jù)進(jìn)行格式轉(zhuǎn)換處理,獲得目標(biāo)庫(kù)元數(shù)據(jù);
38、語法樹構(gòu)建模塊,用于通過預(yù)設(shè)靜態(tài)代碼分析工具基于所述目標(biāo)庫(kù)元數(shù)據(jù)和源代碼構(gòu)建抽象語法樹;
39、源代碼分析模塊,用于基于所述抽象語法樹生成所述源代碼對(duì)應(yīng)的源代碼分析結(jié)果。
40、此外,為實(shí)現(xiàn)上述目的,本技術(shù)還提出一種源代碼靜態(tài)分析設(shè)備,所述設(shè)備包括:存儲(chǔ)器、處理器及存儲(chǔ)在所述存儲(chǔ)器上并可在所述處理器上運(yùn)行的計(jì)算機(jī)程序,所述計(jì)算機(jī)程序配置為實(shí)現(xiàn)如上文所述的源代碼靜態(tài)分析方法的步驟。
41、此外,為實(shí)現(xiàn)上述目的,本技術(shù)還提出一種存儲(chǔ)介質(zhì),所述存儲(chǔ)介質(zhì)為計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),所述存儲(chǔ)介質(zhì)上存儲(chǔ)有計(jì)算機(jī)程序,所述計(jì)算機(jī)程序被處理器執(zhí)行時(shí)實(shí)現(xiàn)如上文所述的源代碼靜態(tài)分析方法的步驟。
42、本技術(shù)提供了一種源代碼靜態(tài)分析方法,本技術(shù)公開了基于預(yù)設(shè)數(shù)據(jù)讀取框架動(dòng)態(tài)加載動(dòng)態(tài)鏈接庫(kù)文件;對(duì)動(dòng)態(tài)鏈接庫(kù)文件進(jìn)行解析,以提取動(dòng)態(tài)鏈接庫(kù)文件中的元數(shù)據(jù);對(duì)元數(shù)據(jù)進(jìn)行格式轉(zhuǎn)換處理,獲得目標(biāo)庫(kù)元數(shù)據(jù);通過預(yù)設(shè)靜態(tài)代碼分析工具基于目標(biāo)庫(kù)元數(shù)據(jù)和源代碼構(gòu)建抽象語法樹;基于抽象語法樹生成源代碼對(duì)應(yīng)的源代碼分析結(jié)果;相較于現(xiàn)有技術(shù)中源代碼靜態(tài)代碼分析工具主要面向windows平臺(tái),而在其他平臺(tái)無法直接加載dll文件,導(dǎo)致無法實(shí)現(xiàn)跨平臺(tái)的靜態(tài)代碼分析,由于本發(fā)明可以提取并對(duì)動(dòng)態(tài)鏈接庫(kù)文件中的元數(shù)據(jù)進(jìn)行格式轉(zhuǎn)換,獲得目標(biāo)庫(kù)元數(shù)據(jù),并基于目標(biāo)庫(kù)元數(shù)據(jù)和源代碼構(gòu)建抽象語法樹,以通過抽象語法樹進(jìn)行代碼分析,從而解決了現(xiàn)有技術(shù)中的靜態(tài)代碼分析工具依賴于windows平臺(tái)特有的dll結(jié)構(gòu),無法實(shí)現(xiàn)跨平臺(tái)的靜態(tài)代碼分析的技術(shù)問題。