TLSH相似度

一、TLSH介绍 

TLSH 是一个模糊匹配库。给定一个最小长度为 50 字节的字节流, TLSH 生成一个哈希值(可以通过更改以下CMakeLists.txt 中描述的构建参数来增加哈希的长度,提高预测文件之间相似性的准确性),可用于相似性比较。
相似的对象将具有相似的散列值,这允许通过比较它们的散列值来检测相似的对象。请注意,字节流应该具有足够的复杂性。例如,相同字节的字节流不会生成哈希值。
构建 TLSH将在lib目录中创建一个静态库和tlsh可执行文件。
'tlsh' 链接到bin目录中的静态库(tlsh.cpython-36m-x86_64-linux-gnu.so。该库具有从给定文件生成散列值以及计算两个散列值之间的相似性的功能。
tlsh是用于生成 TLSH 哈希值和比较 TLSH 哈希值以确定相似性的实用程序
Help on module tlsh:
NAME
    tlsh - TLSH C version - similarity matching and searching
CLASSES
    builtins.object
        Tlsh
    class Tlsh(builtins.object)
     |  TLSH objects
     |
     |  Methods defined here:
     |
     |  __init__(self, /, *args, **kwargs)
     |      Initialize self.  See help(type(self)) for accurate signature.
     |
     |  __new__(*args, **kwargs) from builtins.type
     |      Create and return a new object.  See help(type) for accurate signature.
     |
     |  diff(...)
     |      Returns the TLSH score compared to the given Tlsh object or hexadecimal string.
     |
     |  final(...)
     |      Signal that no more data will be added. This is required before reading the hash.
     |
     |  fromTlshStr(...)
     |      Create a TLSH instance from a hex string.
     |
     |  hexdigest(...)
     |      Get the computed TLSH as a string object containing only hexadecimal digits.
     |
     |  update(...)
     |      Update the TLSH with the given string.
FUNCTIONS
    diff(...)
        tlsh.diff(hash1, hash2)
        returns tlsh score (integer)
    diffxlen(...)
        tlsh.diffxlen(hash1, hash2) - ignore object lengths
        returns tlsh score (integer)
    hash(...)
        tlsh.hash(data)
        returns tlsh hexadecimal representation (string) 十六进制表示
VERSION
    0.2.0
AUTHOR
    Chun Cheng
FILE
    /usr/lib/python3/dist-packages/tlsh.cpython-36m-x86_64-linux-gnu.so

二、安装

2.1、下载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

2.2、建立TLSH

make.sh    # 注意:在 Linux 上构建 TLSH 依赖于 cmake 创建 Makefile 然后 make 项目,因此如果未安装 cmake,构建将失败。

2.3、python中使用TLSH

pip install py-tlsh     # py-tlsh · PyPI

三、使用

import tlsh
tlsh.hash(data)   # 注意数据必须是字节 - 而不是字符串。 这是因为 TLSH 用于二进制数据。
                           # 计算出的散列是 35 个字节的数据(输出为 'T1' 后跟 70 个十六进制字符。总长度为 72 个字符)。'T1' 已被添加为哈希的版本号 - 以便我们可以调整算法并仍然保持向后兼容性。要获取旧式 70 十六进制哈希,请使用 -old 命令行选项。
                          # 字节 3,4,5 用于捕获有关文件整体的信息(长度,...),而最后 32 字节用于捕获有关文件增量部分的信息。(请注意,可以通过更改以下CMakeLists.txt 中描述的构建参数来增加哈希的长度,这将增加存储在哈希中的信息。对于某些应用程序,这可能会提高预测文件之间相似性的准确性。)
                         #
return:D55174E14B8846525638E6C8523A9E6E5A6CEAC30E432A1E150D3D42FA5D01B39D7F13
在默认模式下,数据必须至少包含 50 个字节才能生成哈希值,并且必须具有一定的随机性。 要获取文件的哈希值,请尝试:
tlsh.hash(open(file, 'rb').read())  # 以二进制模式打开了文件
文本里完全重复的也计算不出  --->必须具有一定的随机性
python example:
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()
# 此断言说明 TLSH 与其自身之间的距离必须为零
assert h3.diff(h3) == 0    # 0 分表示对象几乎相同,分值越低相似度越高
score = h3.diff(h1)

四、项目中使用

import tlsh
import pathlib
import base64
from typing import Any, AnyStr, Union, List

def make_bytes(data: Union[AnyStr, List[int]]) -> bytes:
    '''
    Convert `data` into bytes (if necessary).
    :param data: Some sort of data that can be converted to bytes.
    :return: The data as bytes.
    '''
    if isinstance(data, bytes):
        return data
    if isinstance(data, str):
        return data.encode('utf-8')
    return bytes(data)

def get_tlsh(code):
    return tlsh.hash(make_bytes(code))  # 注意数据必须是字节 - 而不是字符串。 这是因为 TLSH 用于二进制数据

def get_tlsh_comparison(first, second):
    return tlsh.diff(first, second)     # 0 分表示对象几乎相同

def get_binary(path):
    file_full_path = pathlib.Path(path)
    file_data = file_full_path.read_bytes()  # 读取文件
    data_binary = bytes.decode(base64.b64encode(file_data))
    return data_binary

 # 2.txt比1.txt文本少几行,3.txt又比2.txt少几行
f1_binary = get_binary('/home/1.txt')
f2_binary = get_binary('/home/2.txt')
f3_binary = get_binary('/home/3.txt')   

value_1_1 = get_tlsh_comparison( get_tlsh(f1_binary), get_tlsh(f1_binary) )
print("value_1_1:%s" % value_1_1)  # 0 分表示对象几乎相同
value_1_2 = get_tlsh_comparison( get_tlsh(f1_binary), get_tlsh(f2_binary) )
print("value_1_2:%s" % value_1_2)  # 15
value_1_3 = get_tlsh_comparison( get_tlsh(f1_binary), get_tlsh(f3_binary) )
print("value_1_3:%s" % value_1_3)  # 51

五、参考

https://github.com/trendmicro/tlsh

py-tlsh · PyPI

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 很抱歉,您似乎没有给我一个完整的问题。这是一个 Python 错误,显示找不到名为 "tlsh" 的模块。这可能是因为您尝试在代码中导入了该模块,但是您的 Python 环境中没有安装它。您可以使用 pip 命令来安装该模块,例如: ``` pip install tlsh ``` 如果您已经安装了该模块,但仍然遇到此错误,则可能是因为您的 Python 环境与该模块不兼容。您可以尝试在另一个 Python 环境或虚拟环境中安装该模块。 ### 回答2: ModuleNotFoundError是一个Python的错误类型,意味着在解释器中找不到所需的模块。在这种情况下,错误信息"ModuleNotFoundError: No module named 'tlsh'"表示找不到名为'tlsh'的模块。 要解决这个错误,你可以按照以下步骤进行: 1. 检查是否已正确安装'tlsh'模块。可以通过使用命令`pip list`在命令行中列出已安装的模块来检查。如果'tlsh'模块不在列表中,说明尚未安装。 2. 如果'tlsh'模块未安装,请通过运行以下命令来安装它:`pip install tlsh`。这将使用pip工具从Python Package Index(PyPI)下载并安装'tlsh'模块。 3. 如果在已安装'tlsh'模块的情况下仍然出现错误,可能是因为Python解释器无法找到模块的位置。你可以尝试执行以下操作: - 检查Python解释器配置,确保它指向正确的Python路径。 - 检查'tlsh'模块是否位于Python解释器已知的模块搜索路径内。可以通过在Python脚本中使用`import sys`和`print(sys.path)`来查看模块搜索路径。 如果上述步骤都没有解决问题,可能涉及到更复杂的环境配置或依赖项问题。在这种情况下,你可能需要查阅相关文档、寻求社区支持或联系模块的开发者以获取帮助。 ### 回答3: 这个错误提示是在Python中遇到的问题。当你尝试导入一个名为"tlsh"的模块时,系统告诉你找不到该模块。 出现这个错误可能有几种原因: 1. 你没有安装tlsh模块:要使用tlsh模块,你需要先在你的Python环境中安装它。你可以使用pip命令来安装,例如在命令行中输入"pip install tlsh"。如果已经安装了tlsh但仍然出现该错误,则可能是因为你使用的Python解释器和默认的pip安装工具不一致。你可以尝试使用 "pip3" 来代替 "pip" 命令。 2. 模块名称拼写错误:请确保你在代码中正确拼写了tlsh模块的名称。大小写也是敏感的,所以确保在导入时使用了正确的大小写。 3. 模块不在Python搜索路径中:如果你已经正确安装了tlsh模块,但仍然出现该错误,可能是因为Python无法找到该模块。你可以检查一下tlsh模块是否位于Python搜索路径中。你可以通过在Python中运行以下代码来查看搜索路径: ``` import sys print(sys.path) ``` 如果tlsh模块不在其中,你可以将其所在的目录添加到搜索路径中。你可以在代码中添加以下语句以将其所在的目录添加到搜索路径中: ``` import sys sys.path.append('/path/to/tlsh/module') ``` 将"/path/to/tlsh/module"替换为tlsh模块所在目录的实际路径。 综上所述,一般情况下,要解决"ModuleNotFoundError: No module named 'tlsh'"错误,你需要安装tlsh模块,并确保正确导入模块的名称和路径。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值