文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2023-07-02 08:24

关注

今天小编给大家分享一下如何使用Go构建一款静态分析工具的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

介 绍

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

原 理

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

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

Owl类似于杀毒软件一样,和杀毒软件的工作原理差不多,Owl会根据依赖文件的特征码来扫描整个项目,和杀毒病毒库工作原理类似。当然如果严格按照杀毒软件那种标准做的话,可能涉及一些汇编相关的,目前owl功能实现还没有那么复杂,后面会版本会加入codeql代码分析引擎,通过codeql的数据库来做静态分析功能增强。

快速开始

如何使用owl?你可以克隆仓库然后通过如下命令:

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

在仓库内部有一个Makefile文件可以快速帮助你构建相应平台的二进制文件,例如:

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

如何使用

程序构建完成会得到一个二进制文件,程序名称为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 informationFlags:  -h, --help   help for owlUse "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 mainimport (    "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)}

以上就是“如何使用Go构建一款静态分析工具”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯