
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)
Você é bem-vindo(a) para contribuir com o desenvolvimento do HAL. Sinta-se à vontade para enviar um novo pull request pelo github.
Considere executar as verificações estáticas + clang format antes disso.
Você também pode instalar essas verificações como git hooks antes de qualquer commit.
Para instalar o hook clang-format, instale git-hooks e execute:
git hooks --install
Inicie a compilação Docker via:
docker-compose run --rm hal-build
git log $(git describe --tags --abbrev=0)..HEAD --pretty=format:"%s" --no-merges
Se você usar o HAL em um contexto acadêmico, por favor, cite a plataforma usando a referência abaixo:
@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}},
}
Sinta-se à vontade para incluir também o artigo original. No entanto, notamos que o HAL mudou massivamente desde seu protótipo original descrito no artigo. Portanto, preferimos citar a entrada acima.
@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}}
}
Para ter uma visão geral dos desafios que nos propusemos a resolver com o HAL, sinta-se à vontade para assistir nossa palestra no 36C3.
O HAL é licenciado sob a Licença MIT para incentivar a colaboração com outros grupos de pesquisa e contribuições da indústria. Consulte o arquivo de licença para mais informações.
O HAL é, no máximo, um software de qualidade alfa. Use por sua conta e risco. Não incentivamos nenhum uso malicioso de nossa ferramenta.