
HashDB 是一个社区驱动的恶意软件哈希算法库。
HashDB 既可以作为独立的哈希库使用,同时也为 OALabs 运营的 HashDB 查找服务 提供数据。该服务允许分析人员反查哈希,并获取被哈希的 API 名称和字符串值。
你可以像使用任何标准 Python 模块一样,克隆 HashDB 并在你的逆向工程脚本中使用它。下面是一些示例代码。
>>> import hashdb
>>> hashdb.list_algorithms()
['crc32']
>>> hashdb.algorithms.crc32.hash(b'test')
3632233996
OALabs 运营着一个免费的 HashDB 查找服务,可用于针对 HashDB 库中列出的任何哈希查询哈希表。哈希表中包含了完整的 Windows API 集合,以及许多恶意软件中常用的字符串。你甚至可以添加自己的字符串!
HashDB 查找服务提供了一个 IDA Pro 插件,可以直接在 IDA 中自动化哈希查找! 客户端可从 GitHub 此处 下载。
HashDB 依靠社区支持来让我们的哈希库保持最新!我们的目标是让贡献者从首次提交到发出 PR,添加一个新哈希所花时间不超过五分钟。为实现这一目标,我们提供了以下简化流程。
确保该哈希算法尚不存在……我们知道这看起来有点傻,但请再确认一下。
创建一个具有描述性名称的分支。
在 /algorithms 目录中添加一个新的 Python 文件,以你的哈希算法命名。尽量使用算法的官方名称;如果该算法是独有的,则使用与之对应的恶意软件名称。
使用以下模板来设置你的新哈希算法。所有字段均为必填项且区分大小写。
#!/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
提交一个 pull request——你的新算法将自动进入测试队列,如果测试通过,它将被合并。
就这么简单!你的新哈希不仅会加入 HashDB 库,而且还会为 HashDB 查找服务 生成一张新的哈希表,你可以立即开始反查哈希!
对 /algorithms 目录之外进行更改的 PR 不属于我们自动化 CI 的一部分,将受到额外的审查。
所有哈希都必须在 DESCRIPTION 字段中包含有效的描述。
所有哈希都必须在 TYPE 字段中包含 unsigned_int 或 unsigned_long 类型。HashDB 目前只接受无符号 32 位或 64 位哈希。
所有哈希都必须在 TEST_1 字段中包含字符串 ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 的哈希值。
所有哈希都必须包含一个函数 hash(data),该函数接受一个字节字符串并返回该字符串的哈希值。
某些哈希算法会分别对模块名称和 API 进行哈希处理,然后将哈希值组合起来,生成一个单独的 module+API 哈希。一个典型的例子是标准的 Metasploit ROR13 哈希。这些算法无法与标准词表配合使用,需要包含模块名称和 API 的自定义词表。为了处理这些情况,我们允许自定义算法只对某些词汇返回有效的哈希值。
添加自定义 API 哈希需要以下额外组件。
TEST_1 字段必须设置为 4294967294 (-1)。
哈希算法必须对所有无效哈希返回 4294967294。
必须添加一个额外的 TEST_API_DATA_1 字段,其中包含对该算法有效的示例词。
必须添加一个额外的 TEST_API_1 字段,其中包含 TEST_API_DATA_1 字段的哈希值。
非常感谢 FLARE 团队在 shellcode_hashes 方面付出的努力。多年前,这个项目为快速简便的恶意软件哈希反查树立了标杆,而且它至今仍是一个极其有用的工具。那么为什么要重复造轮子呢?
坦率地说,这一切都关乎词表和可访问性。如今我们看到一个巨大的转变:恶意软件中各种字符串都开始使用哈希,而旧的将所有 Windows DLL 导出函数进行哈希的方法已经不够用了。我们想要一个能够持续处理数百万个注册表键和值、文件名以及进程名称的解决方案。我们还希望这些数据能够通过 REST API 获取,这样我们不仅可以在静态分析工具中使用,还可以在我们的自动化工作流中使用。话虽如此,如果没有 shellcode_hashes,就不会有我们,所以该给的功劳还是要给 🙌