trailofbits/vendetect
GitHub: trailofbits/vendetect
一款基于语义指纹的代码相似度检测工具,用于自动识别代码库间复制或 vendored 的代码片段及其来源。
Stars: 74 | Forks: 6
# Vendetect
[](https://github.com/trailofbits/vendetect/actions/workflows/tests.yml)
[](https://pypi.org/project/vendetect)
[](https://repology.org/project/python:vendetect/versions)
一款用于自动检测代码库之间 vendored 和复制/粘贴代码的命令行工具。
## 描述 🧑🎓
Vendetect 帮助识别代码库之间复制或 vendored 的代码,使检测代码是否被复制(无论是否注明出处)变得更加容易。该工具使用相似度检测算法来比较代码文件并突出显示匹配的部分。
主要功能:
- 比较两个代码库(本地或远程)之间的代码
- 分析代码库中的特定子目录
- 识别具有相似代码的文件并并排显示
- 显示匹配代码的相似度百分比
- 按文件类型过滤并调整相似度阈值
- 通过 Pygments lexers 支持不同的编程语言
- 相似度 _不仅仅_ 基于符号名称;vendetect 还会考虑语义
## 安装 🚀
### 使用 pip
```
pip install vendetect
```
### 使用 [uv](https://docs.astral.sh/uv/guides/tools/)
```
uv tool install vendetect
```
### 从源码安装
克隆代码库并安装:
```
git clone https://github.com/trailofbits/vendetect.git
cd vendetect
uv tool install .
```
### 开发环境安装
用于开发并包含所有依赖项:
```
git clone https://github.com/trailofbits/vendetect.git
cd vendetect
uv sync --group dev
source .venv/bin/activate
```
## 使用方法 🏃
### 基本用法
```
vendetect TEST_REPO SOURCE_REPO
```
其中:
- `TEST_REPO`:要检查是否存在复制代码的代码库的路径或 URL
- `SOURCE_REPO`:作为潜在代码来源的代码库的路径或 URL
### 示例
```
# 比较两个本地仓库
vendetect /path/to/my/project /path/to/another/project
# 将本地项目与远程仓库进行比较
vendetect /path/to/my/project https://github.com/example/repo.git
# 仅比较仓库内的特定子目录
vendetect /path/to/my/project https://github.com/example/repo.git \
--test-subdir src/components \
--source-subdir lib/ui
# 按文件类型过滤并调整相似度阈值
vendetect /path/to/my/project /path/to/another/project \
--type py --type js \
--min-similarity 0.8
```
### 选项
```
--format FORMAT Output format: rich, csv, or json (default=rich)
--output OUTPUT Output file path (default: stdout)
--force Force overwrite of existing output file
--type FILE_TYPES, -t File extension to consider (can be used multiple times)
--min-similarity THRESHOLD Minimum similarity threshold (range: 0.0-1.0, default: 0.5)
--test-subdir DIR, -ts Subdirectory within TEST_REPO to analyze
--source-subdir DIR, -ss Subdirectory within SOURCE_REPO to analyze
--incremental Enable incremental result reporting
--batch-size SIZE Number of files to process per batch (default: 100)
--max-history-depth DEPTH Maximum commit history depth (default: -1 = entire history)
--log-level LEVEL Sets the log level (default=INFO)
--debug Equivalent to --log-level=DEBUG
--quiet Equivalent to --log-level=CRITICAL
```
### 高级功能
#### 子目录分析
在处理大型代码库时,您可以将分析重点放在特定的子目录上:
```
# 仅分析两个仓库中的 src/ 目录
vendetect /path/to/my/project /path/to/another/project \
--test-subdir src --source-subdir src
# 比较一个仓库的前端代码与另一个仓库的后端代码
vendetect /path/to/frontend-repo /path/to/backend-repo \
--test-subdir client/src --source-subdir server/utils
```
这对于以下情况特别有用:
- 聚焦于相关的代码部分
- 减少大型代码库的分析时间
- 比较不同项目结构中的相似模块
#### 文件类型过滤
通过指定文件扩展名来控制要分析的文件:
```
# 仅分析 Python 文件
vendetect /path/to/my/project /path/to/another/project --type py
# 分析多种文件类型
vendetect /path/to/my/project /path/to/another/project --type py --type js --type ts
```
#### 相似度阈值
调整最小相似度阈值以过滤结果:
```
# 仅显示高置信度匹配(80% 或更高相似度)
vendetect /path/to/my/project /path/to/another/project --min-similarity 0.8
# 显示所有潜在匹配(较低阈值)
vendetect /path/to/my/project /path/to/another/project --min-similarity 0.3
```
### 输出格式
Vendetect 支持三种输出格式:
1. **rich**(默认):带有语法高亮和并排代码比较的交互式控制台输出
2. **csv**:逗号分隔值格式,包含测试文件、源文件、测试切片起点、测试切片终点、源切片起点、源切片终点和相似度等列
3. **json**:JSON 格式,包含每次检测的详细信息,包括文件路径、相似度分数和匹配的代码切片
使用 CSV 输出的示例:
```
vendetect /path/to/my/project /path/to/another/project --format csv --output results.csv
```
使用 JSON 输出的示例:
```
vendetect /path/to/my/project /path/to/another/project --format json --output results.json
```
## 工作原理 🧐
Vendetect 结合使用多种技术来识别相似代码:
1. 根据语义而非语法,对两个代码库中的所有源代码文件进行指纹识别
2. 对于每对文件,计算相似度得分
3. 识别文件之间匹配的特定代码部分(切片)
4. 结果以富文本输出格式呈现,并带有并排比较
该工具可以处理:
- 本地文件系统代码库
- Git 代码库(支持历史记录)
- 远程 Git 代码库(自动克隆以进行分析)
## 系统要求 🛒
- Python 3.11 或更高版本
- Git(可选,用于代码库历史分析)
## 联系方式 💬
如果您想提交错误报告或功能请求,请使用我们的
[问题页面](https://github.com/trailofbits/deptective/issues)。
如需帮助使用或扩展 Vendetect,请随时联系我们或在
[Empire Hacking](https://slack.empirehacking.nyc/) 中留言。
## 许可证 📝
该工具由 [Trail of Bits](https://www.trailofbits.com/) 开发。
本程序是自由软件:您可以根据
[GNU Affero General Public License](LICENSE)(由自由软件基金会发布)的条款,
即许可证的第 3 版或(您选择的)任何后续版本,
重新分发和/或修改它。
分发本程序是希望它能有用,
但没有任何保证;甚至没有
适销性或特定用途适用性的默示保证。
有关更多详细信息,请参阅
GNU Affero General Public License。
您应该随本程序一起收到一份 GNU Affero General Public License 的副本。
如果没有,请参阅 。
如果您正在寻找条款的例外,请[联系我们](mailto:opensource@trailofbits.com)。
© 2025, Trail of Bits.
标签:IPv6支持, Python, 云安全监控, 代码溯源, 代码相似度分析, 克隆代码检测, 抄袭检测, 无后门, 知识产权保护, 网络安全研究, 逆向工具, 静态分析