TLSH es una biblioteca de coincidencias difusas. Dado un flujo de bytes con una longitud mínima de 50 bytes, TLSH genera un valor hash que puede usarse para comparaciones de similitud. Los objetos similares tendrán valores hash similares, lo que permite la detección de objetos similares comparando sus valores hash. Tenga en cuenta que el flujo de bytes debe tener una complejidad suficiente. Por ejemplo, un flujo de bytes idénticos no generará un valor hash.
10/08/2024
Versión de lanzamiento 4.10.x: una herramienta de agrupación en clústeres de Python.
Voy a intentar hacer de 4.12.0 una versión de lanzamiento y crear una biblioteca Python py-tlsh a partir de 4.12.0. 4.12.0 incluye: Solicitud de extracción de fusión n.º 137: esto solucionó una pérdida de memoria en la solicitud de extracción de fusión py-tlsh n.º 134 - esto mejoró ifdef WINDOWS para que sea más portátil 4.12.1 incluye: Fusionar solicitud de extracción n.º 146 - Eliminar la llamada a sprintf() para evitar advertencias Fusionar solicitud de extracción n.º 141 - py_ext: use PyVarObject_HEAD en lugar de PyObject_HEAD_INIT Fusionar solicitud de extracción n.º 138 - Compilación : Defina opciones predeterminadas solo en la solicitud de extracción de combinación "predeterminada" n.° 136 - Corrección de errores+Portabilidad: Mejore la portabilidad mediante división integral
2020
Hemos agregado un identificador de versión ("T1") al inicio del resumen. Utilice versiones de TLSH que tengan el encabezado T1. El código es compatible con versiones anteriores, aún puede leer e interpretar 70 cadenas de caracteres hexadecimales como resúmenes de TLSH. Y los conjuntos de datos pueden incluir combinaciones de resúmenes nuevos y antiguos. Si necesita que se generen resúmenes TLSH de estilo antiguo, utilice la opción de línea de comando '-old'
Gracias a Chun Cheng, que era un ingeniero humilde y talentoso.
El programa en modo predeterminado requiere un flujo de bytes de entrada con una longitud mínima de 50 bytes (y una cantidad mínima de aleatoriedad; consulte la nota en la extensión de Python a continuación).
Para mantener la coherencia con versiones anteriores, existe una opción conservadora que impone un límite de 256 bytes. Ver notas para la versión 3.17.0 de TLSH
El hash calculado es de 35 bytes de datos (la salida es 'T1' seguida de 70 caracteres hexadecimales. Longitud total 72 caracteres). El 'T1' se ha agregado como número de versión del hash, para que podamos adaptar el algoritmo y seguir manteniendo la compatibilidad con versiones anteriores. Para obtener el estilo antiguo de 70 hashes hexadecimales, utilice la opción de línea de comando -old.
Los bytes 3,4,5 se utilizan para capturar la información sobre el archivo en su totalidad (longitud,...), mientras que los últimos 32 bytes se utilizan para capturar información sobre partes incrementales del archivo. (Tenga en cuenta que la longitud del hash se puede aumentar cambiando los parámetros de compilación que se describen a continuación en CMakeLists.txt, lo que aumentará la información almacenada en el hash. Para algunas aplicaciones, esto podría aumentar la precisión en la predicción de similitudes entre archivos).
La compilación de TLSH (ver más abajo) creará una biblioteca estática en el directorio lib
y el ejecutable tlsh
(un enlace simbólico a tlsh_unittest
). 'tlsh' enlaza a la biblioteca estática, en el directorio bin
. La biblioteca tiene la funcionalidad de generar el valor hash a partir de un archivo determinado y calcular la similitud entre dos valores hash.
tlsh
es una utilidad para generar valores hash TLSH y comparar valores hash TLSH para determinar la similitud. Ejecútelo sin parámetros para un uso detallado.
js_ext
.java
. Enumeramos estos puertos solo como referencia. No hemos verificado el código en estos repositorios y no hemos verificado que los resultados sean idénticos a TLSH aquí. También solicitamos que cualquier puerto incluya los archivos LICENCIA y NOTICE.txt exactamente como aparecen en este repositorio.
Descargue TLSH de la siguiente manera:
wget https://github.com/trendmicro/tlsh/archive/master.zip -O master.zip
unzip master.zip
cd tlsh-master
o
git clone git://github.com/trendmicro/tlsh.git
cd tlsh
git checkout master
Edite CMakeLists.txt para crear TLSH con diferentes opciones.
Ejecutar:
make.sh
Nota: La compilación de TLSH en Linux depende de que cmake
cree el Makefile
y luego make
el proyecto, por lo que la compilación fallará si cmake
no está instalado. Para instalar el compilador cmake/gcc en CentOs o Amazon Linux: $ sudo yum install cmake $ sudo yum install gcc-c++
Agregado en marzo de 2020. Consulte las instrucciones en README.mingw.
Utilice los archivos de solución tlsh específicos de la versión (tlsh.VC2005.sln, tlsh.VC2008.sln, ...) en el directorio de Windows.
Consulte tlsh.h para conocer la interfaz de la biblioteca tlsh y tlsh_unittest.cpp y simple_unittest.cpp en el directorio test
para ver un código de ejemplo.
Recientemente creamos un paquete Python en PyPi: https://pypi.org/project/py-tlsh/
py-tlsh reemplaza el paquete python-tlsh. Para obtener más información, consulte el número 94.
Para instalar este paquete
$ pip install py-tlsh
Si necesita crear su propio paquete de Python, hay un archivo README.python con notas sobre la versión de 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 )
Los datos de nota deben ser bytes, no una cadena. Esto se debe a que TLSH es para datos binarios y los datos binarios pueden contener un byte NULL (cero).
En el modo predeterminado, los datos deben contener al menos 50 bytes para generar un valor hash y deben tener una cierta cantidad de aleatoriedad. Para obtener el valor hash de un archivo, intente
tlsh . hash ( open ( file , 'rb' ). read ())
Nota: la declaración abierta ha abierto el archivo en modo binario.
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 función diffxlen
elimina de la comparación el componente de longitud del archivo del encabezado tlsh.
tlsh . diffxlen ( h1 , h2 )
Si se compara un archivo con un patrón repetido con un archivo con una sola instancia del patrón, la diferencia aumentará si se incluye la longitud del archivo. Pero al utilizar la función diffxlen
, la longitud del archivo no se tendrá en cuenta.
Si utiliza la opción "conservadora", los datos deben contener al menos 256 caracteres. Por ejemplo,
import os
tlsh . conservativehash ( os . urandom ( 256 ))
debería generar un hash, pero
tlsh . conservativehash ( os . urandom ( 100 ))
generará TNULL ya que tiene menos de 256 bytes.
Si necesita generar hashes de estilo antiguo (sin el prefijo "T1"), utilice
tlsh . oldhash ( os . urandom ( 100 ))
Las opciones antiguas y conservadoras se pueden combinar:
tlsh . oldconservativehash ( os . urandom ( 500 ))
La similitud de TLSH se expresa como una puntuación de diferencia:
4.12.1
10/08/2024 Fusionar solicitud de extracción n.° 146: eliminar la llamada a sprintf() para evitar advertencias Solicitud de extracción de fusión n.° 141 - py_ext: use PyVarObject_HEAD en lugar de PyObject_HEAD_INIT Solicitud de extracción de fusión n.° 138: compilación: defina las opciones predeterminadas solo en "predeterminado" Solicitud de extracción de fusión n.° 136: corrección de errores + portabilidad: mejorar la portabilidad mediante división integral
ver Change_History.md