translation llvm assembly disassembly opcode

translation - Traducción de código de máquina a LLVM IR(desmontaje/reensamblado de X86_64. X86. ARM en código de bits de LLVM)



assembly disassembly (6)

Me gustaría traducir X86_64, x86, ejecutables ARM a LLVM IR (desmontaje).

¿Qué solución sugieres?


Con respecto a la herramienta RevGen mencionada por @ bsa2000, este último documento "Un sistema de reescritura y análisis binario basado en una representación intermedia de nivel de compilador" ha señalado algunas limitaciones en S2E y Revinc.

Los saco aquí.

  1. carencia de traducción dinámica:

    S2E [16] y Revnic [14] presentan un método para traducir dinámicamente x86 a LLVM utilizando QEMU. A diferencia de nuestro enfoque, estos métodos convierten los bloques de código en LLVM sobre la marcha, lo que limita la aplicación de los análisis de LLVM a solo un bloque a la vez.

  2. IR incompleto:

    Revnic [14] y RevGen [15] recuperan un IR fusionando los bloques traducidos, pero el IR recuperado está incompleto y solo es válido para la ejecución actual; en consecuencia, varios análisis completos del programa proporcionarán información incompleta.

  3. Sin pila abstracta o información de promoción.

    Además, el código traducido conserva todos los supuestos de la versión original acerca del diseño de la pila. No proporcionan ningún método para obtener una pila abstracta o promover ubicaciones de memoria a símbolos, que son esenciales para la aplicación de varios análisis de nivel de fuente.



Dudo que haya una solución universal (piense en las ramas indirectas, etc.), LLVM IR es mucho más "alto nivel" que cualquier ensamblador. Aunque es posible traducir en base a BB Es posible que desee verificar los proyectos llvm-qemu y libcpu entre otros.


Hay un nuevo proyecto, que se encuentra en algunas fases iniciales, The libbeauty : https://github.com/jcdutton/libbeauty

Artículo sobre el proyecto: Libbeauty: Otra herramienta de ingeniería inversa , 24 de diciembre de 2013, Michael Larabel - http://www.phoronix.com/scan.php?page=news_item&px=MTU1MTU

Solo admite el subconjunto de x86_64 como entrada ahora. Uno de los objetivos del proyecto es poder compilar el LLVM IR generado al ensamblaje para obtener el binario con la misma funcionalidad.


Solo publique algunas referencias sobre la traducción de binarios ARM a LLVM IR:

desarmar - armar binario a llvm ir desensamblador

https://code.google.com/p/disarm/

Sin embargo, no lo he probado, por lo que no estoy seguro de su calidad y estabilidad. ¿Alguien más puede publicar información adicional sobre este proyecto?


mcsema es un levantador binario de calidad de producción. Toma x86 y x86-64 y estáticamente "lo levanta" a LLVM IR. Se mantiene activamente, tiene licencia BSD y cuenta con pruebas y documentación exhaustivas.

https://github.com/trailofbits/mcsema