Há algum desmontador ARM (ou outro não-x86) que decompõe uma instrução em suas partes componentes em uma estrutura amigável à máquina? Idealmente, seria algo como XED ou distorm3 , que se desmontam em uma estrutura e fornecem uma API para consultar coisas como “Isso é uma chamada?” “Este é um ramo condicional?” etc., ou obter os operandos de uma instrução.
Eu encontrei armstorm , mas atualmente só suporta THUMB.
Editar: para esclarecer, estou procurando por algo que possa ser chamado de dentro de outro programa e espero que tenha uma licença liberal (compatível com GPL).
Comentários
- Pelo que vale a pena, acho que é algo que provavelmente será adicionado ao ERESI em breve, eles já o têm para Intel e Sparc e estão adicionando mais suporte a ARM.
Resposta
DARM (GitHub) de Jurriaan Bremer é um desmontador ARMv7 escrito em C e está disponível sob uma Licença BSD de 3 cláusulas.
Nota: Atualmente não suporta o modo Thumb.
Um exemplo simples de uso de DARM poderia ser o seguinte:
// 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 ); }
Comentários
- Isso parece o que eu estava procurando! Acho que poderia até usar os dois DARM e tempestade de braços para obter suporte total …
Resposta
Sim, IDA Pro “s SDK permite que você acesse as” partes do componente de instruções por meio da classe insn_t (em ua.hpp).
Comentários
- Isso ' é excelente para saber, mas eu ' estou procurando algo que possa ser chamado de dentro de outro programa e espero que tenha um licenciamento liberal.
- @ BrendanDolan-Gavitt: talvez afirmar que na pergunta seja uma boa ideia então?
Resposta
Uma resposta mais atualizada a esta pergunta seria sugerir Biblioteca Capstone . Eu o usei para a desmontagem do ARM e é bastante confiável. IMHO, é a melhor biblioteca de código aberto disponível.
A biblioteca é baseada nas descrições das instruções TabelGen do LLVM. Portanto, seu suporte a ISA é tão completo quanto LLVM.