A representação intermediária da Grammatech para binários (GTIRB) é uma análise de código de máquina e reescreveu a estrutura de dados. Pretende -se facilitar a comunicação de IR binária entre programas que realizam desmontagem binária, análise, transformação e impressão bonita. O GTIRB é modelado no LLVM-IR e procura servir a uma funcionalidade semelhante de encorajar a comunicação e a interoperabilidade entre as ferramentas.
O restante deste arquivo descreve vários aspectos do GTIRB:
GTIRB tem a seguinte estrutura. Linhas sólidas denotam herança. Linhas pontilhadas denotam referência por UUID.
Uma instância do GTIRB pode incluir vários módulos ( Module ) que representam objetos carregáveis, como executáveis ou bibliotecas, um gráfico de fluxo de controle interprocedural ( IPCFG ) e tabelas de dados auxiliares ( AuxData ) que podem conter a análise arbitrária resulta em formatos definidos pelo usuário que podem facilmente fazer referência a outros elementos do IR. Cada módulo contém informações como símbolos ( Symbol ) e seções que possuem os bytes e dados de dados e dados reais do módulo. O CFG consiste em blocos básicos ( Block ) e bordas de fluxo de controle entre esses blocos. Cada bloco de dados ou código faz referência a um intervalo de bytes em um intervalo de bytes ( ByteInterval ). Uma seção pode conter um grande intervalo de bytes que mantém todos os blocos-se as posições relativas dos blocos nessa seção forem definidas-ou poderão manter um intervalo de byte por bloco-se as posições relativas dos blocos não estiverem definidas, por exemplo, para os blocos de código na seção .text durante a reescrita do programa. Cada símbolo contém um ponteiro para o bloco ou dado que ele faz referência.
O GTIRB explicitamente não representa instruções ou semântica de instruções, mas fornece informações simbólicas do operando e acesso aos bytes. Existem muitos idiomas intermediários (IL) s para a representação da semântica da instrução (por exemplo, BAP's BIL, VEX de Angr ou codificador P de Ghidra). O GTIRB trabalha com estes ou qualquer outro IL armazenando instruções de maneira geral e eficiente como bytes de código de máquina brutos e armazenando separadamente as informações simbólicas e de fluxo de controle. O popular decodificador/codificador Capstone/Keystone fornece uma excelente opção para ler e escrever instruções da representação de bytes de código de máquina do/para GTIRB sem se comprometer com nenhuma IL semântica específica. Ao suportar várias ILs e o armazenamento separado da análise, resulta em tabelas de dados auxiliares o GTIRB, permite a colaboração entre as equipes e as ferramentas independentes de análise binária e reescrita.
O GTIRB prevê o compartilhamento de informações adicionais, por exemplo, resultados de análise, na forma de objetos AuxData . Eles podem armazenar mapas e vetores dos tipos básicos de GTIRB de maneira portátil. O manual GTIRB descreve a estrutura para tipos comuns de dados auxiliares, como informações de limite da função, informações de tipo ou resultados de análises comuns nos esquemas padrão do AuxData.
Todo elemento de GTIRB --- por exemplo, módulos ( Module ), símbolos ( Symbol ) e blocos ( Block ) --- tem um identificador universalmente exclusivo (UUID). Os UUIDs permitem que os componentes de IR de primeira classe e as tabelas AuxData se referam a elementos do IR.
Instruções e operandos simbólicos podem ser abordados pelo Offset da classe que encapsula um UUID (que se refere ao bloco da instrução) e um deslocamento.
Atualmente, existem pacotes para instalar facilmente o GTIRB (e as ferramentas de atendimento, incluindo o DDISASM Desmonsembler e o GTIRB-PPRINTRO Pretty Printer) no Windows e o Ubuntu 20. Veja abaixo as instruções. Além disso, existe uma imagem pública do Docker no Grammatech/DDISASM com todas essas ferramentas instaladas. O GTIRB está em versão com major.Minor.Patch Versioning, onde os principais incrementos da versão exigirão alterações significativas da fonte, mas devem ser muito raras, os incrementos menores da versão podem exigir pequenas alterações de fonte e os incrementos da versão de patch não devem quebrar nenhuma construção a jusante. Ainda não fornecemos compatibilidade com ABI em nenhuma alteração da versão.
A mais recente API estável GTIRB Python pode ser instalada a partir do Pypi usando PIP:
pip install gtirbA mais recente versão instável da API Python pode ser instalada a partir de uma roda pré -edificada:
pip install https://download.grammatech.com/gtirb/files/python/gtirb-0.dev-py3-none-any.whl É fundamental que a escolha de um pacote stable ou unstable corresponda aos pacotes DDISASM instalados e GTIRB-PPRINT.
As versões do Windows são embaladas como arquivos .zip e estão disponíveis em https://download.grammatech.com/gtirb/files/windows-release/.
Os pacotes para o Ubuntu 20 estão disponíveis no repositório APT GTIRB e podem ser instalados de acordo com as seguintes instruções.
Primeiro, adicione a chave adequada da Grammatech.
wget -O - https://download.grammatech.com/gtirb/files/apt-repo/conf/apt.gpg.key | apt-key add -Em seguida, atualize seu arquivo de fontes.list.
echo " deb [arch=amd64] https://download.grammatech.com/gtirb/files/apt-repo [distribution] [component] " | sudo tee -a /etc/apt/sources.listOnde:
[distribution] é focal (atualmente, apenas os pacotes do Ubuntu 20 estão disponíveis)[component] é stable , que mantém a última versão de versão, ou unstable , que mantém a cabeça do repositório.Finalmente, atualize o banco de dados do seu pacote e instale as ferramentas Core GTIRB:
sudo apt-get update
sudo apt-get install gtirb-pprinter ddisasm AVISO : Versões estáveis gtirb-2.0.0, gtirb-PPRINTER-2.1.0, DDISASM-1.8.0 e mais antigas dependem de metapackages que causam conflitos se você tentar apt-get upgrade (consulte #63). Nesse caso, desinstale e reinstale os pacotes que você obteve do repositório GTIRB. Pode ser necessário usar dpkg --remove para remover os metapackages (por exemplo, ddisasm ) antes de remover os pacotes de versão concreta (por exemplo, ddisasm-1.5.1 ). Versões estáveis mais recentes não dependem mais de metapackages e podem ser atualizadas sem problemas.
A API C ++ do GTIRB deve ser construída com sucesso em compiladores de 64 bits com GCC, CLANG e Visual Studio que suportam pelo menos C ++ 17. O GTIRB usa CMake, que deve ser instalado com pelo menos a versão 3.10.
O processo de construção comum se parece com o seguinte:
mkdir build
cd build
# Note: You may wish to add some -D arguments to the next command. See below.
cmake < path/to/gtirb >
cmake --build .
# Run the test suite.
ctestPara personalizar a compilação GTIRB, você pode obter uma lista de opções de personalização navegando no seu diretório de construção e executando:
cmake -LHPara construir e instalar o GTIRB, os seguintes requisitos devem ser instalados:
cmake .libprotobuf-dev e protobuf-compiler .O GTIRB foi projetado para ser serializado usando os buffers do Google Protocol (isto é, Protobuf), permitindo o uso fácil e eficiente de qualquer linguagem de programação.
O GTIRB também pode ser usado através de uma API dedicada implementada em vários idiomas. As APIs fornecem estruturas de dados eficientes adequadas para uso por análises binárias e reescritações; Veja abaixo para obter detalhes.
O GTIRB usa um formato serializado que consiste em uma assinatura de 8 bytes seguida de dados do Protobuf serializados. Os dados do Protobuf permitem exploração e manipulação no idioma de sua escolha. Os buffers da página inicial do Google Protocol lista os idiomas nos quais os buffers de protocolo podem ser usados diretamente; Os usuários de outros idiomas podem converter os dados formatados pelo Protobuf em formato JSON e depois usar os dados JSON em seus aplicativos.
O diretório proto neste repositório contém as definições de tipo de mensagem de buffer do protocolo para GTIRB. Você pode inspecionar esses arquivos .proto para determinar a estrutura dos vários tipos de mensagens GTIRB. O tipo de mensagem de nível superior é IR .
Para mais detalhes, consulte o uso de dados GTIRB serializados.
A API GTIRB está atualmente disponível em C ++, Python e Common Lisp. Há uma API Java parcial que não está pronta para uso externo. Para obter informações da API independente de linguagem, consulte componentes GTIRB. Para obter informações sobre as diferentes implementações da API, consulte: