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())  # 以二进制模式打开了文件
文本里完全重复的也计算不出  --->必须具有一定的随机性
TLSH相似度_第1张图片
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(f1_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

你可能感兴趣的:(安全,tlsh,相似度)