TLSH 是一个模糊匹配库。给定最小长度为 50 字节的字节流,TLSH 生成可用于相似性比较的哈希值。相似的对象将具有相似的哈希值,这允许通过比较它们的哈希值来检测相似的对象。请注意,字节流应具有足够的复杂性。例如,相同字节的字节流不会生成哈希值。
2024年8月10日
发布版本 4.10.x - Python 集群工具。
我将尝试使 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 - Bug 修复+可移植性:通过积分除法提高可移植性
2020年
我们在摘要的开头添加了版本标识符(“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,与此存储库中的显示完全相同。
下载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。
执行:
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
import tlsh
tlsh . hash ( data )
注意数据必须是字节 - 而不是字符串。这是因为 TLSH 适用于二进制数据,并且二进制数据可以包含 NULL(零)字节。
在默认模式下,数据必须包含至少 50 个字节才能生成哈希值,并且必须具有一定的随机性。要获取文件的哈希值,请尝试
tlsh . hash ( open ( file , 'rb' ). read ())
注意:open语句是以二进制方式打开文件的。
import tlsh
h1 = 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 ()
# this assertion is stating that the distance between a TLSH and itself must be zero
assert h3 . diff ( h3 ) == 0
score = h3 . diff ( h1 )
diffxlen
函数从比较中删除 tlsh 标头的文件长度部分。
tlsh . diffxlen ( h1 , h2 )
如果将具有重复模式的文件与仅具有单个模式实例的文件进行比较,则如果包含文件长度,差异将会增加。但通过使用diffxlen
函数,文件长度将被排除在考虑范围之外。
如果使用“保守”选项,则数据必须至少包含 256 个字符。例如,
import os
tlsh . conservativehash ( os . urandom ( 256 ))
应该生成一个哈希值,但是
tlsh . conservativehash ( os . urandom ( 100 ))
将生成 TNULL,因为它小于 256 字节。
如果您需要生成旧式哈希(不带“T1”前缀),则使用
tlsh . oldhash ( os . urandom ( 100 ))
旧的和保守的选项可以结合起来:
tlsh . oldconservativehash ( os . urandom ( 500 ))
TLSH 相似度表示为差异分数:
4.12.1
2024年8月10日 合并拉取请求 #146 - 删除对 sprintf() 的调用以避免警告 合并拉取请求 #141 - py_ext:使用 PyVarObject_HEAD 而不是 PyObject_HEAD_INIT 合并拉取请求 #138 - 构建:仅在“默认”上定义默认选项 合并拉取请求 #136 - Bug 修复+可移植性:通过积分除法提高可移植性
参见 Change_History.md