Extensão de exportador de arquivo de objeto para Ghidra
Esta extensão Ghidra permite exportar partes de um programa como arquivos objeto. Esses arquivos objeto possuem metadados válidos (símbolos, tabelas de relocação…) e, como tal, podem ser reutilizados diretamente por um conjunto de ferramentas para processamento posterior.
Os casos de uso incluem:
- Correção binária avançada, aproveitando o vinculador para consertar as partes originais e modificadas em vez de fazer esse trabalho manualmente;
- Portas de software, isolando o código independente do sistema de um programa e substituindo o restante;
- Converter programas ou arquivos objeto de um formato de arquivo para outro;
- Criar bibliotecas, extraindo partes de um programa e reutilizando-as em outro contexto;
- Projetos de descompilação, dividindo um programa em vários arquivos-objeto e reimplementando esses arquivos no estilo Navio de Teseu ;
- …
Matriz de arquiteturas de conjuntos de instruções e arquivos de objetos suportados:
| x86 | MIPS |
---|
COFF | ✅ | |
DUENDE | ✅ | ✅ |
Edifício (CLI)
- Clone este repositório;
- Defina a variável de ambiente
GHIDRA_INSTALL_DIR
para apontar para o diretório de instalação do Ghidra; - Execute
gradle buildExtension
.
O arquivo de extensão Ghidra será criado dentro do diretório dist/
.
Instalação
- Baixe a extensão na página de lançamentos ou construa-a localmente;
- Instale a extensão em sua instância do Ghidra com
File > Install Extensions…
; - Habilite o plug-in
RelocationTableSynthesizedPlugin
com File > Configure
dentro de uma janela do CodeBrowser.
Uso
- Selecione um conjunto de endereços na visualização Listagem;
- Execute o analisador
Relocation table synthesizer
(disponível no modo one-shot); - Invoque um exportador de arquivo de objeto relocável com
File > Export Program…
As realocações reconstruídas podem ser visualizadas em Window > Relocation table (synthesized)
.
- ️ O analisador sintetizador de tabela de realocação depende de um banco de dados Ghidra totalmente preenchido (com símbolos, tipos de dados e referências declarados corretamente) para funcionar. Informações incorretas ou ausentes podem levar a realocações quebradas ou não descobertas durante a análise.
- ️ Os exportadores de arquivos objeto dependem dos resultados do analisador sintetizador de tabela de relocação para funcionar. Em caso de dúvida, execute este analisador antes de exportar um arquivo objeto para garantir que o conteúdo da tabela de realocação esteja atualizado com o estado atual do programa.
Como funciona?
Os arquivos de objeto são compostos de três partes:
- Bytes de seção relocáveis;
- Uma tabela de símbolos;
- Uma mesa de realocação.
Quando um vinculador é invocado para gerar um executável a partir de vários arquivos de objeto, ele irá:
- Disponha suas seções na memória;
- Calcule os endereços dos símbolos no espaço de endereço virtual;
- Aplique as realocações com base nos endereços finais dos símbolos nos bytes da seção.
Normalmente a tabela de relocação é descartada após este processo, assim como a tabela de símbolos se os símbolos de depuração não forem mantidos, deixando apenas os bytes da seção não relocáveis. No entanto, através de uma análise cuidadosa, esses dados podem ser recriados, o que nos permite desvincular efetivamente o programa de volta aos arquivos-objeto.