¿Hay algún desensamblador ARM (u otro que no sea x86) que descomponga una instrucción en sus partes componentes en una estructura amigable para la máquina? Lo ideal sería algo como XED o distorm3 , que se desmontan en una estructura y luego proporcionan una API para consultar cosas como «¿Es una llamada?» «¿Es esta una rama condicional?» etc., o obtener los operandos de una instrucción.
Encontré armstorm , pero actualmente solo admite THUMB.
Editar: Para aclarar, «estoy buscando algo que se pueda llamar desde otro programa y que, con suerte, tenga una licencia liberal (compatible con GPL).
Comentarios
- Por lo que vale, creo que es algo que probablemente se agregará a ERESI en el corto plazo. Ya lo tienen para Intel y Sparc y están agregando más soporte ARM.
Respuesta
DARM (GitHub) de Jurriaan Bremer es un desensamblador ARMv7 escrito en C y está disponible bajo una licencia BSD de 3 cláusulas.
Nota: Actualmente no es compatible con el modo Thumb.
Un ejemplo simple de uso de DARM podría ser el siguiente:
// The structure which will hold all the metadata about the disassembled instruction... darm_t d; // disassemble a 32bit opcode... if( darm_armv7_disasm( &d, 0xE12FFF14 ) >= 0 ) { if( d.instr == I_BX ) { // do something with a BX instructiuon... } // print the disassembled full instruction darm_str_t str; if( darm_str( &d, &str) > 0 ) printf( "%s\n", str.instr ); }
Comentarios
- ¡Esto parece lo que estaba buscando! Supongo que incluso podría usar ambos DARM y tormenta de armas para obtener soporte completo …
Responder
Sí, IDA Pro «s SDK le permite acceder a los componentes de las instrucciones» a través de la clase insn_t (en ua.hpp).
Comentarios
- Eso ' es excelente para saberlo, pero yo ' Estoy buscando algo que pueda llamarse desde dentro de otro programa y, con suerte, tiene una licencia liberal.
- @ BrendanDolan-Gavitt: ¿tal vez decir que en la pregunta es una buena idea entonces?
Respuesta
Una respuesta más actualizada a esta pregunta sería sugerir Biblioteca Capstone . Lo he usado para el desmontaje de ARM y es bastante confiable. En mi humilde opinión, es la mejor biblioteca de código abierto disponible.
La biblioteca se basa en las descripciones de instrucciones TabelGen de LLVM. Por lo tanto, su compatibilidad con ISA es tan completa como LLVM.