Solo para aquellos que todavía están buscando más información sobre este tema, quiero compartir la información sobre un proyecto en curso (http://dslab.epfl.ch/proj/s2e) que he encontrado en la web. El proyecto tiene dos componentes:
- x86-to-LLVM backend para la traducción dinámica de código de máquina x86 a LLVM IR
- RevGen herramienta para el análisis estático de binarios x86, capaz de traducir montaje x86 inline a LLVM IR
Aquí está RevGen prototipo: RevGen toma como entrada un binario x86 y emite un módulo LLVM equivalente en tres pasos. Primero, RevGen busca todos los bloques ejecutables de código y los convierte a bloques de traducción LLVM. En segundo lugar, cuando no hay más bloques de traducción que cubrir, RevGen los transforma en bloques básicos y reconstruye el gráfico de flujo de control del binario original en formato LLVM. En tercer lugar, RevGen resuelve las llamadas a funciones externas para construir el módulo LLVM final. Para el análisis dinámico, un último paso vincula el módulo LLVM con una biblioteca en tiempo de ejecución que permite la ejecución del módulo LLVM.
Esta pregunta ya fue hecha y respondida. No hay una solución directa debido a muchas cosas (por ejemplo, ramas indirectas). Puede encontrar el proyecto como llvm-qemu y libcpu útil para usted. En cualquier caso, esta pregunta es un duplicado de http://stackoverflow.com/questions/6981810/translation-of-machinecode-into-llvm-ir-disassembly-reassembly-of-x86-64-x86 –
Gracias. Ya he echado un vistazo a los proyectos que mencionaste. Desafortunadamente, _llvm-qemu_ parece muerto. Y _libcpu_ parece que va por su propio camino en el análisis de ensamblaje en lugar de usar la infraestructura de LLVM (por lo que parece estar incompleto al admitir x86 ISA). De hecho, pensé que la herramienta que estaba buscando debería hacer el trabajo de ** AsmPrinter ** de LLVM, pero a la inversa, traducir las instrucciones ISA nativas en _MachineInstr_ de LLVM o _MCInst de LLVM-MC. – bsa2000
¿Y el subproyecto de LLVM ** llvm-mc **? Tiene la clase _AsmParser_ que puede comer el archivo .s y generar su representación basada en la clase _MCInst_. En este caso, la única parte que queda por deshacer es retroceder en dirección inversa con respecto a la clase _MCLowering_ hacia la representación _MachineInstr_ basada en LLVM. – bsa2000