使用Go構建一款靜態分析工具Owl詳解
介 紹
Owl
是一款開源項目依賴分析工具,可以快速在指定的項目目錄下查找符合某些特征的源代碼文件或者依賴文件。為何開發瞭這款工具?例如很多時候我們項目太大,項目文件夾下有很多依賴文件,如一個Java
項目引入瞭log4j
這個jar
依賴,在項目中某文件存在循環依賴問題。當某個依賴包出現瞭漏洞時,本工具能快速掃描項目目錄下存在的可疑依賴文件,並且給出依賴文件所在的地址,幫助開發者能快速進行定位到可疑文件。
原 理
目前版本的功能比較簡單,工作原理很簡單,工具會對特定目錄進行掃描通過內置的特征碼算法匹配到特定文件,然後收集與其特征碼匹配的文件地址,然後展示出來,也可以重定向到一個固定json
文件中保存。
Owl
類似於殺毒軟件一樣,和殺毒軟件的工作原理差不多,Owl
會根據依賴文件的特征碼來掃描整個項目,和殺毒病毒庫工作原理類似。當然如果嚴格按照殺毒軟件那種標準做的話,可能涉及一些匯編相關的,目前owl
功能實現還沒有那麼復雜,後面會版本會加入codeql
代碼分析引擎,通過codeql
的數據庫來做靜態分析功能增強。
快速開始
如何使用owl
?你可以克隆倉庫然後通過如下命令:
git clone [email protected]:auula/owl.git
在倉庫內部有一個Makefile
文件可以快速幫助你構建相應平臺的二進制文件,例如:
$: 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
Owl
起因也是為CodeAnalysis
所編寫的特征檢測工具,所以你也可以在:https://github.com/Tencent/CodeAnalysis 這個項目下面的tools
目錄找到已經編譯好的二進制可執行文件,下載對應平臺的二進制文件即可。
如何使用
程序構建完成會得到一個二進制文件,程序名稱為owl
,如下為owl
執行效果,一些子命令參數都已經列出:
$: ./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.
如果不知道子命令如何使用,可以在對應的子命令後面參入--help
參數,即可得到幫助信息:
例如如果你要查找log4j
,你首先要通過owl
計算log4j
特征碼,命令如下:
$: ./owl md5 --path=/Users/ding/Downloads/log4j-1.2.17.jar
註意這裡的特征碼計算必須使用owl
程序的算法,因為owl
裡面的算法針對大文件我是采用分數據塊方案計算的,提升程序運行速度,所以如果使用其他軟件的算法那麼就會出現問題!
結果如下:
你也可以使用十六進制字符串特征去查找:
$: ./owl hex --path=/Users/ding/Downloads/log4j-1.2.17.jar
程序會將對應的文件轉成十六進制字符串展示,如下圖:
現在就可以使用掃描器進行掃描瞭,匹配模式可以指定為md5
或者hex
,未來可能會添加跟多的模式,命令如下:
$: ./owl run --dir=/Users/ding/Downloads/ --mode=md5 --code=04a41f0a068986f0f73485cf507c0f40
搜索得到具體依賴文件:
搜索結果如果過多,可以通過--out
參數將結果重定向保存到文件中保存,文件格式為json
!
SDK方式
上面介紹完是command line
方式進行的,owl
程序本身就是一個command line
,核心邏輯在 github.com/auula/owl/scan 這個包中編寫的,如果想二次開發,那麼就可以直接使用go get github.com/auula/owl
安裝這個模塊到你項目裡面,然後直接通過硬編碼的方式進行自定義編程;
一個簡單實例,通過自定義代碼方式進行依賴文件掃描和收集:
package main import ( "fmt" "github.com/auula/owl/scan" ) func main() { // 創建掃描器 scanner := new(scan.Scanner) // 設置掃描器路徑 scanner.SetPath("github.com/auula/owl") // 返回對應路徑所有文件特征碼 res, _ := scanner.List() fmt.Println(res) // 設置指定的匹配器,其他匹配器查看API文檔 scanner.SetMatcher(new(scan.Md5Matcher)) // 搜索包含特征碼文件,返回文件記錄集合 res, _ = scanner.Search("xxxx") // 打開一個文件描述符 file, _ := os.OpenFile("res.json", os.O_CREATE|os.O_RDWR|os.O_TRUNC, 0666) // 將結果保存到指定文件中 scanner.Output(file, res) }
以上就是通過SDK
方式自定義編碼完成依賴特征檢測。
其他
有問題歡迎提issue
,工具不錯的話記得按一個⭐
,倉庫github.com/auula/owl。
到此這篇關於使用Go構建一款靜態分析工具的文章就介紹到這瞭,更多相關Go靜態分析工具內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- 安裝python依賴包psycopg2來調用postgresql的操作
- 用VScode編寫C++大型項目的方法步驟
- Golang開發Go依賴管理工具dep安裝驗證實現過程
- CMake的簡單應用
- Golang兩行代碼實現發送釘釘機器人消息