Czy są jakieś dezasemblery ARM (lub inne niż x86), które rozkładają instrukcję na części składowe w strukturze przyjaznej dla maszyny? Idealnie byłoby coś takiego jak XED lub distorm3 , które rozkładają się na strukturę, a następnie zapewniają interfejs API do wykonywania zapytań takich jak „Czy to jest połączenie?” „Czy to jest gałąź warunkowa?” itp., lub pobierając operandy instrukcji.
Znalazłem armstorm , ale obecnie obsługuje tylko THUMB.
Edycja: aby wyjaśnić, szukam czegoś, co można wywołać z poziomu innego programu i mam nadzieję, że ma liberalne licencje (zgodne z GPL).
Komentarze
- To, co jest warte, myślę, że jest to coś, co prawdopodobnie zostanie dodane do ERESI w najbliższym czasie. Oni już to mają dla Intel i Sparc i dodają więcej wsparcia dla ARM.
Odpowiedź
DARM (GitHub) autorstwa Jurriaan Bremer to dezasembler ARMv7 napisany w C i jest dostępny na 3-klauzulowej licencji BSD.
Uwaga: obecnie nie obsługuje trybu kciuka.
Prosty przykład użycia DARM może wyglądać następująco:
// 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 ); }
Komentarze
- To wygląda na to, do czego zmierzałem! Przypuszczam, że mógłbym nawet użyć obu DARM i burza armii aby uzyskać pełne wsparcie …
Odpowiedź
Tak, IDA Pro „s SDK umożliwia dostęp do części składowych instrukcji za pośrednictwem klasy insn_t (w ua.hpp).
Komentarze
- To ' doskonale wiedzieć, ale ja ' szukam czegoś, co można by wywołać z poziomu innego programu i mam nadzieję, że ma liberalne licencje.
- @ BrendanDolan-Gavitt: może stwierdzenie, że w pytaniu jest więc dobrym pomysłem?
Odpowiedź
Bardziej aktualną odpowiedzią na to pytanie byłaby sugestia Biblioteka Capstone . Użyłem go do demontażu ARM i jest całkiem niezawodny. IMHO, to najlepsza dostępna biblioteka open source.
Biblioteka jest oparta na opisach instrukcji LLVM TabelGen. Dlatego jego obsługa ISA jest tak kompletna jak LLVM.