TLSH는 퍼지 매칭 라이브러리입니다. 최소 길이가 50바이트인 바이트 스트림이 주어지면 TLSH는 유사성 비교에 사용할 수 있는 해시 값을 생성합니다. 유사한 객체는 유사한 해시 값을 가지므로 해시 값을 비교하여 유사한 객체를 감지할 수 있습니다. 바이트 스트림은 충분히 복잡해야 합니다. 예를 들어, 동일한 바이트의 바이트 스트림은 해시 값을 생성하지 않습니다.
2024년 8월 10일
릴리스 버전 4.10.x - Python 클러스터링 도구.
4.12.0을 릴리스 버전으로 만들고 4.12.0에서 py-tlsh Python 라이브러리를 빌드하려고 합니다. 4.12.0에는 다음이 포함됩니다: 병합 풀 요청 #137 - 이로 인해 py-tlsh 병합 풀 요청 #134의 메모리 누수가 해결되었습니다. - 이로 인해 ifdef WINDOWS가 더 이식 가능해졌습니다. 4.12.1에는 다음이 포함됩니다: 병합 풀 요청 #146 - 경고를 피하기 위해 sprintf()에 대한 호출 제거 병합 풀 요청 #141 - py_ext: PyObject_HEAD_INIT 대신 PyVarObject_HEAD 사용 병합 풀 요청 #138 - 빌드: "기본" 병합 풀 요청에만 기본 옵션 정의 #136 - 버그 수정+이식성: 적분 분할로 이식성 향상
2020
다이제스트 시작 부분에 버전 식별자("T1")를 추가했습니다. T1 헤더가 있는 TLSH 버전을 사용하십시오. 코드는 이전 버전과 호환되며 여전히 70개의 16진수 문자열을 TLSH 다이제스트로 읽고 해석할 수 있습니다. 그리고 데이터 세트에는 이전 다이제스트와 새 다이제스트가 혼합되어 포함될 수 있습니다. 이전 스타일의 TLSH 다이제스트를 출력해야 하는 경우 명령줄 옵션 '-old'를 사용하세요.
겸손하고 재능 있는 엔지니어였던 Chun Cheng에게 감사드립니다.
기본 모드의 프로그램에는 최소 길이가 50바이트(및 최소 임의성 - 아래 Python 확장의 참고 사항 참조)인 입력 바이트 스트림이 필요합니다.
이전 버전과의 일관성을 위해 256바이트 제한을 적용하는 -conservative 옵션이 있습니다. TLSH 버전 3.17.0에 대한 참고 사항을 참조하세요.
계산된 해시는 35바이트의 데이터입니다('T1' 뒤에 70개의 16진수 문자가 출력됩니다. 총 길이는 72자입니다). 해시의 버전 번호로 'T1'이 추가되었습니다. 이를 통해 알고리즘을 적용하고 이전 버전과의 호환성을 계속 유지할 수 있습니다. 이전 스타일의 70진수 해시를 얻으려면 -old 명령줄 옵션을 사용하세요.
바이트 3,4,5는 파일 전체에 대한 정보(길이, ...)를 캡처하는 데 사용되는 반면, 마지막 32바이트는 파일의 증분 부분에 대한 정보를 캡처하는 데 사용됩니다. (아래 CMakeLists.txt에 설명된 빌드 매개변수를 변경하여 해시 길이를 늘릴 수 있습니다. 이렇게 하면 해시에 저장된 정보가 늘어납니다. 일부 애플리케이션의 경우 파일 간의 유사성을 예측하는 정확도가 높아질 수 있습니다.)
TLSH(아래 참조)를 빌드하면 lib
디렉터리에 정적 라이브러리와 tlsh
실행 파일( tlsh_unittest
에 대한 심볼릭 링크)이 생성됩니다. 'tlsh'는 bin
디렉터리의 정적 라이브러리에 대한 링크입니다. 라이브러리에는 지정된 파일에서 해시 값을 생성하고 두 해시 값 간의 유사성을 계산하는 기능이 있습니다.
tlsh
TLSH 해시 값을 생성하고 TLSH 해시 값을 비교하여 유사성을 결정하는 유틸리티입니다. 자세한 사용법을 보려면 매개변수 없이 실행하세요.
js_ext
디렉토리에서 사용 가능한 JavaScript 포트입니다.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
참고: Linux에서 TLSH를 빌드하는 것은 cmake
에 따라 Makefile
생성한 다음 프로젝트를 make
때문에 cmake
가 설치되지 않으면 빌드가 실패합니다. CentOs 또는 Amazon Linux에 cmake/gcc 컴파일러를 설치하려면: $ sudo yum install cmake $ sudo yum install gcc-c++
2020년 3월에 추가되었습니다. README.mingw의 지침을 참조하세요.
Windows 디렉터리 아래의 버전별 tlsh 솔루션 파일(tlsh.VC2005.sln, tlsh.VC2008.sln, ...)을 사용합니다.
tlsh 라이브러리 인터페이스는 tlsh.h를 참조하고, 예제 코드는 test
디렉터리 아래의 tlsh_unittest.cpp 및 simple_unittest.cpp를 참조하세요.
우리는 최근 PyPi에서 Python 패키지를 만들었습니다: https://pypi.org/project/py-tlsh/
py-tlsh는 python-tlsh 패키지를 대체합니다. 자세한 내용은 94호를 참조하세요.
이 패키지를 설치하려면
$ pip install py-tlsh
자신만의 Python 패키지를 빌드해야 하는 경우 Python 버전에 대한 참고 사항이 포함된 README.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(0) 바이트가 포함될 수 있기 때문입니다.
기본 모드에서 데이터는 해시 값을 생성하기 위해 최소 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 ))
256바이트보다 작으므로 TNULL을 생성합니다.
이전 스타일 해시("T1" 접두사 제외)를 생성해야 하는 경우 다음을 사용하세요.
tlsh . oldhash ( os . urandom ( 100 ))
기존 옵션과 보수적 옵션을 결합할 수 있습니다.
tlsh . oldconservativehash ( os . urandom ( 500 ))
TLSH 유사성은 차이 점수로 표현됩니다.
4.12.1
2024년 8월 10일 병합 풀 요청 #146 - 경고를 방지하려면 sprintf() 호출을 제거하세요. 병합 풀 요청 #141 - py_ext: PyObject_HEAD_INIT 대신 PyVarObject_HEAD를 사용합니다. 병합 풀 요청 #138 - 빌드: "default"에만 기본 옵션을 정의하세요. 병합 풀 요청 #136 - 버그 수정+이식성: 적분 분할로 이식성 향상
Change_History.md를 참조하세요.