TLSH 是一個模糊匹配函式庫。給定最小長度為 50 位元組的位元組流,TLSH 產生可用於相似性比較的雜湊值。相似的物件將具有相似的雜湊值,這允許透過比較它們的雜湊值來檢測相似的物件。請注意,位元組流應具有足夠的複雜性。例如,相同位元組的位元組流不會產生雜湊值。
2024年8月10日
發布版本 4.10.x - Python 叢集工具。
我將嘗試使 4.12.0 成為發布版本,並從 4.12.0 構建 py-tlsh Python 庫 4.12.0 包括: Merge pull request #137 - 這修復了 py-tlsh Merge pull request #134 中的內存洩漏- 這改進了ifdef WINDOWS,使其更加可移植4.12.1 包括: 合併拉取請求#146 - 刪除對sprintf() 的呼叫以避免警告合併拉取請求#141 - py_ext:使用PyVarObject_HEAD 而不是PyObject_HEAD_INIT 合併拉取請求#138 - 建置:僅在「預設」合併拉取請求上定義預設選項#136 - Bug 修復+可移植性:透過積分除法提高可移植性
2020年
我們在摘要的開頭添加了版本標識符(“T1”)。請使用具有 T1 標頭的 TLSH 版本。資料集可以包括新舊摘要的混合。如果您需要輸出舊式 TLSH 摘要,請使用命令列選項“-old”
感謝程春,他是一位謙虛而有才華的工程師。
預設模式下的程式需要一個最小長度為 50 個位元組的輸入位元組流(以及最小的隨機性 - 請參閱下面的 Python 擴充功能中的註解)。
為了與舊版本保持一致,有一個 -conservative 選項強制執行 256 位元組限制。請參閱 TLSH 版本 3.17.0 的註釋
計算出的雜湊值是 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
目錄中提供了 JavaScript 連接埠。java
目錄中提供了 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 月新增。
使用 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 包,那麼有一個 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
2024年8月10日 合併拉取請求 #146 - 刪除對 sprintf() 的呼叫以避免警告 合併拉取請求 #141 - py_ext:使用 PyVarObject_HEAD 而不是 PyObject_HEAD_INIT 合併拉取請求 #138 - 建置:僅在「預設」上定義預設選項 合併拉取請求 #136 - Bug 修復+可移植性:透過積分除法提高可移植性
參見 Change_History.md