TLSH é uma biblioteca de correspondência difusa. Dado um fluxo de bytes com comprimento mínimo de 50 bytes, o TLSH gera um valor hash que pode ser usado para comparações de similaridade. Objetos semelhantes terão valores de hash semelhantes, o que permite a detecção de objetos semelhantes comparando seus valores de hash. Observe que o fluxo de bytes deve ter uma complexidade suficiente. Por exemplo, um fluxo de bytes idênticos não gerará um valor hash.
10/08/2024
Versão de lançamento 4.10.x - uma ferramenta de clustering Python.
Vou tentar tornar 4.12.0 uma versão de lançamento e construir uma biblioteca Python py-tlsh a partir de 4.12.0 4.12.0 inclui: Merge pull request #137 - isso corrigiu um vazamento de memória em py-tlsh Merge pull request #134 - isso melhorou o ifdef WINDOWS para ser mais portátil 4.12.1 inclui: Merge pull request #146 - Remova a chamada para sprintf() para evitar avisos Merge pull request #141 - py_ext: use PyVarObject_HEAD em vez de PyObject_HEAD_INIT Merge pull request #138 - Build: Defina opções padrão apenas no "default" Merge pull request #136 - Bug Fix+Portabilidade: Melhore a portabilidade por divisão integral
2020
Adicionamos um identificador de versão ("T1") ao início do resumo. Use versões do TLSH que tenham o cabeçalho T1. O código é compatível com versões anteriores e ainda pode ler e interpretar cadeias de caracteres hexadecimais de 70 como resumos do TLSH. E os conjuntos de dados podem incluir combinações dos resumos antigos e novos. Se você precisar que resumos TLSH de estilo antigo sejam gerados, use a opção de linha de comando '-old'
Obrigado a Chun Cheng, que era um engenheiro humilde e talentoso.
O programa no modo padrão requer um fluxo de bytes de entrada com comprimento mínimo de 50 bytes (e uma quantidade mínima de aleatoriedade - veja a nota na extensão Python abaixo).
Para consistência com versões mais antigas, existe uma opção -conservative que impõe um limite de 256 bytes. Veja as notas para a versão 3.17.0 do TLSH
O hash calculado tem 35 bytes de dados (saída como 'T1' seguido de 70 caracteres hexadecimais. Comprimento total de 72 caracteres). O 'T1' foi adicionado como um número de versão para o hash - para que possamos adaptar o algoritmo e ainda manter a compatibilidade com versões anteriores. Para obter os hashes hexadecimais de 70 estilo antigo, use a opção de linha de comando -old.
Os bytes 3,4,5 são usados para capturar as informações sobre o arquivo como um todo (comprimento, ...), enquanto os últimos 32 bytes são usados para capturar informações sobre partes incrementais do arquivo. (Observe que o comprimento do hash pode ser aumentado alterando os parâmetros de construção descritos abaixo em CMakeLists.txt, o que aumentará as informações armazenadas no hash. Para alguns aplicativos, isso pode aumentar a precisão na previsão de semelhanças entre arquivos.)
Construir o TLSH (veja abaixo) criará uma biblioteca estática no diretório lib
e o executável tlsh
(um link simbólico para tlsh_unittest
). 'tlsh' vincula-se à biblioteca estática, no diretório bin
. A biblioteca possui funcionalidade para gerar o valor hash de um determinado arquivo e calcular a semelhança entre dois valores hash.
tlsh
é um utilitário para gerar valores de hash TLSH e comparar valores de hash TLSH para determinar a similaridade. Execute-o sem parâmetros para uso detalhado.
js_ext
.java
. Listamos essas portas apenas para referência. Não verificamos o código nesses repositórios e não verificamos se os resultados são idênticos ao TLSH aqui. Também solicitamos que todas as portas incluam os arquivos LICENSE e NOTICE.txt exatamente como aparecem neste repositório.
Baixe o TLSH da seguinte maneira:
wget https://github.com/trendmicro/tlsh/archive/master.zip -O master.zip
unzip master.zip
cd tlsh-master
ou
git clone git://github.com/trendmicro/tlsh.git
cd tlsh
git checkout master
Edite CMakeLists.txt para construir TLSH com opções diferentes.
Executar:
make.sh
Nota: A construção do TLSH no Linux depende do cmake
para criar o Makefile
e então make
o projeto, portanto a construção falhará se cmake
não estiver instalado. Para instalar o compilador cmake/gcc no CentOs ou Amazon Linux: $ sudo yum install cmake $ sudo yum install gcc-c++
Adicionado em março de 2020. Consulte as instruções em README.mingw
Use os arquivos de solução tlsh específicos da versão (tlsh.VC2005.sln, tlsh.VC2008.sln, ...) no diretório do Windows.
Consulte tlsh.h para a interface da biblioteca tlsh e tlsh_unittest.cpp e simple_unittest.cpp no diretório test
para obter código de exemplo.
Recentemente criamos um pacote Python no PyPi: https://pypi.org/project/py-tlsh/
O py-tlsh substitui o pacote python-tlsh. Para obter detalhes, consulte a edição 94
Para instalar este pacote
$ pip install py-tlsh
Se você precisar construir seu próprio pacote Python, existe um README.python com notas sobre a versão 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 )
Observe que os dados precisam ser bytes - não uma string. Isso ocorre porque TLSH é para dados binários e os dados binários podem conter um byte NULL (zero).
No modo padrão, os dados devem conter pelo menos 50 bytes para gerar um valor hash e devem ter uma certa aleatoriedade. Para obter o valor hash de um arquivo, tente
tlsh . hash ( open ( file , 'rb' ). read ())
Nota: a instrução open abriu o arquivo em modo binário.
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 )
A função diffxlen
remove o componente de comprimento do arquivo do cabeçalho tlsh da comparação.
tlsh . diffxlen ( h1 , h2 )
Se um arquivo com um padrão repetido for comparado a um arquivo com apenas uma única instância do padrão, a diferença aumentará se o comprimento do arquivo for incluído. Mas ao usar a função diffxlen
, o comprimento do arquivo será removido da consideração.
Se você usar a opção "conservadora", os dados deverão conter pelo menos 256 caracteres. Por exemplo,
import os
tlsh . conservativehash ( os . urandom ( 256 ))
deve gerar um hash, mas
tlsh . conservativehash ( os . urandom ( 100 ))
irá gerar TNULL, pois tem menos de 256 bytes.
Se você precisar gerar hashes de estilo antigo (sem o prefixo "T1"), use
tlsh . oldhash ( os . urandom ( 100 ))
As opções antigas e conservadoras podem ser combinadas:
tlsh . oldconservativehash ( os . urandom ( 500 ))
A similaridade do TLSH é expressa como uma pontuação de diferença:
4.12.1
10/08/2024 Merge pull request #146 - Remova a chamada para sprintf() para evitar avisos Mesclar solicitação pull nº 141 - py_ext: use PyVarObject_HEAD em vez de PyObject_HEAD_INIT Merge pull request #138 - Build: Defina opções padrão apenas em "default" Mesclar solicitação pull nº 136 - Correção de bug + Portabilidade: Melhore a portabilidade por divisão integral
veja Change_History.md