HAL [/hel/] 是一个全面的网表逆向工程与操作框架。
几乎所有现有的网表分析研究都基于所检查网表的图形化表示。 其核心在于,HAL 正好提供了这一点:一个将任意来源(例如 FPGA 或 ASIC)的网表解析为基于图形的网表表示,并提供必要的内置工具用于遍历和分析所包含的门和连线的框架。
我们的愿景是让 HAL 成为硬件逆向工程领域与 IDA 或 Ghidra 等工具地位相当的工具。 我们希望 HAL 能够为研究人员和分析师提供一个共同的基线,从而提高研究成果的可重复性,并抽象掉重复性的基本任务(例如网表解析等)。
HAL 由 马克斯·普朗克安全与隐私研究所 的嵌入式安全组积极开发。 除了多个研究项目外,它还在波鸿鲁尔大学(RUB)的大学课程《硬件逆向工程入门》中使用。
请注意,我们还在一个单独的仓库中提供了一套现代、最先进的基准电路,用于评估网表逆向工程技术。
本仓库包含一组精选插件:
liberty 门库格式的任意门库关于 HAL 功能(从用户角度出发)的综合文档可在我们的 Wiki 中找到。此外,我们还提供完整的 C++ API 和 Python API 文档。
关于如何构建 HAL 的说明,请参阅我们 Wiki 中的专门页面。
安装 HAL 或构建 HAL,然后通过 hal -g 启动 GUI。你可以通过 hal [--help|-h] 列出所有可用选项。
我们在 examples 子目录中包含了一些示例项目。要开始使用示例项目,你需要通过主菜单中的 "Import Project" 导入它,或者将压缩文件拖放到欢迎屏幕的 "OPEN PROJECT" 区域。
这样做会弹出一个窗口,请求一个有写权限的目录,HAL 将在其中创建项目目录并解压缩文件。请不要使用外部工具解压缩,因为会进行适配以使网表和门库在下次打开项目时能够被找到。
如果你想打开自己的 Verlog 或 VHDL 网表,你必须改为运行 "Import Netlist"。这仅在 plugins/gate_libraries/definitions 中存在匹配的门库,或者你手动提供门库时才有效。
有关创建自己的门库和其他有用教程的说明,请查看 wiki。
以下示例代码引用自 fsm 示例。
使用集成的 Python Shell 或 Python 脚本窗口进行交互。两者都提供(有限的)自动补全功能。
让我们列出所有查找表并打印它们的布尔函数:
for gate in netlist.get_gates():
if "LUT" in gate.type.name:
print("{} (id {}, type {})".format(gate.name, gate.id, gate.type.name))
print(" {}-to-{} LUT".format(len(gate.type.input_pins), len(gate.type.output_pins)))
boolean_functions = gate.boolean_functions
for name in boolean_functions:
print(" {}: {}".format(name, boolean_functions[name]))
print("")
对于示例网表 fsm.vhd,将打印:
FSM_sequential_STATE_REG_0_i_3_inst (id 4, type LUT6)
6-to-1 LUT
O: (!I1 & !I2 & I3 & !I4 & I5) | (I0 & !I2) | (I0 & I1) | (I0 & I3) | (I0 & I4) | (I0 & I5)
FSM_sequential_STATE_REG_0_i_2_inst (id 3, type LUT6)
6-to-1 LUT
O: (I2 & I3 & I4 & !I5) | (I1 & !I5) | (I1 & !I4) | (I1 & !I3) | (I0 & I1) | (I1 & I2)
FSM_sequential_STATE_REG_1_i_3_inst (id 6, type LUT6)
6-to-1 LUT
O: (!I1 & I4 & !I5) | (!I1 & !I3 & I4) | (I0 & I4 & !I5) | (I0 & !I3 & I4) | (!I1 & I2 & I4) | (I0 & I2 & I4) | (!I2 & !I5) | (!I2 & !I4) | (!I2 & !I3) | (!I0 & !I4) | (!I0 & !I2) | (!I0 & !I1) | (I1 & !I4) | (I1 & !I2) | (I0 & I1) | (I3 & !I5) | (I3 & !I4) | (!I0 & I3) | (I1 & I3) | (I2 & I3) | (!I4 & I5) | (!I3 & I5) | (!I0 & I5) | (I1 & I5) | (I2 & I5)
FSM_sequential_STATE_REG_1_i_2_inst (id 5, type LUT6)
6-to-1 LUT
O: (!I0 & I1 & !I2 & I3 & I4 & !I5) | (I0 & !I2 & I3 & I4 & I5)
OUTPUT_BUF_0_inst_i_1_inst (id 18, type LUT1)
1-to-1 LUT
O: !I0
OUTPUT_BUF_1_inst_i_1_inst (id 20, type LUT2)
2-to-1 LUT
O: (I0 & !I1) | (!I0 & I1)
欢迎您为 HAL 的开发做出贡献。请随时通过 GitHub 提交新的 Pull Request。
在此之前,请考虑运行静态检查 + clang format。
您也可以在每次提交之前将这些检查安装为 Git 钩子。
要安装 clang-format 钩子,请安装 git-hooks 并运行:
git hooks --install
通过以下命令启动 Docker 构建:
docker-compose run --rm hal-build
git log $(git describe --tags --abbrev=0)..HEAD --pretty=format:"%s" --no-merges
如果您在学术背景下使用 HAL,请使用以下参考文献引用该框架:
@misc{hal,
author = {{Embedded Security Group}},
publisher = {{Max Planck Institute for Security and Privacy}},
title = {{HAL - The Hardware Analyzer}},
year = {2019},
howpublished = {\url{https://github.com/emsec/hal}},
}
也欢迎引用最初的论文。但是,我们注意到 HAL 自论文中描述的原始原型以来已经发生了巨大变化。 因此,我们更倾向于引用上述条目。
@article{2018:Fyrbiak:HAL,
author = {Marc Fyrbiak and Sebastian Wallat and Pawel Swierczynski and Max Hoffmann and Sebastian Hoppach and Matthias Wilhelm and Tobias Weidlich and Russell Tessier and Christof Paar},
title = {{HAL-} The Missing Piece of the Puzzle for Hardware Reverse Engineering, Trojan Detection and Insertion},
journal = {IEEE Transactions on Dependable and Secure Computing},
year = {2018},
publisher = {IEEE},
howpublished = {\url{https://github.com/emsec/hal}}
}
要了解我们着手用 HAL 解决的挑战概述,请随时观看我们在 36C3 上的演讲。
HAL 采用 MIT 许可证,以鼓励与其他研究团队的合作以及来自行业的贡献。请参阅许可证文件以获取更多信息。
HAL 至多是 alpha 质量软件。 使用风险自负。 我们不鼓励任何恶意使用我们的工具包。