TLSH ist eine Fuzzy-Matching-Bibliothek. Bei einem Bytestrom mit einer Mindestlänge von 50 Byte generiert TLSH einen Hashwert, der für Ähnlichkeitsvergleiche verwendet werden kann. Ähnliche Objekte haben ähnliche Hashwerte, was die Erkennung ähnlicher Objekte durch Vergleich ihrer Hashwerte ermöglicht. Beachten Sie, dass der Bytestrom ausreichend komplex sein sollte. Beispielsweise generiert ein Bytestrom identischer Bytes keinen Hashwert.
10.08.2024
Release-Version 4.10.x – ein Python-Clustering-Tool.
Ich werde versuchen, 4.12.0 zu einer Release-Version zu machen und eine Py-TLSH-Python-Bibliothek aus 4.12.0 zu erstellen. 4.12.0 enthält: Merge-Pull-Anfrage Nr. 137 – dies hat ein Speicherleck in Py-TLSH-Merge-Pull-Anfrage Nr. 134 behoben – Dies hat das ifdef WINDOWS verbessert, sodass es portabler ist. 4.12.1 enthält: Merge-Pull-Request #146 – Aufruf von sprintf() entfernen, um dies zu vermeiden Warnungen Merge-Pull-Request Nr. 141 – py_ext: Verwenden Sie PyVarObject_HEAD anstelle von PyObject_HEAD_INIT Merge-Pull-Request Nr. 138 – Build: Definieren Sie Standardoptionen nur für „default“ Merge-Pull-Request Nr. 136 – Fehlerbehebung + Portabilität: Verbessern Sie die Portabilität durch integrale Division
2020
Wir haben am Anfang des Digests eine Versionskennung („T1“) hinzugefügt. Bitte verwenden Sie TLSH-Versionen mit dem T1-Header. Der Code ist abwärtskompatibel und kann weiterhin 70-Hex-Zeichenfolgen als TLSH-Digests lesen und interpretieren. Und Datensätze können Mischungen aus alten und neuen Digests enthalten. Wenn Sie die Ausgabe von TLSH-Digests im alten Stil benötigen, verwenden Sie die Befehlszeilenoption „-old“.
Vielen Dank an Chun Cheng, einen bescheidenen und talentierten Ingenieur.
Das Programm erfordert im Standardmodus einen Eingabebyte-Stream mit einer Mindestlänge von 50 Bytes (und einem Mindestmaß an Zufälligkeit – siehe Hinweis in der Python-Erweiterung unten).
Aus Gründen der Konsistenz mit älteren Versionen gibt es die Option -conservative, die eine Beschränkung auf 256 Byte erzwingt. Siehe Hinweise für Version 3.17.0 von TLSH
Der berechnete Hash besteht aus 35 Byte Daten (Ausgabe als „T1“, gefolgt von 70 hexadezimalen Zeichen. Gesamtlänge 72 Zeichen). Als Versionsnummer für den Hash wurde „T1“ hinzugefügt – damit wir den Algorithmus anpassen und trotzdem die Abwärtskompatibilität wahren können. Um die 70-Hex-Hashes im alten Stil zu erhalten, verwenden Sie die Befehlszeilenoption -old.
Die Bytes 3, 4, 5 werden zum Erfassen der Informationen über die Datei als Ganzes (Länge, ...) verwendet, während die letzten 32 Bytes zum Erfassen von Informationen über inkrementelle Teile der Datei verwendet werden. (Beachten Sie, dass die Länge des Hashs durch Ändern der unten beschriebenen Build-Parameter in CMakeLists.txt erhöht werden kann, wodurch die im Hash gespeicherten Informationen erhöht werden. Bei einigen Anwendungen kann dies die Genauigkeit bei der Vorhersage von Ähnlichkeiten zwischen Dateien erhöhen.)
Beim Erstellen von TLSH (siehe unten) werden eine statische Bibliothek im lib
-Verzeichnis und die ausführbare Datei tlsh
(ein symbolischer Link zu tlsh_unittest
) erstellt. „tlsh“ verweist auf die statische Bibliothek im bin
-Verzeichnis. Die Bibliothek verfügt über Funktionen zum Generieren des Hash-Werts aus einer bestimmten Datei und zum Berechnen der Ähnlichkeit zwischen zwei Hash-Werten.
tlsh
ist ein Dienstprogramm zum Generieren von TLSH-Hash-Werten und zum Vergleichen von TLSH-Hash-Werten, um die Ähnlichkeit festzustellen. Führen Sie es zur detaillierten Verwendung ohne Parameter aus.
js_ext
verfügbar ist.java
Verzeichnis ist ein Java-Port verfügbar. Wir listen diese Ports nur als Referenz auf. Wir haben den Code in diesen Repositorys nicht überprüft und wir haben nicht überprüft, ob die Ergebnisse hier mit TLSH identisch sind. Wir verlangen außerdem, dass alle Ports die Dateien LICENSE und NOTICE.txt genau so enthalten, wie sie in diesem Repository erscheinen.
Laden Sie TLSH wie folgt herunter:
wget https://github.com/trendmicro/tlsh/archive/master.zip -O master.zip
unzip master.zip
cd tlsh-master
oder
git clone git://github.com/trendmicro/tlsh.git
cd tlsh
git checkout master
Bearbeiten Sie CMakeLists.txt, um TLSH mit verschiedenen Optionen zu erstellen.
Ausführen:
make.sh
Hinweis: Das Erstellen von TLSH unter Linux hängt von cmake
ab, um das Makefile
zu erstellen und dann das Projekt make
. Daher schlägt der Build fehl, wenn cmake
nicht installiert ist. So installieren Sie den cmake/gcc-Compiler auf CentOs oder Amazon Linux: $ sudo yum install cmake $ sudo yum install gcc-c++
Hinzugefügt im März 2020. Siehe die Anweisungen in README.mingw
Verwenden Sie die versionenspezifischen tlsh-Lösungsdateien (tlsh.VC2005.sln, tlsh.VC2008.sln, ...) im Windows-Verzeichnis.
Siehe tlsh.h für die tlsh-Bibliotheksschnittstelle und tlsh_unittest.cpp und simple_unittest.cpp im test
für Beispielcode.
Wir haben kürzlich ein Python-Paket auf PyPi erstellt: https://pypi.org/project/py-tlsh/
Das Paket py-tlsh ersetzt das Paket python-tlsh. Einzelheiten siehe Ausgabe 94
Um dieses Paket zu installieren
$ pip install py-tlsh
Wenn Sie Ihr eigenes Python-Paket erstellen müssen, gibt es eine README.python mit Hinweisen zur Python-Version
(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 )
Beachten Sie, dass die Daten Bytes sein müssen, keine Zeichenfolge. Dies liegt daran, dass TLSH für Binärdaten gedacht ist und Binärdaten ein NULL-Byte (Null) enthalten können.
Im Standardmodus müssen die Daten mindestens 50 Bytes enthalten, um einen Hash-Wert zu generieren, und sie müssen ein gewisses Maß an Zufälligkeit aufweisen. Um den Hashwert einer Datei zu erhalten, versuchen Sie es
tlsh . hash ( open ( file , 'rb' ). read ())
Hinweis: Die open-Anweisung hat die Datei im Binärmodus geöffnet.
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 )
Die diffxlen
Funktion entfernt die Dateilängenkomponente des tlsh-Headers aus dem Vergleich.
tlsh . diffxlen ( h1 , h2 )
Wenn eine Datei mit einem sich wiederholenden Muster mit einer Datei mit nur einer einzigen Instanz des Musters verglichen wird, erhöht sich der Unterschied, wenn die Dateilänge einbezogen wird. Durch die Verwendung der diffxlen
-Funktion wird die Dateilänge jedoch nicht berücksichtigt.
Wenn Sie die Option „konservativ“ verwenden, müssen die Daten mindestens 256 Zeichen enthalten. Zum Beispiel,
import os
tlsh . conservativehash ( os . urandom ( 256 ))
sollte einen Hash generieren, aber
tlsh . conservativehash ( os . urandom ( 100 ))
generiert TNULL, da es weniger als 256 Bytes beträgt.
Wenn Sie Hashes im alten Stil (ohne das Präfix „T1“) generieren müssen, verwenden Sie
tlsh . oldhash ( os . urandom ( 100 ))
Die alten und konservativen Optionen können kombiniert werden:
tlsh . oldconservativehash ( os . urandom ( 500 ))
Die TLSH-Ähnlichkeit wird als Differenzwert ausgedrückt:
4.12.1
10.08.2024 Merge-Pull-Request #146 – Aufruf von sprintf() entfernen, um Warnungen zu vermeiden Pull-Anfrage Nr. 141 zusammenführen – py_ext: PyVarObject_HEAD anstelle von PyObject_HEAD_INIT verwenden Merge-Pull-Request #138 – Build: Definieren Sie Standardoptionen nur für „default“ Merge-Pull-Anfrage Nr. 136 – Fehlerbehebung + Portabilität: Verbessern Sie die Portabilität durch integrale Teilung
siehe Change_History.md