Traducción de código máquina a LLVM IR (desassembly / reensamblaje de X86_64. X86. ARM en código de bits LLVM)

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

¿Qué solución sugieres?

Considere usar la herramienta RevGen desarrollada dentro del proyecto S2E . Permite convertir binarios x86 a LLVM IR. El código fuente puede extraerse de la sucursal de Revgen del repository GIT disponible en la URL https://dslabgit.epfl.ch/git/s2e/s2e.git .

mcsema es un elevador binario de calidad de producción. Toma x86 y x86-64 y lo “eleva” estáticamente a LLVM IR. Se mantiene activamente, con licencia BSD, y cuenta con extensas pruebas y documentación.

https://github.com/trailofbits/mcsema

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

Los saco aquí.

  1. defecto de la 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 bloques de código en LLVM sobre la marcha, lo que limita la aplicación de análisis 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 de progtwigs completos proporcionarán información incompleta.

  3. sin stack abstracta o información de promoción

    Además, el código traducido conserva todos los supuestos del binario original sobre el diseño de la stack. No proporcionan ningún método para obtener una stack 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 twigs 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 comprobar los proyectos llvm-qemu y libcpu, entre otros.

Hay un nuevo proyecto, que se encuentra en algunas fases tempranas, 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 objectives del proyecto es poder comstackr el IR LLVM generado para volver a ensamblar y obtener el binario con la misma funcionalidad.

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

desarmar – armar binario para desmontar lvm ir

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

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