
HAL [/hel/] é uma plataforma abrangente de engenharia reversa e manipulação de netlists.
Praticamente toda a pesquisa disponível sobre análise de netlists opera sobre uma representação baseada em grafos da netlist sob inspeção. Em seu núcleo, o HAL fornece exatamente isso: uma plataforma para analisar netlists de fontes arbitrárias, como FPGAs ou ASICs, em uma representação baseada em grafos e fornecer as ferramentas integradas necessárias para navegação e análise das portas e conexões incluídas.
Nossa visão é que o HAL se torne o equivalente do hardware reverse engineering de ferramentas como IDA ou Ghidra. Queremos que o HAL permita uma base comum para pesquisadores e analistas, melhorando a reprodutibilidade dos resultados de pesquisa e abstraindo tarefas básicas recorrentes, como análise de netlists, etc.
O HAL é ativamente desenvolvido pelo grupo de Segurança Embarcada do Instituto Max Planck para Segurança e Privacidade. Além de múltiplos projetos de pesquisa, também é utilizado em nossa palestra universitária "Einführung ins Hardware Reverse Engineering" (Introdução ao Hardware Reverse Engineering) na Universidade Ruhr de Bochum (RUB).
Note que também temos um conjunto moderno de circuitos de benchmark de última geração para avaliação de técnicas de engenharia reversa de netlists disponível em um repositório separado aqui.
Este repositório contém uma seleção de plugins curados:
libertyUma documentação abrangente das funcionalidades do HAL sob a perspectiva do usuário está disponível em nossa Wiki. Além disso, fornecemos documentação completa da API C++ e da API Python.
Para instruções sobre como compilar o HAL, consulte a página dedicada em nossa Wiki.
Instale o HAL ou compile o HAL e inicie a GUI com hal -g. Você pode listar todas as opções disponíveis com hal [--help|-h].
Incluímos alguns projetos de exemplo no subdiretório examples. Para começar com um projeto de exemplo, você precisa importá-lo através de Import Project no menu principal ou arrastando o arquivo zipado na área OPEN PROJECT da Tela de Boas-Vindas.
Ao fazer isso, um popup solicitará um diretório com permissões de escrita onde o HAL criará o diretório do projeto e descompactará os arquivos. Não use ferramentas externas para descompactar, pois são feitas adaptações para que a netlist e a biblioteca de portas sejam encontradas na próxima vez que o projeto for aberto.
Caso queira abrir sua própria netlist Verlog ou VHDL, você deve executar Import Netlist. Isso só funcionará se houver uma biblioteca de portas correspondente em plugins/gate_libraries/definitions ou se você fornecer a biblioteca de portas manualmente.
Para instruções sobre como criar sua própria biblioteca de portas e outros tutoriais úteis, dê uma olhada na wiki.
O código de exemplo a seguir refere-se ao exemplo fsm.
Use o shell Python integrado ou a janela de script Python para interagir. Ambos possuem funcionalidade (limitada) de autocompletar.
Vamos listar todas as lookup tables e imprimir suas funções 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 a netlist de exemplo fsm.vhd isso 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)
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)