溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何使用Go構(gòu)建一款靜態(tài)分析工具

發(fā)布時(shí)間:2022-06-10 15:49:36 來源:億速云 閱讀:100 作者:iii 欄目:開發(fā)技術(shù)

今天小編給大家分享一下如何使用Go構(gòu)建一款靜態(tài)分析工具的相關(guān)知識(shí)點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識(shí),所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

介 紹

Owl是一款開源項(xiàng)目依賴分析工具,可以快速在指定的項(xiàng)目目錄下查找符合某些特征的源代碼文件或者依賴文件。為何開發(fā)了這款工具?例如很多時(shí)候我們項(xiàng)目太大,項(xiàng)目文件夾下有很多依賴文件,如一個(gè)Java項(xiàng)目引入了log4j這個(gè)jar依賴,在項(xiàng)目中某文件存在循環(huán)依賴問題。當(dāng)某個(gè)依賴包出現(xiàn)了漏洞時(shí),本工具能快速掃描項(xiàng)目目錄下存在的可疑依賴文件,并且給出依賴文件所在的地址,幫助開發(fā)者能快速進(jìn)行定位到可疑文件。

原 理

目前版本的功能比較簡單,工作原理很簡單,工具會(huì)對(duì)特定目錄進(jìn)行掃描通過內(nèi)置的特征碼算法匹配到特定文件,然后收集與其特征碼匹配的文件地址,然后展示出來,也可以重定向到一個(gè)固定json文件中保存。

如何使用Go構(gòu)建一款靜態(tài)分析工具

Owl類似于殺毒軟件一樣,和殺毒軟件的工作原理差不多,Owl會(huì)根據(jù)依賴文件的特征碼來掃描整個(gè)項(xiàng)目,和殺毒病毒庫工作原理類似。當(dāng)然如果嚴(yán)格按照殺毒軟件那種標(biāo)準(zhǔn)做的話,可能涉及一些匯編相關(guān)的,目前owl功能實(shí)現(xiàn)還沒有那么復(fù)雜,后面會(huì)版本會(huì)加入codeql代碼分析引擎,通過codeql的數(shù)據(jù)庫來做靜態(tài)分析功能增強(qiáng)。

快速開始

如何使用owl?你可以克隆倉庫然后通過如下命令:

git clone git@github.com:auula/owl.git

在倉庫內(nèi)部有一個(gè)Makefile文件可以快速幫助你構(gòu)建相應(yīng)平臺(tái)的二進(jìn)制文件,例如:

$: make help
make darwin	| Compile executable binary for MacOS platform
make linux	| Compile executable binary for Linux platform
make windows	| Compile executable binary for Windows platform
make clean	| Clean up executable binary

如何使用

程序構(gòu)建完成會(huì)得到一個(gè)二進(jìn)制文件,程序名稱為owl,如下為owl執(zhí)行效果,一些子命令參數(shù)都已經(jīng)列出:

$: ./owl
			 _____  _    _  __
			(  _  )( \/\/ )(  )
			 )(_)(  )    (  )(__
			(_____)(__/\__)(____) ???? v0.1.2
 A dependency module feature scanning detection tool for static analysis.

Usage:
  owl [command]
Available Commands:
  completion  Generate the autocompletion script for the specified shell
  help        Help about any command
  hex         File hex encoding
  md5         Collection file md5
  run         Execute the scanner
  version     Version information
Flags:
  -h, --help   help for owl
Use "owl [command] --help" for more information about a command.

如果不知道子命令如何使用,可以在對(duì)應(yīng)的子命令后面參入--help參數(shù),即可得到幫助信息:

如何使用Go構(gòu)建一款靜態(tài)分析工具

例如如果你要查找log4j,你首先要通過owl計(jì)算log4j特征碼,命令如下:

$: ./owl md5 --path=/Users/ding/Downloads/log4j-1.2.17.jar

注意這里的特征碼計(jì)算必須使用owl程序的算法,因?yàn)?code>owl里面的算法針對(duì)大文件我是采用分?jǐn)?shù)據(jù)塊方案計(jì)算的,提升程序運(yùn)行速度,所以如果使用其他軟件的算法那么就會(huì)出現(xiàn)問題!

結(jié)果如下:

如何使用Go構(gòu)建一款靜態(tài)分析工具

你也可以使用十六進(jìn)制字符串特征去查找:

$: ./owl hex --path=/Users/ding/Downloads/log4j-1.2.17.jar

程序會(huì)將對(duì)應(yīng)的文件轉(zhuǎn)成十六進(jìn)制字符串展示,如下圖:

如何使用Go構(gòu)建一款靜態(tài)分析工具

現(xiàn)在就可以使用掃描器進(jìn)行掃描了,匹配模式可以指定為md5或者hex,未來可能會(huì)添加跟多的模式,命令如下:

$: ./owl run --dir=/Users/ding/Downloads/ --mode=md5 --code=04a41f0a068986f0f73485cf507c0f40

搜索得到具體依賴文件:

如何使用Go構(gòu)建一款靜態(tài)分析工具

搜索結(jié)果如果過多,可以通過--out參數(shù)將結(jié)果重定向保存到文件中保存,文件格式為json!

SDK方式

上面介紹完是command line方式進(jìn)行的,owl程序本身就是一個(gè)command line,核心邏輯在 github.com/auula/owl/scan 這個(gè)包中編寫的,如果想二次開發(fā),那么就可以直接使用go get github.com/auula/owl 安裝這個(gè)模塊到你項(xiàng)目里面,然后直接通過硬編碼的方式進(jìn)行自定義編程;

一個(gè)簡單實(shí)例,通過自定義代碼方式進(jìn)行依賴文件掃描和收集:

package main
import (
    "fmt"
    "github.com/auula/owl/scan"
)
func main() {
    // 創(chuàng)建掃描器
    scanner := new(scan.Scanner)
    // 設(shè)置掃描器路徑     
    scanner.SetPath("github.com/auula/owl") 
    // 返回對(duì)應(yīng)路徑所有文件特征碼
    res, _ := scanner.List() 
    fmt.Println(res)
    // 設(shè)置指定的匹配器,其他匹配器查看API文檔
    scanner.SetMatcher(new(scan.Md5Matcher))
    // 搜索包含特征碼文件,返回文件記錄集合
    res, _ = scanner.Search("xxxx")
    // 打開一個(gè)文件描述符
    file, _ := os.OpenFile("res.json", os.O_CREATE|os.O_RDWR|os.O_TRUNC, 0666)
    // 將結(jié)果保存到指定文件中
    scanner.Output(file, res)
}

以上就是“如何使用Go構(gòu)建一款靜態(tài)分析工具”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會(huì)為大家更新不同的知識(shí),如果還想學(xué)習(xí)更多的知識(shí),請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

go
AI