El objetivo de este proyecto es implementar una tubería de descompilación compuesta de componentes independientes que interactúen a través de interfaces bien definidas, como se describe más adelante en los documentos de diseño del proyecto.
git clone https://github.com/decomp/decomp
cd decomp
go install -v ./...Vea el uso de ejemplo en ejemplos/demostración, y este comentario para más detalles.
Desde una perspectiva de alto nivel, los componentes de la tubería de descompilación se agrupan conceptualmente en tres módulos. En primer lugar, el front-end traduce un lenguaje fuente (por ejemplo, ensamblaje x86) en LLVM IR; Una representación intermedia de bajo nivel independiente de la plataforma. En segundo lugar, las estructuras de gama media la LLVM IR identificando primitivas de flujo de control de alto nivel (por ejemplo, bucles previos a la prueba, condicionales de 2 vías). Por último, el back-end traduce el LLVM estructurado IR en un lenguaje de programación de destino de alto nivel (por ejemplo, GO).
El siguiente póster resume las capacidades actuales de la tubería de descompilación, utilizando una composición de componentes independientes para traducir LLVM IR para ir.
Traducir el código de la máquina (p. Ej. Ensamblaje X86) a LLVM IR.
Componentes front-end de terceros.
Realice el análisis de flujo de control en el LLVM IR para identificar primitivas de flujo de control de alto nivel (por ejemplo, bucles previos a la prueba).
https://godoc.org/github.com/decomp/decomp/cmd/ll2dot
Herramienta de generación de gráficos de flujo de control.
Genere gráficos de flujo de control a partir del ensamblaje LLVM IR ( *.ll -> *.dot).
https://godoc.org/github.com/decomp/decomp/cmd/restructure
Herramienta de recuperación de flujo de control.
Recupere las primitivas de flujo de control de los gráficos de flujo de control ( *.dot -> *.json).
Traducir LLVM IR estructurado a un lenguaje de destino de alto nivel (por ejemplo, GO).
https://godoc.org/github.com/decomp/decomp/cmd/ll2go
GO Herramienta de generación de código.
Descompilar LLVM IR Assembly to Go Código fuente ( *.ll -> *.go).
https://godoc.org/github.com/decomp/decomp/cmd/go-post
Vaya a la herramienta de postprocesamiento.
Código fuente de GO posterior al proceso para que sea más idiomático ( *.go -> *.go).
Enfoque principal de la versión 0.2: Velocidad de compilación en todo el proyecto .
El desarrollo de componentes de descompilación debería ser divertido.
Parece haber una correlación inversa entre depender de una enorme biblioteca de C ++ y divertirse desarrollando componentes de descompilación.
La versión 0.2 de la tubería de descompilación se esfuerza por resolver este problema aprovechando una biblioteca IR LLVM escrita en puro Go. Antes de este lanzamiento, la compilación de todo el proyecto podría tardar varias horas en completarse. Ahora, completan en menos de 1 minuto, el límite duro establecido para todos los lanzamientos futuros.
Liberación inicial.
Enfoque primario de la versión 0.1: descompilación compositiva .
Los descompiladores deben ser compuestos y de código abierto.
Una tubería de descompilación debe estar compuesta por componentes individuales, cada uno con un solo propósito y entrada y salida bien definidas.
La versión 0.1 del Proyecto DECOMP explora la viabilidad de componer una tubería de descompilación de componentes independientes y el potencial de exponer esos componentes al usuario final.
Para obtener más información, consulte la descompilación de composición utilizando el documento de diseño LLVM IR.
Enfoque primario de la versión 0.3: Lifting binario consciente de los tipos .
Los descompiladores dependen de levantamiento binario de alta calidad.
La calidad de la salida IR del front-end binario determina fundamentalmente la calidad de la producción de toda la tubería de descompilación.
La versión 0.3 tiene como objetivo mejorar la calidad de la salida LLVM IR implementando un front-end de elevación binario consciente de los tipos.
Enfoque primario de la versión 0.4: Análisis de flujo de control .
Los descompiladores deben recuperar primitivas de flujo de control de alto nivel.
Una de las principales diferencias entre el ensamblaje de bajo nivel y el código fuente de alto nivel es el uso de primitivas de flujo de control de alto nivel; Por ejemplo, condicionales de 1 vía, 2 vías y N-vías ( if , if-else y switch ), bucles previos y posteriores a la prueba ( while y do-while ).
La versión 0.4 busca recuperar primitivas de flujo de control de alto nivel utilizando algoritmos de análisis de flujo de control robusto.
Enfoque principal de la versión 0.5: tolerancia a fallas .
Los descompiladores deben ser robustos.
Los componentes de descompilación deben responder bien a los estados inesperados y un análisis incompleto.
La versión 0.5 se centra en la estabilidad y busca prueba de estrés la tubería de descompilación utilizando el software del mundo semi-real (ver la serie de problemas de desafío).
Enfoque principal de la versión 0.6: Análisis de flujo de datos .
Enfoque principal de la versión 0.7: análisis de tipo .