TLSH — это библиотека нечеткого сопоставления. Учитывая поток байтов минимальной длиной 50 байт, TLSH генерирует хеш-значение, которое можно использовать для сравнения сходства. Подобные объекты будут иметь схожие хеш-значения, что позволяет обнаруживать похожие объекты путем сравнения их хэш-значений. Обратите внимание, что поток байтов должен иметь достаточную сложность. Например, поток идентичных байтов не будет генерировать хэш-значение.
10.08.2024
Выпуск версии 4.10.x — инструмент кластеризации Python.
Я собираюсь попытаться сделать 4.12.0 выпускной версией и собрать библиотеку Python py-tlsh на основе 4.12.0. 4.12.0 включает в себя: Запрос на слияние № 137 — это исправлено утечку памяти в py-tlsh Запрос на слияние № 134 - это улучшило ifdef WINDOWS, сделав его более переносимым. 4.12.1 включает в себя: Запрос на слияние # 146 - Удалить вызов sprintf(), чтобы избежать предупреждений Запрос на слияние # 141 - py_ext: используйте PyVarObject_HEAD вместо PyObject_HEAD_INIT Запрос на слияние # 138 - Сборка : Определить параметры по умолчанию только для запроса на слияние «по умолчанию» № 136 — Исправление ошибки + переносимость: улучшение переносимости за счет целочисленного деления.
2020 год
Мы добавили идентификатор версии («T1») в начало дайджеста. Пожалуйста, используйте версии TLSH с заголовком T1. Код обратно совместим, он по-прежнему может читать и интерпретировать строки из 70 шестнадцатеричных символов как дайджесты TLSH. Наборы данных могут включать в себя смесь старых и новых дайджестов. Если вам нужны дайджесты TLSH старого стиля для вывода, используйте параметр командной строки «-old».
Спасибо Чун Ченгу, скромному и талантливому инженеру.
Программа в режиме по умолчанию требует входного потока байтов минимальной длиной 50 байт (и минимального количества случайных чисел — см. примечание к расширению Python ниже).
Для обеспечения совместимости со старыми версиями существует опция -conservative, которая устанавливает ограничение в 256 байт. См. примечания к версии 3.17.0 TLSH.
Вычисленный хэш представляет собой 35 байт данных (вывод как «T1», за которым следуют 70 шестнадцатеричных символов. Общая длина 72 символа). «T1» был добавлен в качестве номера версии хэша, чтобы мы могли адаптировать алгоритм и сохранить обратную совместимость. Чтобы получить шестнадцатеричные хеши старого стиля из 70, используйте параметр командной строки -old.
Байты 3,4,5 используются для сбора информации о файле в целом (длина,...), а последние 32 байта используются для сбора информации об дополнительных частях файла. (Обратите внимание, что длину хеша можно увеличить, изменив параметры сборки, описанные ниже в CMakeLists.txt, что увеличит объем информации, хранящейся в хеше. Для некоторых приложений это может повысить точность прогнозирования сходства между файлами.)
Сборка TLSH (см. ниже) создаст статическую библиотеку в каталоге lib
и исполняемый файл tlsh
(символическая ссылка на tlsh_unittest
). «tlsh» ссылается на статическую библиотеку в каталоге bin
. Библиотека имеет функцию генерации хеш-значения из заданного файла и вычисления сходства между двумя хеш-значениями.
tlsh
— это утилита для генерации хеш-значений TLSH и сравнения хэш-значений TLSH для определения сходства. Запустите его без параметров для детального использования.
js_ext
.java
. Мы перечисляем эти порты только для справки. Мы не проверяли код в этих репозиториях и не проверяли, что результаты здесь идентичны TLSH. Мы также просим, чтобы все порты включали файлы LICENSE и NOTICE.txt в том виде, в котором они представлены в этом репозитории.
Загрузите TLSH следующим образом:
wget https://github.com/trendmicro/tlsh/archive/master.zip -O master.zip
unzip master.zip
cd tlsh-master
или
git clone git://github.com/trendmicro/tlsh.git
cd tlsh
git checkout master
Отредактируйте CMakeLists.txt, чтобы создать TLSH с различными параметрами.
Выполнять:
make.sh
Примечание. Сборка TLSH в Linux зависит от того, будет ли cmake
создать Makefile
, а затем make
проект, поэтому сборка завершится неудачно, если cmake
не установлен. Чтобы установить компилятор cmake/gcc на CentO или Amazon Linux: $ sudo yum install cmake $ sudo yum install gcc-c++
Добавлено в марте 2020 г. Инструкции см. в README.mingw.
Используйте файлы решения tlsh для конкретной версии (tlsh.VC2005.sln, tlsh.VC2008.sln, ...) в каталоге Windows.
См. tlsh.h для интерфейса библиотеки tlsh и tlsh_unittest.cpp и simple_unittest.cpp в test
каталоге для примера кода.
Недавно мы создали пакет Python на PyPi: https://pypi.org/project/py-tlsh/.
py-tlsh заменяет пакет python-tlsh. Подробности смотрите в выпуске 94.
Чтобы установить этот пакет
$ pip install py-tlsh
Если вам нужно собрать собственный пакет Python, есть README.python с примечаниями о версии 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 )
Обратите внимание, что данные должны быть байтами, а не строкой. Это связано с тем, что TLSH предназначен для двоичных данных, а двоичные данные могут содержать NULL (нулевой) байт.
В режиме по умолчанию данные должны содержать не менее 50 байтов для генерации хэш-значения и иметь определенную степень случайности. Чтобы получить хеш-значение файла, попробуйте
tlsh . hash ( open ( file , 'rb' ). read ())
Примечание: оператор open открыл файл в двоичном режиме.
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 )
Функция diffxlen
удаляет из сравнения компонент длины файла заголовка tlsh.
tlsh . diffxlen ( h1 , h2 )
Если файл с повторяющимся шаблоном сравнивается с файлом, содержащим только один экземпляр шаблона, то разница будет увеличена, если включить длину файла. Но при использовании функции diffxlen
длина файла будет исключена из рассмотрения.
Если вы используете вариант «консервативный», то данные должны содержать не менее 256 символов. Например,
import os
tlsh . conservativehash ( os . urandom ( 256 ))
должен генерировать хеш, но
tlsh . conservativehash ( os . urandom ( 100 ))
сгенерирует TNULL, поскольку он меньше 256 байт.
Если вам нужно генерировать хеши старого стиля (без префикса «T1»), используйте
tlsh . oldhash ( os . urandom ( 100 ))
Старые и консервативные варианты можно комбинировать:
tlsh . oldconservativehash ( os . urandom ( 500 ))
Сходство TLSH выражается в виде разницы в баллах:
4.12.1
10.08.2024 Запрос на слияние № 146 — удалите вызов sprintf(), чтобы избежать предупреждений. Запрос на слияние № 141 — py_ext: используйте PyVarObject_HEAD вместо PyObject_HEAD_INIT Запрос на слияние № 138 — Сборка: определить параметры по умолчанию только для «по умолчанию». Запрос на слияние № 136 — Исправление ошибок + переносимость: улучшение переносимости за счет интегрального разделения.
см. Change_History.md