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.
Consulte o diretório tlshCluster.
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
adotado pelo Virus Total
adotado pelo Malware Bazaar
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 de 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.
Uma porta JavaScript disponível no diretório js_ext
.
Uma porta Java está disponível no diretório 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.
Outra porta Java está disponível aqui.
Outra porta Java está disponível aqui.
Uma porta Golang está disponível aqui.
Uma porta Ruby está disponível aqui
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.
TLSH_BUCKETS: determina o uso de 128 ou 256 buckets, use os 128 buckets padrão, a menos que você seja um especialista e saiba que precisa de 256 buckets
TLSH_CHECKSUM_1B: determina o comprimento da soma de verificação, mais longo significa menos colisão, use o padrão 1 byte, a menos que você seja um especialista e saiba que precisa de uma soma de verificação maior
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
importar tlshtlsh.hash (dados)
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(abrir(arquivo, 'rb').ler())
Nota: a instrução open abriu o arquivo em modo binário.
importar tlshh1 = tlsh.hash(dados)h2 = tlsh.hash(similar_data)score = tlsh.diff(h1, h2)h3 = tlsh.Tlsh()com open('file', 'rb') como f:for buf em iter(lambda: f.read(512), b''):h3.update(buf)h3.final()# esta afirmação está afirmando que o a distância entre um TLSH e ele mesmo deve ser zeroassert h3.diff(h3) == 0score = 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,
importar ostlsh.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))
Para melhorar a precisão da comparação, o TLSH rastreia a distribuição da altura do balde em quartis. Maior diferença de quartil resulta em maior pontuação de diferença.
Use especialmente 6 trigramas para fornecer representação igual dos bytes na janela deslizante de 5 bytes, o que produz melhores resultados.
O hash de Pearson é usado para distribuir as contagens de trigramas para os intervalos de contagem.
A pontuação de similaridade global distancia objetos com diferença de tamanho significativa. A similaridade global pode ser desativada. Também distancia objetos com diferentes distribuições quartis.
O TLSH pode ser compilado para gerar strings hash de 70 ou 134 caracteres. A versão mais longa foi criada para que o uso de strings hash de 70 caracteres não esteja funcionando para seu aplicativo.
A similaridade do TLSH é expressa como uma pontuação de diferença:
Uma pontuação de 0 significa que os objetos são quase idênticos.
Para o hash de 72 caracteres, há uma tabela detalhada de taxas experimentais de detecção e taxas de falsos positivos com base no limite. consulte a Tabela II na página 5
Consulte o código Python e os notebooks Jupyter em tlshCluster.
Fornecemos código Python para o método HAC-T. Também fornecemos código para que os usuários possam usar o DBSCAN.
Mostramos aos usuários como criar dendogramas para arquivos, que são um diagrama útil que mostra relacionamentos entre arquivos e grupos.
Fornecemos ferramentas para agrupar o conjunto de dados do Malware Bazaar, que contém algumas centenas de milhares de amostras.
O método HAC-T é descrito em HAC-T e busca rápida por similaridade em segurança
Jonathan Oliver, Chun Cheng e Yanggui Chen, TLSH - Um hash sensível à localidade. 4º Workshop sobre Crime Cibernético e Computação Confiável, Sydney, novembro de 2013
Jonathan Oliver, Scott Forman e Chun Cheng, usando randomização para atacar resumos de similaridade. ATIS 2014, novembro de 2014, páginas 199-210
Jonathan Oliver, Muqeet Ali e Josiah Hagen. HAC-T e busca rápida por similaridade em segurança 2020 Conferência Internacional sobre Sistemas Inteligentes Omni-layer (COINS). IEEE, 2020.
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