O objetivo deste projeto é implementar um pipeline de descompilação composto por componentes independentes que interagem através de interfaces bem definidas, conforme descrito ainda mais nos documentos de design do projeto.
git clone https://github.com/decomp/decomp
cd decomp
go install -v ./...Veja o uso de exemplo em exemplos/demonstração e este comentário para obter mais detalhes.
De uma perspectiva de alto nível, os componentes do pipeline de decompilação são conceitualmente agrupados em três módulos. Em primeiro lugar, o front-end traduz um idioma de origem (por exemplo, a montagem x86) em LLVM IR; uma representação intermediária de baixo nível independente da plataforma. Em segundo lugar, as estruturas do meio do meio do LLVM IR, identificando primitivas de fluxo de controle de alto nível (por exemplo, loops pré-teste, condicionais de duas vias). Por fim, o back-end traduz o LLVM estruturado IR em uma linguagem de programação de alvo de alto nível (por exemplo, GO).
O pôster a seguir resume os recursos atuais do pipeline de descompilação, usando uma composição de componentes independentes para traduzir o LLVM IR para ir.
Traduzir o código da máquina (por exemplo, o conjunto X86) para LLVM IR.
Componentes front-end de terceiros.
Execute a análise de fluxo de controle no LLVM IR para identificar primitivas de fluxo de controle de alto nível (por exemplo, loops pré-teste).
https://godoc.org/github.com/decomp/decomp/cmd/ll2dot
Ferramenta de geração de gráfico de fluxo de controle.
Gere gráficos de fluxo de controle a partir do conjunto LLVM IR ( *.ll -> *.dot).
https://godoc.org/github.com/decomp/decomp/cmd/restructure
Ferramenta de recuperação de fluxo de controle.
Recupere as primitivas de fluxo de controle dos gráficos de fluxo de controle ( *.dot -> *.json).
Traduzir LLVM estruturado para uma linguagem de destino de alto nível (por exemplo, GO).
https://godoc.org/github.com/decomp/decomp/cmd/ll2go
Ferramenta de geração de código.
Decompile LLVM IR Assembléia para ir código -fonte ( *.ll -> *.go).
https://godoc.org/github.com/decomp/decomp/cmd/go-post
Vá pós-processamento da ferramenta.
O código -fonte Go Pós -processo Go para torná -lo mais idiomático ( *.go -> *.go).
Foco primário da versão 0.2: velocidade de compilação em todo o projeto .
O desenvolvimento de componentes de decompilação deve ser divertido.
Parece haver uma correlação inversa entre dependendo de uma enorme biblioteca C ++ e se divertir desenvolvendo componentes de decompilação.
A versão 0.2 do pipeline de decomposição se esforça para resolver esse problema, aproveitando uma biblioteca LLVM IR escrita em Pure Go. Antes deste lançamento, a compilação em todo o projeto pode levar várias horas para ser concluída. Agora, eles completam em menos de 1 minuto - o limite rígido estabelecido para todos os lançamentos futuros.
Liberação inicial.
Foco primário da versão 0.1: decompilação composicional .
Os decompiladores devem ser compostos e de código aberto.
Um pipeline de decomposição deve ser composto de componentes individuais, cada um com um único objetivo e entrada e saída bem definidas.
A versão 0.1 do projeto Decomp explora a viabilidade de compor um pipeline de decompilação de componentes independentes e o potencial de expor esses componentes ao usuário final.
Para um fundo adicional, consulte a decompilação de composição usando o documento de design LLVM IR.
Foco primário da versão 0.3: levantamento binário consciente do tipo .
Os decompilistas confiam em levantamento binário de alta qualidade.
A qualidade da saída IR do front-end de elevação binária determina fundamentalmente a qualidade da saída de todo o pipeline de decompilação.
A versão 0.3 tem como objetivo melhorar a qualidade da saída LLVM IR, implementando um front-end de elevação binária consciente do tipo.
Foco primário da versão 0.4: Análise de fluxo de controle .
Os decompiladores devem recuperar as primitivas de fluxo de controle de alto nível.
Uma das diferenças primárias entre a montagem de baixo nível e o código-fonte de alto nível é o uso de primitivas de fluxo de controle de alto nível; Por exemplo, condicionais de 1 vias, 2 vias e N-Way ( if , if-else e switch ), loops pré e pós-teste ( while e do-while ).
A versão 0.4 procura recuperar os primitivos de fluxo de controle de alto nível usando algoritmos de análise de fluxo de controle robustos.
Foco primário da versão 0.5: tolerância a falhas .
Os decompilistas devem ser robustos.
Os componentes de descompilação devem responder bem a estados inesperados e análise incompleta.
A versão 0.5 concentra-se na estabilidade e procura testar o estresse do pipeline de descompilação usando o software semi-real do mundo (consulte a série de problemas de desafio).
Foco primário da versão 0.6: Análise de fluxo de dados .
Foco primário da versão 0.7: análise de tipo .