乐趣区

关于go:使用Go构建一款静态分析工具

介 绍

Owl是一款开源我的项目依赖剖析工具,能够疾速在指定的我的项目目录下查找合乎某些特色的源代码文件或者依赖文件。为何开发了这款工具?例如很多时候咱们我的项目太大,我的项目文件夹下有很多依赖文件,如一个 Java 我的项目引入了 log4j 这个 jar 依赖,在我的项目中某文件存在循环依赖问题。当某个依赖包呈现了破绽时,本工具能疾速扫描我的项目目录下存在的可疑依赖文件,并且给出依赖文件所在的地址,帮忙开发者能疾速进行定位到可疑文件。

主仓地址:https://github.com/Tencent/CodeAnalysis/tools/owl,代码也不多就 1000 行左右,感兴趣读者能够去看看,实现原理上面也介绍了,感觉不错的话你能够给按一个🌟

Owl🦉

A dependency module feature scanning detection tool for static analysis.


原 理

目前版本的性能比较简单,工作原理很简略,工具会对特定目录进行扫描通过内置的特色码算法匹配到特定文件,而后收集与其特色码匹配的文件地址,而后展现进去,也能够重定向到一个固定 json 文件中保留。

Owl相似于杀毒软件一样,和杀毒软件的工作原理差不多,Owl会依据依赖文件的特色码来扫描整个我的项目,和杀毒病毒库工作原理相似。当然如果严格依照杀毒软件那种规范做的话,可能波及一些汇编相干的,目前 owl 性能实现还没有那么简单,前面会版本会退出 codeql 代码剖析引擎,通过 codeql 的数据库来做动态剖析性能加强。

疾速开始

如何应用owl?你能够克隆仓库而后通过如下命令:

git clone github.com:Tencent/CodeAnalysis.git

而后将目录切换到 tools\owl 下,如下:

cd CodeAnalysis/tools/owl

在仓库外部有一个 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.3

 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,工具不错的话记得按一个,另外更强代码剖析工具应用:https://github.com/Tencent/CodeAnalysis

本文已参加「开源摘星打算」,欢送正在浏览的你退出,流动链接:https://github.com/weopenprojects/WeOpen-Star

退出移动版