2012-06-24 6 views
7

Guardando alcune codice assembly per x86_64 sul mio Mac, compaiono i seguenti istruzioni:In che modo si interpet questo opcode assembly x86_64?

48 c7 c0 01 00 00 00 movq $0x1,%rax 

Ma da nessuna parte mi può trovare un riferimento che rompe il codice operativo. Sembra che 48c7 sia un'istruzione di movimento, c0 definisce il registro% rax, ecc.

Quindi, dove posso trovare un riferimento che mi dice tutto questo?

Sono a conoscenza di http://ref.x86asm.net/, ma guardando a 48 codici operativi, non vedo nulla che assomigli a una mossa.

+1

Ho visto domande simili qui. Se potessi trovare questo su Google, non avrei chiesto. Il fatto di essere a conoscenza del riferimento che ho inserito nella mia domanda dimostra anche che non sono troppo pigro per cercare me stesso. – Christoph

+1

@Oded, googling per "x86 0x50 prefisso istruzioni" è piuttosto complicato se non sai cosa stai cercando ... – Griwes

+0

@Oded Ho riformulato la mia domanda per essere più specifico per lo sviluppatore. Visto il riferimento (veramente buono!) A x86asm.net, credo di aver solo bisogno di capire come si rompe quel codice operativo. Griwes mi ha aiutato. – Christoph

risposta

10

In realtà, mov è 0xc7; 0x48 è, in questo caso, una modalità lunga REX.W prefix.

Risposta anche alla domanda nei commenti: 0xc0 è b11000000. Here è possibile scoprire che con REX.B = 0 (come prefisso REX è 0x48, il bit .B è non impostato), 0xc0 significa "RAX è il primo operando" (in sintassi Intel; mov rax, 1, RAX è il primo, oppure, nel caso di mov, output operando). Puoi scoprire come leggere ModR/M here.

+0

Grazie, questo aiuta! Forse dovrei riformulare la mia domanda. – Christoph

+0

E il c0? Da dove viene? – Christoph

+0

@Christoph, aggiunta spiegazione nella risposta. – Griwes

1

Quando si guarda il binario

48 c7 c0 01 00 00 00 

è necessario smontarlo per capire il suo significato.

L'algoritmo per lo smontaggio non è difficile, ma è complesso. Suppone di cercare più tabelle.

L'algoritmo è descritto nel 2 ° volume di Intel Developer Manuale,

Intel® 64 and IA-32 Architectures 
Software Developer’s Manual 
Volume 2 (2A, 2B & 2C): 
Instruction Set Reference, A-Z 

di iniziare a leggere dal capitolo intitolato INSTRUCTION FORMAT.

Oppure, ci sono buoni libri che dedicano interi capitoli su questo argomento, come ad esempio

X86 Instruction Set Architecture, Mindshare, by Tom Shanley. 

Un intero capitolo è dedicato a smontare X86 binario.

Oppure si può iniziare a leggere l'algoritmo generale da un manuale per la stessa lingua fatta da AMD:

AMD64 Architecture 
Programmer’s Manual 
Volume 3: 
General-Purpose and System Instructions 

Qui, nel capitolo Instruction Encoding troverete l'automa che definisce questo linguaggio di istruzioni, e da questo schema grafico è possibile scrivere facilmente il decoder.

Dopo aver eseguito questa operazione, è possibile tornare al Manuale Intel, 2 ° volume, e utilizzarlo come libro di riferimento.

Ho trovato utile anche lo reverse engineering class da http://opensecuritytraining.info/. Questo sito è stato creato da uno studente di dottorato della CMU, la maggior parte non è ben fatto, ma richiede più tempo per studiarlo e applicarlo.

Dopo aver compreso le idee di base, è possibile esaminare un progetto gratuito che implementa l'algoritmo. Ho trovato utile il progetto distorm.All'inizio è importante non guardare a progetti astratti (come qemu o objdump), che cercano di implementare dissasembler per molte lingue nello stesso codice in cui ti perderai. Distorm si concentra solo su x86 e lo implementa correttamente ed esaurientemente. Trasmette in linguaggio formale la definizione del linguaggio X86, mentre i manuali Intel e AMD definiscono il linguaggio X86 usando il linguaggio naturale.

Altro progetto che funziona bene è udis86.

+0

Intendi l'algoritmo per il disassemblaggio? All'inizio sembra che tu stia chiamando 'mov' un algoritmo. –

+0

corretto, corretto. – alinsoar

Problemi correlati