Er der nogen ARM (eller andre ikke-x86) adskillere, der nedbryder en instruktion i dens komponentdele i en maskinvenlig struktur? Ideelt set ville det være noget som XED eller distorm3 , som adskilles i en struktur og derefter giver en API til forespørgsel på ting som “Er dette et opkald?” “Er dette en betinget gren?” osv. eller at få operanderne til en instruktion.
Jeg fandt armstorm , men den understøtter i øjeblikket kun tommelfinger.
Rediger: For at afklare, jeg leder efter noget, der kan kaldes fra et andet program og forhåbentlig har liberal licensering (GPL-kompatibel).
Kommentarer
- For hvad det er værd, tror jeg det er noget, der sandsynligvis vil blive føjet til ERESI på kort sigt, de har det allerede til Intel og Sparc og tilføjer mere ARM-understøttelse.
Svar
DARM (GitHub) af Jurriaan Bremer er en ARMv7 disassembler skrevet i C og er tilgængelig under en 3-klausul BSD-licens.
Bemærk: Den understøtter i øjeblikket ikke Thumb-tilstand.
Et simpelt eksempel på brug af DARM kan være som følger:
// 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 ); }
Kommentarer
- Dette ligner det, jeg gik efter! Jeg formoder, at jeg endda kunne bruge begge DARM og armstorm for at få fuld støtte …
Svar
Ja, IDA Pros SDK giver dig adgang til instruktioner “komponentdele via insn_t klasse (i ua.hpp).
Kommentarer
- At ' er fremragende at vide, men jeg ' Jeg leder efter noget, der kan kaldes fra et andet program og forhåbentlig har liberal licensering.
- @ BrendanDolan-Gavitt: måske at sige, at det i spørgsmålet er en god idé?
Svar
Et mere opdateret svar på dette spørgsmål ville være at foreslå Capstone -bibliotek. Jeg har brugt det til ARM-demontering, og det er ret pålideligt. IMHO, det er det bedste open source-bibliotek, der er tilgængeligt.
Biblioteket er baseret på LLVMs TabelGen-instruktionsbeskrivelser. Derfor er dens ISA-support lige så komplet som LLVM.