TLSH 是一个模糊匹配库。给定最小长度为 50 字节的字节流,TLSH 生成可用于相似性比较的哈希值。相似的对象将具有相似的哈希值,这允许通过比较它们的哈希值来检测相似的对象。 请注意,字节流应具有足够的复杂性。 例如,相同字节的字节流不会生成哈希值。
2024年8月10日
发布版本 4.10.x - Python 集群工具。
请参阅目录 tlshCluster。
我将尝试使 4.12.0 成为发布版本,并从 4.12.0 构建 py-tlsh Python 库 4.12.0 包括: Merge pull request #137 - 这修复了 py-tlsh Merge pull request #134 中的内存泄漏- 这改进了 ifdef WINDOWS 使其更加可移植 4.12.1 包括:合并拉取请求 #146 - 删除对 sprintf() 的调用以避免警告合并拉取请求 #141 - py_ext:使用 PyVarObject_HEAD 而不是 PyObject_HEAD_INIT 合并拉取请求 #138 - 构建:仅在“默认”上定义默认选项 合并拉取请求 #136 - 错误修复+可移植性:通过积分除法提高可移植性
2020年
被 Virus Total 采用
被恶意软件集市采用
我们在摘要的开头添加了版本标识符(“T1”)。请使用具有 T1 标头的 TLSH 版本。代码向后兼容,它仍然可以读取和解释 70 个十六进制字符串作为 TLSH 摘要。数据集可以包括新旧摘要的混合。如果您需要输出旧式 TLSH 摘要,请使用命令行选项“-old”
感谢程春,他是一位谦虚而有才华的工程师。
默认模式下的程序需要一个最小长度为 50 个字节的输入字节流(以及最小的随机性 - 请参阅下面的 Python 扩展中的注释)。
为了与旧版本保持一致,有一个 -conservative 选项强制执行 256 字节限制。请参阅 TLSH 版本 3.17.0 的注释
计算出的哈希值是 35 个字节的数据(输出为“T1”,后跟 70 个十六进制字符。总长度为 72 个字符)。 “T1”已被添加为哈希的版本号 - 以便我们可以调整算法并仍然保持向后兼容性。要获取旧式 70 十六进制哈希值,请使用 -old 命令行选项。
字节 3、4、5 用于捕获有关整个文件的信息(长度等),而最后 32 个字节用于捕获有关文件增量部分的信息。 (请注意,可以通过更改 CMakeLists.txt 中描述的构建参数来增加哈希的长度,这将增加哈希中存储的信息。对于某些应用程序,这可能会提高预测文件之间相似性的准确性。)
构建 TLSH(见下文)将在lib
目录中创建一个静态库,以及tlsh
可执行文件(到tlsh_unittest
符号链接)。 “tlsh”链接到bin
目录中的静态库。该库具有从给定文件生成哈希值并计算两个哈希值之间的相似性的功能。
tlsh
是一个实用程序,用于生成 TLSH 哈希值并比较 TLSH 哈希值以确定相似性。 不加任何参数运行即可查看详细使用方法。
js_ext
目录中提供了 JavaScript 端口。
java
目录中提供了 Java 端口。
我们列出这些端口仅供参考。我们尚未检查这些存储库中的代码,也未检查结果是否与此处的 TLSH 相同。我们还要求所有端口都包含文件 LICENSE 和 NOTICE.txt,与此存储库中的显示完全相同。
此处提供了另一个 Java 端口。
此处提供了另一个 Java 端口。
此处提供 Golang 端口。
此处提供 Ruby 端口
下载TLSH如下:
wget https://github.com/trendmicro/tlsh/archive/master.zip -O master.zip unzip master.zip cd tlsh-master
或者
git clone git://github.com/trendmicro/tlsh.git cd tlsh git checkout master
编辑 CMakeLists.txt 以使用不同选项构建 TLSH。
TLSH_BUCKETS:确定使用 128 或 256 个存储桶 使用默认的 128 个存储桶,除非您是专家并且知道需要 256 个存储桶
TLSH_CHECKSUM_1B:确定校验和长度,较长意味着冲突较少,使用默认的 1 字节,除非您是专家并且知道需要更大的校验和
执行:
make.sh
注意:在Linux上构建TLSH需要cmake
创建Makefile
然后make
项目,因此如果不安装cmake
,构建将会失败。要在 CentOs 或 Amazon Linux 上安装 cmake/gcc 编译器: $ sudo yum install cmake $ sudo yum install gcc-c++
2020 年 3 月添加。请参阅 README.mingw 中的说明
使用 Windows 目录下特定于版本的 tlsh 解决方案文件(tlsh.VC2005.sln、tlsh.VC2008.sln...)。
tlsh 库接口见 tlsh.h,示例代码见test
目录下的 tlsh_unittest.cpp 和 simple_unittest.cpp。
我们最近在 PyPi 上创建了一个 Python 包:https://pypi.org/project/py-tlsh/
py-tlsh 替换了 python-tlsh 包。详情见第94期
安装此软件包
$ pip install py-tlsh
如果您需要构建自己的 Python 包,那么有一个 README.python ,其中包含有关 python 版本的注释
(1) compile the C++ code $./make.sh (2) build the python version $ cd py_ext/ $ python ./setup.py build (3) install - possibly - sudo, run as root or administrator $ python ./setup.py install (4) test it $ cd ../Testing $ ./python_test.sh
导入 tlshtlsh.hash(数据)
注意数据必须是字节 - 而不是字符串。这是因为 TLSH 适用于二进制数据,并且二进制数据可以包含 NULL(零)字节。
在默认模式下,数据必须包含至少 50 个字节才能生成哈希值,并且必须具有一定的随机性。要获取文件的哈希值,请尝试
tlsh.hash(打开(文件, 'rb').read())
注意:open语句是以二进制方式打开文件的。
import tlshh1 = tlsh.hash(data)h2 = tlsh.hash(similar_data)score = tlsh.diff(h1, h2)h3 = tlsh.Tlsh()with open('file', 'rb') as f:for buf in iter(lambda: f.read(512), b''):h3.update(buf)h3.final()# 这个断言声明 TLSH 与其自身之间的距离必须为零assert h3.diff(h3) == 0score = h3.diff(h1)
diffxlen
函数从比较中删除 tlsh 标头的文件长度部分。
tlsh.diffxlen(h1, h2)
如果将具有重复模式的文件与仅具有单个模式实例的文件进行比较,则如果包含文件长度,则差异将会增加。但通过使用diffxlen
函数,文件长度将不再考虑。
如果使用“保守”选项,则数据必须至少包含 256 个字符。例如,
导入 ostlsh.conservativehash(os.urandom(256))
应该生成一个哈希值,但是
tlsh.conservativehash(os.urandom(100))
将生成 TNULL,因为它小于 256 字节。
如果您需要生成旧式哈希(不带“T1”前缀),则使用
tlsh.oldhash(os.urandom(100))
旧的和保守的选项可以结合起来:
tlsh.oldconservativehash(os.urandom(500))
为了提高比较准确性,TLSH 跟踪以四分位数计数桶高度分布。四分位数差异越大,差异得分越高。
特别使用 6 个三元组来对 5 字节滑动窗口中的字节进行同等表示,从而产生改进的结果。
Pearson 哈希用于将三元组计数分配到计数桶。
全局相似度得分使具有显着大小差异的对象保持距离。可以禁用全局相似性。它还对具有不同四分位数分布的对象进行距离。
TLSH 可以编译生成 70 或 134 个字符的哈希字符串。为使用 70 个字符的哈希字符串而创建的较长版本不适用于您的应用程序。
TLSH 相似度表示为差异分数:
0 分表示对象几乎相同。
对于 72 个字符的哈希,有一个基于阈值的实验检测率和误报率的详细表格。参见第 5 页的表 II
请参阅 tlshCluster 中的 Python 代码和 Jupyter 笔记本。
我们提供 HAC-T 方法的 Python 代码。我们还提供代码以便用户可以使用DBSCAN。
我们向用户展示如何创建文件树状图,这是显示文件和组之间关系的有用图表。
我们提供了用于对 Malware Bazaar 数据集进行聚类的工具,该数据集包含数十万个样本。
HAC-T方法在HAC-T和安全性相似性快速搜索中描述
Jonathan Oliver、Chun Cheng 和 Yanggui Chen,TLSH - 局部敏感哈希。第四届网络犯罪和可信计算研讨会,悉尼,2013 年 11 月
Jonathan Oliver、Scott Forman 和 Chun Cheng,使用随机化攻击相似性摘要。 ATIS 2014,2014 年 11 月,第 199-210 页
乔纳森·奥利弗、穆克特·阿里和乔赛亚·哈根。 HAC-T 和安全快速搜索相似性 2020 年全层智能系统国际会议 (COINS)。 IEEE,2020。
4.12.1
2024年8月10日 合并拉取请求 #146 - 删除对 sprintf() 的调用以避免警告 合并拉取请求 #141 - py_ext:使用 PyVarObject_HEAD 而不是 PyObject_HEAD_INIT 合并拉取请求 #138 - 构建:仅在“默认”上定义默认选项 合并拉取请求 #136 - Bug 修复+可移植性:通过积分除法提高可移植性
参见 Change_History.md