TLSH est une bibliothèque de correspondance floue. Étant donné un flux d'octets d'une longueur minimale de 50 octets, TLSH génère une valeur de hachage qui peut être utilisée pour des comparaisons de similarité. Les objets similaires auront des valeurs de hachage similaires, ce qui permet la détection d'objets similaires en comparant leurs valeurs de hachage. Notez que le flux d’octets doit avoir une complexité suffisante. Par exemple, un flux d'octets identiques ne générera pas de valeur de hachage.
08/10/2024
Release version 4.10.x - un outil de clustering Python.
Je vais essayer de faire de 4.12.0 une version release et de créer une bibliothèque Python py-tlsh à partir de 4.12.0. 4.12.0 comprend : Merge pull request #137 - cela a corrigé une fuite de mémoire dans py-tlsh Merge pull request #134. - cela a amélioré ifdef WINDOWS pour qu'il soit plus portable. 4.12.1 inclut : Merge pull request #146 - Supprimez l'appel à sprintf() pour éviter les avertissements Merge pull request #141 - py_ext : utilisez PyVarObject_HEAD au lieu de PyObject_HEAD_INIT Merge pull request #138 - Build : Définir les options par défaut uniquement sur la demande de fusion "par défaut" #136 - Correction de bug + Portabilité : Améliorer la portabilité par division intégrale
2020
Nous avons ajouté un identifiant de version (« T1 ») au début du résumé. Veuillez utiliser les versions de TLSH qui ont l'en-tête T1. Le code est rétrocompatible, il peut toujours lire et interpréter 70 chaînes de caractères hexadécimaux en tant que résumés TLSH. Et les ensembles de données peuvent inclure des mélanges d’anciens et de nouveaux résumés. Si vous avez besoin de générer des résumés TLSH à l'ancienne, utilisez l'option de ligne de commande « -old »
Merci à Chun Cheng, qui était un ingénieur humble et talentueux.
Le programme en mode par défaut nécessite un flux d'octets d'entrée d'une longueur minimale de 50 octets (et un minimum de caractère aléatoire - voir la note dans l'extension Python ci-dessous).
Pour des raisons de cohérence avec les anciennes versions, il existe une option -conservative qui impose une limite de 256 octets. Voir les notes pour la version 3.17.0 de TLSH
Le hachage calculé est de 35 octets de données (sortie sous la forme « T1 » suivi de 70 caractères hexadécimaux. Longueur totale de 72 caractères). Le « T1 » a été ajouté comme numéro de version pour le hachage - afin que nous puissions adapter l'algorithme tout en conservant la compatibilité ascendante. Pour obtenir l’ancien style de hachages hexadécimaux 70, utilisez l’option de ligne de commande -old.
Les octets 3, 4, 5 sont utilisés pour capturer les informations sur le fichier dans son ensemble (longueur, ...), tandis que les 32 derniers octets sont utilisés pour capturer des informations sur les parties incrémentielles du fichier. (Notez que la longueur du hachage peut être augmentée en modifiant les paramètres de construction décrits ci-dessous dans CMakeLists.txt, ce qui augmentera les informations stockées dans le hachage. Pour certaines applications, cela peut augmenter la précision de la prédiction des similitudes entre les fichiers.)
Construire TLSH (voir ci-dessous) créera une bibliothèque statique dans le répertoire lib
et l'exécutable tlsh
(un lien symbolique vers tlsh_unittest
). 'tlsh' renvoie à la bibliothèque statique, dans le répertoire bin
. La bibliothèque dispose de fonctionnalités permettant de générer la valeur de hachage à partir d'un fichier donné et de calculer la similarité entre deux valeurs de hachage.
tlsh
est un utilitaire permettant de générer des valeurs de hachage TLSH et de comparer les valeurs de hachage TLSH pour déterminer la similarité. Exécutez-le sans paramètres pour une utilisation détaillée.
js_ext
.java
. Nous répertorions ces ports juste pour référence. Nous n'avons pas vérifié le code dans ces référentiels, et nous n'avons pas vérifié que les résultats sont identiques à TLSH ici. Nous demandons également que tous les ports incluent les fichiers LICENSE et NOTICE.txt exactement tels qu'ils apparaissent dans ce référentiel.
Téléchargez TLSH comme suit :
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
Modifiez CMakeLists.txt pour créer TLSH avec différentes options.
Exécuter:
make.sh
Remarque : La construction de TLSH sous Linux dépend de cmake
pour créer le Makefile
puis make
le projet, donc la construction échouera si cmake
n'est pas installé. Pour installer le compilateur cmake/gcc sur CentOs ou Amazon Linux : $ sudo yum install cmake $ sudo yum install gcc-c++
Ajouté en mars 2020. Voir les instructions dans README.mingw
Utilisez les fichiers de solution tlsh spécifiques à la version (tlsh.VC2005.sln, tlsh.VC2008.sln, ...) sous le répertoire Windows.
Voir tlsh.h pour l'interface de la bibliothèque tlsh et tlsh_unittest.cpp et simple_unittest.cpp sous le répertoire test
pour un exemple de code.
Nous avons récemment créé un package Python sur PyPi : https://pypi.org/project/py-tlsh/
Le py-tlsh remplace le package python-tlsh. Pour plus de détails, voir le numéro 94
Pour installer ce package
$ pip install py-tlsh
Si vous devez créer votre propre package Python, il existe un fichier README.python avec des notes sur la version 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 )
Notez que les données doivent être des octets et non une chaîne. En effet, TLSH est destiné aux données binaires et les données binaires peuvent contenir un octet NULL (zéro).
En mode par défaut, les données doivent contenir au moins 50 octets pour générer une valeur de hachage et doivent avoir un certain caractère aléatoire. Pour obtenir la valeur de hachage d'un fichier, essayez
tlsh . hash ( open ( file , 'rb' ). read ())
Remarque : l'instruction open a ouvert le fichier en mode binaire.
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 )
La fonction diffxlen
supprime le composant de longueur de fichier de l'en-tête tlsh de la comparaison.
tlsh . diffxlen ( h1 , h2 )
Si un fichier avec un motif répétitif est comparé à un fichier avec une seule instance du motif, la différence sera augmentée si la longueur du fichier est incluse. Mais en utilisant la fonction diffxlen
, la longueur du fichier ne sera plus prise en compte.
Si vous utilisez l'option « conservatrice », les données doivent contenir au moins 256 caractères. Par exemple,
import os
tlsh . conservativehash ( os . urandom ( 256 ))
devrait générer un hachage, mais
tlsh . conservativehash ( os . urandom ( 100 ))
générera TNULL car il fait moins de 256 octets.
Si vous devez générer des hachages à l'ancienne (sans le préfixe "T1"), utilisez
tlsh . oldhash ( os . urandom ( 100 ))
Les options anciennes et conservatrices peuvent être combinées :
tlsh . oldconservativehash ( os . urandom ( 500 ))
La similarité TLSH est exprimée sous forme de score de différence :
4.12.1
08/10/2024 Merge pull request #146 - Supprimez l'appel à sprintf() pour éviter les avertissements Merge pull request #141 - py_ext : utilisez PyVarObject_HEAD au lieu de PyObject_HEAD_INIT Merge pull request #138 - Build : définir les options par défaut uniquement sur "default" Merge pull request #136 - Correction de bug + Portabilité : Améliorer la portabilité par division intégrale
voir Change_History.md