
HAL [/hel/] es un framework integral de ingeniería inversa y manipulación de netlist.
Prácticamente toda la investigación disponible sobre análisis de netlist opera sobre una representación basada en grafos de la netlist bajo inspección. En su núcleo, HAL proporciona exactamente eso: un framework para analizar netlist de fuentes arbitrarias, por ejemplo, FPGAs o ASICs, en una representación de netlist basada en grafos y proporcionar las herramientas integradas necesarias para el recorrido y análisis de las puertas y nets incluidas.
Nuestra visión es que HAL se convierta en el equivalente de herramientas como IDA o Ghidra para la ingeniería inversa de hardware. Queremos que HAL proporcione una base común para investigadores y analistas para mejorar la reproducibilidad de los resultados de investigación y abstraer tareas básicas recurrentes como el análisis de netlists, etc.
HAL es desarrollado activamente por el grupo de Seguridad Integrada del Instituto Max Planck para la Seguridad y la Privacidad. Además de múltiples proyectos de investigación, también se utiliza en nuestra conferencia universitaria "Einführung ins Hardware Reverse Engineering" (Introducción a la Ingeniería Inversa de Hardware) en la Universidad del Ruhr en Bochum (RUB).
Tenga en cuenta que también tenemos un conjunto de circuitos de referencia modernos de última generación para la evaluación de técnicas de ingeniería inversa de netlist disponibles en un repositorio separado.
Este repositorio contiene una selección de complementos seleccionados:
libertyUna documentación completa de las características de HAL desde la perspectiva del usuario está disponible en nuestra Wiki. Además, proporcionamos documentación completa de la API de C++ y API de Python.
Para instrucciones sobre cómo compilar HAL, consulte la página dedicada en nuestra Wiki.
Instale HAL o compile HAL e inicie la GUI con hal -g. Puede listar todas las opciones disponibles con hal [--help|-h].
Hemos incluido algunos proyectos de ejemplo en el subdirectorio examples. Para comenzar con un proyecto de ejemplo, debe importarlo
a través de Import Project desde el menú principal o arrastrando el archivo comprimido en el área OPEN PROJECT de la pantalla de bienvenida.
Al hacerlo, aparecerá una ventana emergente solicitando un directorio con permisos de escritura donde HAL creará el directorio del proyecto y descomprimirá
los archivos. No utilice herramientas externas para descomprimir, ya que se realizan adaptaciones para que la netlist y la biblioteca de puertas
se encuentren la próxima vez que se abra el proyecto.
En caso de que desee abrir su propia netlist Verilog o VHDL, debe ejecutar Import Netlist en su lugar. Esto solo funcionará si
hay una biblioteca de puertas correspondiente en plugins/gate_libraries/definitions o si proporciona la biblioteca de puertas manualmente.
Para obtener instrucciones sobre cómo crear su propia biblioteca de puertas y otros tutoriales útiles, eche un vistazo a la wiki.
El siguiente código de ejemplo se refiere al ejemplo fsm.
Use el shell de Python integrado o la ventana de scripts de Python para interactuar. Ambos cuentan con funcionalidad de autocompletado (limitada).
Listemos todas las tablas de búsqueda e imprimamos sus funciones booleanas:
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("")
Para la netlist de ejemplo fsm.vhd esto imprime:
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)