
HashDBは、マルウェアで使用されるハッシュアルゴリズムのコミュニティ提供ライブラリです。
HashDBはスタンドアロンのハッシュライブラリとして使用できますが、OALabsが運営するHashDB Lookup Serviceにもデータを提供しています。このサービスにより、アナリストはハッシュをリバースして、ハッシュ化されたAPI名や文字列値を取得できます。
HashDBはクローンして、標準的なPythonモジュールと同じようにリバースエンジニアリングスクリプトで使用できます。以下にサンプルコードを示します。
>>> import hashdb
>>> hashdb.list_algorithms()
['crc32']
>>> hashdb.algorithms.crc32.hash(b'test')
3632233996
OALabsは無料のHashDB Lookup Serviceを運営しており、HashDBライブラリに掲載されている任意のハッシュをハッシュテーブルで照会できます。ハッシュテーブルには、Windows APIの完全なセットと、マルウェアで使用される一般的な文字列が多数含まれています。独自の文字列を追加することもできます!
HashDB Lookup ServiceにはIDA Proプラグインがあり、IDAから直接ハッシュルックアップを自動化できます! クライアントはGitHubこちらからダウンロードできます。
HashDBは、ハッシュライブラリを最新に保つためにコミュニティのサポートに依存しています! 目標は、コントリビューターが最初のコミットからPRまで、新しいハッシュの追加に5分以内しか費やさないことです。この目標を達成するために、以下の合理化されたプロセスを提供しています。
ハッシュアルゴリズムが既に存在しないことを確認してください…馬鹿らしいと思うかもしれませんが、念のため再確認してください。
説明的な名前でブランチを作成します。
ハッシュアルゴリズムの名前を付けた新しいPythonファイルを/algorithmsディレクトリに追加します。アルゴリズムの正式名を使用するようにしてください。固有のアルゴリズムの場合は、そのアルゴリズムが固有であるマルウェアの名前を使用してください。
次のテンプレートを使用して新しいハッシュアルゴリズムをセットアップします。すべてのフィールドは必須で、大文字と小文字が区別されます。
#!/usr/bin/env python
DESCRIPTION = "your hash description here"
# Type can be either 'unsigned_int' (32bit) or 'unsigned_long' (64bit)
TYPE = 'unsigned_int'
# Test must match the exact hash of the string 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
TEST_1 = hash_of_string_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789
def hash(data):
# your hash code here
Pythonスタイルを再確認してください。Python 3.9でFlake8を使用しています。gitリポジトリのルートから、以下のlintコマンドをローカルで試すことができます。
pip install flake8
flake8 ./algorithms --count --select=E9,F63,F7,F82 --show-source --statistics
テストスイートを使用してコードをローカルでテストします。gitリポジトリのルートから、以下のコマンドをローカルで実行します。pytestは直接実行するのではなくモジュールとして実行する必要があることに注意してください。そうしないとテストディレクトリが認識されません。
pip install pytest
python -m pytest
プルリクエストを発行します — 新しいアルゴリズムは自動的にテスト用のキューに入り、成功すればマージされます。
これで完了です! 新しいハッシュがHashDBライブラリで利用できるようになるだけでなく、HashDB Lookup Service用の新しいハッシュテーブルも生成され、すぐにハッシュのリバースを開始できます!
/algorithmsディレクトリ外の変更を含むPRは、自動化されたCIの対象外であり、追加の精査を受けます。
すべてのハッシュは、DESCRIPTIONフィールドに有効な説明が必要です。
すべてのハッシュは、TYPEフィールドにunsigned_intまたはunsigned_longのいずれかの型が必要です。HashDBは現在、符号なし32ビットまたは64ビットのハッシュのみを受け付けています。
すべてのハッシュは、TEST_1フィールドに文字列__ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789__のハッシュが必要です。
すべてのハッシュには、バイト文字列を受け取り、文字列のハッシュを返す関数hash(data)を含める必要があります。
一部のハッシュアルゴリズムは、モジュール名とAPIを個別にハッシュし、それらのハッシュを組み合わせて単一のモジュール+APIハッシュを作成します。この例としては、標準のMetasploit ROR13ハッシュがあります。これらのアルゴリズムは標準のワードリストでは機能せず、モジュール名とAPIの両方を含むカスタムワードリストが必要です。これらに対処するために、一部の単語に対してのみ有効なハッシュを返すカスタムアルゴリズムを許可しています。
カスタムAPIハッシュを追加するには、以下の追加コンポーネントが必要です。
TEST_1フィールドは4294967294 (-1)に設定する必要があります。
ハッシュアルゴリズムは、無効なハッシュすべてに対して値4294967294を返す必要があります。
アルゴリズムに対して有効なサンプルワードを指定した追加のTEST_API_DATA_1フィールドを追加する必要があります。
TEST_API_DATA_1フィールドのハッシュを指定した追加のTEST_API_1フィールドを追加する必要があります。
FLAREチームのshellcode_hashesへの取り組みに大いに敬意を表します。何年も前に、このプロジェクトは迅速かつ簡単なマルウェアハッシュのリバースの基準を打ち立て、今でも非常に有用なツールです。では、なぜそれを複製するのでしょうか?
率直に言って、それはワードリストとアクセシビリティの問題です。現在、マルウェアではあらゆる種類の文字列にハッシュを使用するという劇的な変化が見られます。WindowsのDLLエクスポートをすべてハッシュする従来の方法ではもはや不十分です。私たちは、数百万のレジストリキーと値、ファイル名、プロセス名を継続的に処理できるソリューションを求めていました。そして、静的解析ツールだけでなく自動化ワークフローでも使用できるように、REST APIを介してそのデータを利用できるようにしたいと考えていました。とはいえ、shellcode_hashesがなければ私たちは存在しなかったので、当然の功績は称えられるべきです🙌