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.
Siehe das Verzeichnis tlshCluster.
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 beinhaltet: 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
übernommen von Virus Total
übernommen von Malware Bazaar
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 Datenbytes (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.
Ein JavaScript-Port, der im Verzeichnis js_ext
verfügbar ist.
Im 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.
Eine weitere Java-Portierung ist hier verfügbar.
Eine weitere Java-Portierung ist hier verfügbar.
Ein Golang-Port ist hier verfügbar.
Eine Ruby-Portierung ist hier verfügbar
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.
TLSH_BUCKETS: Legt fest, dass bei Verwendung von 128 oder 256 Buckets die standardmäßigen 128 Buckets verwendet werden, es sei denn, Sie sind Experte und wissen, dass Sie 256 Buckets benötigen
TLSH_CHECKSUM_1B: bestimmt die Prüfsummenlänge. Länger bedeutet weniger Kollision. Verwenden Sie den Standardwert von 1 Byte, es sei denn, Sie sind Experte und wissen, dass Sie eine größere Prüfsumme benötigen
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
tlshtlsh.hash(data) importieren
Beachten Sie, dass die Daten Bytes und keine Zeichenfolge sein müssen. 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 Hash-Wert 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 tlshh1 = 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 Die Behauptung besagt, dass der Abstand zwischen einem TLSH und sich selbst Null sein muss. Assert h3.diff(h3) == 0score = 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 ostlsh.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))
Um die Vergleichsgenauigkeit zu verbessern, verfolgt TLSH die Verteilung der Bucket-Höhe in Quartilen. Eine größere Quartildifferenz führt zu einem höheren Differenzwert.
Verwenden Sie speziell 6 Trigramme, um eine gleichmäßige Darstellung der Bytes im 5-Byte-Schiebefenster zu gewährleisten, was zu besseren Ergebnissen führt.
Pearson-Hash wird verwendet, um die Trigramm-Zählungen auf die Zählbereiche zu verteilen.
Die globale Ähnlichkeitsbewertung distanziert Objekte mit signifikanten Größenunterschieden. Die globale Ähnlichkeit kann deaktiviert werden. Außerdem werden Objekte mit unterschiedlichen Quartilverteilungen distanziert.
TLSH kann kompiliert werden, um Hash-Strings mit 70 oder 134 Zeichen zu generieren. Die längere Version wurde erstellt, damit die Verwendung der 70 Zeichen langen Hash-Strings für Ihre Anwendung nicht funktioniert.
Die TLSH-Ähnlichkeit wird als Differenzwert ausgedrückt:
Ein Wert von 0 bedeutet, dass die Objekte nahezu identisch sind.
Für den 72-Zeichen-Hash gibt es eine detaillierte Tabelle mit experimentellen Erkennungsraten und Falsch-Positiv-Raten basierend auf dem Schwellenwert. siehe Tabelle II auf Seite 5
Sehen Sie sich den Python-Code und die Jupyter-Notebooks in tlshCluster an.
Wir stellen Python-Code für die HAC-T-Methode bereit. Wir stellen auch Code bereit, damit Benutzer DBSCAN verwenden können.
Wir zeigen Benutzern, wie sie Dendogramme für Dateien erstellen. Dabei handelt es sich um ein nützliches Diagramm, das die Beziehungen zwischen Dateien und Gruppen zeigt.
Wir stellen Tools zum Clustering des Malware Bazaar-Datensatzes bereit, der einige hunderttausend Beispiele enthält.
Die HAC-T-Methode wird in HAC-T und der schnellen Suche nach Ähnlichkeit in der Sicherheit beschrieben
Jonathan Oliver, Chun Cheng und Yanggui Chen, TLSH – A Locality Sensitive Hash. 4. Workshop zu Cyberkriminalität und vertrauenswürdigem Computing, Sydney, November 2013
Jonathan Oliver, Scott Forman und Chun Cheng nutzen Randomisierung, um Ähnlichkeitsauszüge anzugreifen. ATIS 2014, November 2014, Seiten 199–210
Jonathan Oliver, Muqeet Ali und Josiah Hagen. HAC-T und schnelle Suche nach Ähnlichkeit in der Sicherheit 2020 International Conference on Omni-layer Intelligent Systems (COINS). IEEE, 2020.
4.12.1
10.08.2024 Merge-Pull-Request #146 – Aufruf von sprintf() entfernen, um Warnungen zu vermeiden Merge-Pull-Anfrage Nr. 141 – py_ext: Verwenden Sie PyVarObject_HEAD anstelle von PyObject_HEAD_INIT 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