
HAL [/hel/] est un framework complet de rétro-ingénierie et de manipulation de netlists.
Virtuellement toutes les recherches disponibles sur l'analyse de netlists reposent sur une représentation sous forme de graphe de la netlist inspectée. Au cœur, HAL fournit exactement cela : un framework pour parser des netlists de sources arbitraires, par exemple FPGA ou ASIC, en une représentation de netlist basée sur un graphe, et pour fournir les outils intégrés nécessaires au parcours et à l'analyse des portes et des fils inclus.
Notre vision est que HAL devienne l'équivalent en rétro-ingénierie matérielle d'outils comme IDA ou Ghidra. Nous voulons que HAL permette une base commune aux chercheurs et analystes pour améliorer la reproductibilité des résultats de recherche et abstraire les tâches récurrentes de base telles que le parsing de netlists.
HAL est développé activement par le groupe Embedded Security du Max Planck Institute for Security and Privacy. En plus de multiples projets de recherche, il est également utilisé dans notre cours universitaire "Einführung ins Hardware Reverse Engineering" (Introduction à la rétro-ingénierie matérielle) à l'Université de la Ruhr à Bochum (RUB).
Notez que nous avons également un ensemble de circuits de benchmark modernes et à l'état de l'art pour l'évaluation des techniques de rétro-ingénierie de netlists, disponible dans un dépôt séparé.
Ce dépôt contient une sélection de plugins soigneusement choisis :
libertyUne documentation complète des fonctionnalités de HAL du point de vue de l'utilisateur est disponible dans notre Wiki. De plus, nous fournissons une documentation complète de l'API C++ et de l'API Python.
Pour les instructions de construction de HAL, veuillez vous référer à la page dédiée de notre Wiki.
Installez HAL ou construisez-le et lancez l'interface graphique via hal -g. Vous pouvez lister toutes les options disponibles via hal [--help|-h].
Nous avons inclus quelques projets d'exemple dans le sous-répertoire examples. Pour démarrer avec un projet d'exemple, vous devez l'importer
via Import Project depuis le menu principal ou en déposant le fichier zippé dans la zone OPEN PROJECT de l'écran d'accueil.
Ce faisant, une fenêtre contextuelle demandera un répertoire avec des droits d'écriture où HAL créera le répertoire du projet et décompressera
les fichiers. N'utilisez pas d'outils externes pour la décompression car des adaptations sont faites pour que la netlist et la bibliothèque de portes
soient trouvées la prochaine fois que le projet est ouvert.
Si vous souhaitez ouvrir votre propre netlist Verilog ou VHDL, vous devez exécuter Import Netlist à la place. Cela ne fonctionnera que si
une bibliothèque de portes correspondante existe dans plugins/gate_libraries/definitions ou si vous fournissez manuellement la bibliothèque de portes.
Pour des instructions sur la création de votre propre bibliothèque de portes et d'autres tutoriels utiles, jetez un œil au wiki.
Le code d'exemple suivant se réfère à l'exemple fsm.
Utilisez le shell Python intégré ou la fenêtre de script Python pour interagir. Les deux offrent une fonctionnalité d'autocomplétion (limitée).
Listons toutes les tables de correspondance et affichons leurs fonctions booléennes :
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("")
Pour la netlist d'exemple fsm.vhd, cela affiche :
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)
Vous êtes invités à contribuer au développement de HAL. N'hésitez pas à soumettre une nouvelle pull request via GitHub.
Veuillez envisager d'exécuter les vérifications statiques + clang format avant cela.
Vous pouvez également installer ces vérifications en tant que hooks git avant chaque commit.
Pour installer le hook clang-format, installez git-hooks et exécutez :
git hooks --install
Lancez la construction Docker via :
docker-compose run --rm hal-build
git log $(git describe --tags --abbrev=0)..HEAD --pretty=format:"%s" --no-merges
Si vous utilisez HAL dans un contexte académique, veuillez citer le framework en utilisant la référence ci-dessous :
@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}},
}
N'hésitez pas à inclure également l'article original. Cependant, nous notons que HAL a massivement changé depuis son prototype original décrit dans l'article. Par conséquent, nous préférons citer l'entrée ci-dessus.
@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}}
}
Pour obtenir un aperçu des défis que nous nous proposons de résoudre avec HAL, n'hésitez pas à regarder notre talk au 36C3.
HAL est sous licence MIT pour encourager la collaboration avec d'autres groupes de recherche et les contributions de l'industrie. Veuillez vous référer au fichier de licence pour plus d'informations.
HAL est au mieux un logiciel de qualité alpha. Utilisez-le à vos propres risques. Nous n'encourageons aucune utilisation malveillante de notre boîte à outils.