介绍一款运用Go构建一款静态剖析东西,主仓地址:github.com/auula/owl,代码也不多就1000行左右,感兴趣读者能够去看看,完结原理下面也介绍了,觉得不错的话你能够给我按一个

Owl

A dependency module feature scanning detection tool for static analysis.


介 绍

Owl是一款开源项目依靠剖析东西,能够快速在指定的项目目录下查找符合某些特征的源代码文件或者依靠文件。为何开发了这款东西?例如许多时分咱们项目太大,项目文件夹下有许多依靠文件,如一个Java项目引入了log4j这个jar依靠,在项目中某文件存在循环依靠问题。当某个依靠包呈现了漏洞时,本东西能快速扫描项目目录下存在的可疑依靠文件,并且给出依靠文件地点的地址,协助开发者能快速进行定位到可疑文件。

原 理

目前版本的功用比较简单,作业原理很简单,东西会对特定目录进行扫描经过内置的特征码算法匹配到特定文件,然后搜集与其特征码匹配的文件地址,然后展示出来,也能够重定向到一个固定json文件中保存。

使用Go构建一款静态分析工具

Owl类似于杀毒软件相同,和杀毒软件的作业原理差不多,Owl会根据依靠文件的特征码来扫描整个项目,和杀毒病毒库作业原理类似。当然假如严厉依照杀毒软件那种标准做的话,可能涉及一些汇编相关的,目前owl功用完结还没有那么杂乱,后面会版本会参加codeql代码剖析引擎,经过codeql的数据库来做静态剖析功用增强。

快速开端

怎么运用owl?你能够克隆库房然后经过如下指令:

git clone git@github.com: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参数,即可得到协助信息:

使用Go构建一款静态分析工具

例如假如你要查找log4j,你首先要经过owl核算log4j特征码,指令如下:

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

注意这儿的特征码核算有必要运用owl程序的算法,因为owl里边的算法针对大文件我是选用分数据块计划核算的,提升程序运行速度,所以假如运用其他软件的算法那么就会呈现问题!

结果如下:

使用Go构建一款静态分析工具

你也能够运用十六进制字符串特征去查找:

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

程序会将对应的文件转成十六进制字符串展示,如下图:

使用Go构建一款静态分析工具

现在就能够运用扫描器进行扫描了,匹配形式能够指定为md5或者hex,未来可能会增加跟多的形式,指令如下:

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

搜索得到详细依靠文件:

使用Go构建一款静态分析工具

搜索结果假如过多,能够经过--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。