2012-06-24 46 views
7

Buscando en algún código ensamblador para x86_64 en mi Mac, veo la siguiente instrucción:¿Cómo implico este opcode de ensamblaje x86_64?

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

Pero en ninguna parte puedo encontrar una referencia que se rompe el código de operación. Parece que 48c7 es una instrucción de movimiento, c0 define el registro de% rax, etc.

Entonces, ¿dónde puedo encontrar una referencia que me diga todo eso?

Conozco http://ref.x86asm.net/, pero mirando 48 códigos de operación, no veo nada que se parezca a un movimiento.

+1

He visto preguntas similares aquí. Si pudiera encontrar esto en Google, no habría preguntado. El hecho de que conozco la referencia que publiqué en mi pregunta también muestra que no soy demasiado perezoso para buscarme a mí mismo. – Christoph

+1

@Oded, googlear para "prefijo de instrucción x86 0x48" es bastante complicado si no sabes lo que estás buscando ... – Griwes

+0

@Oded Reescribí mi pregunta para ser más específica del desarrollador. Dada la (¡muy buena!) Referencia en x86asm.net, supongo que necesito entender cómo se descompone ese código de operación. Griwes ayudó con eso. – Christoph

Respuesta

10

En realidad, mov es 0xc7 there; 0x48 es, en este caso, un modo largo REX.W prefix.

Respondiendo también a la pregunta en los comentarios: 0xc0 es b11000000. Here puede encontrar que con REX.B = 0 (como el prefijo REX es 0x48, el bit .B está desactivado), 0xc0 significa "RAX es el primer operando" (en sintaxis Intel; mov rax, 1, RAX es el primero, o, en el caso de mov, salida operando). Puede averiguar cómo leer ModR/M here.

+0

¡Gracias, eso ayuda! Tal vez debería reformular mi pregunta. – Christoph

+0

¿Qué pasa con el c0? ¿Dónde entra eso? – Christoph

+0

@Christoph, explicación adicional en respuesta. – Griwes

1

Cuando nos fijamos en el binario

48 c7 c0 01 00 00 00 

que necesita para desmontarlo con el fin de entender su significado.

El algoritmo para el desmontaje no es difícil, pero es complejo. Supone buscar varias tablas.

El algoritmo se describe en el segundo volumen del Manual de desarrolladores de Intel,

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

de comenzar a leer desde el capítulo llamado INSTRUCTION FORMAT.

O, hay buenos libros que se dedican capítulos enteros sobre este tema, como

X86 Instruction Set Architecture, Mindshare, by Tom Shanley. 

Un capítulo entero está dedicado a desmontar X86 binario.

O puede comenzar a leer el algoritmo general de un manual para el mismo lenguaje hecho por AMD:

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

Aquí, en el capítulo Instruction Encoding se encuentra el autómata que define a este idioma de las instrucciones, y desde este esquema gráfico puede escribir fácilmente el decodificador.

Después de hacer esto, puede volver al Manual de Intel, segundo volumen, y utilizarlo como libro de referencia.

También encontré útil el reverse engineering class de http://opensecuritytraining.info/. Este sitio ha sido creado por un estudiante de doctorado de CMU, la mayoría no está bien hecho, pero requiere más tiempo para estudiarlo y aplicarlo.

Después de comprender las ideas básicas, puede consultar un proyecto gratuito que implementa el algoritmo. Encontré útil el proyecto distorm.Al principio, es importante no mirar proyectos abstractos (como qemu u objdump), que intentan implementar disasemblers para muchos idiomas en el mismo código que se perderá. Distorm se centra solo en x86 y lo implementa de forma correcta y exhaustiva. Transmite en lenguaje formal la definición de lenguaje X86, mientras que los manuales de Intel y AMD definen el lenguaje X86 mediante el uso del lenguaje natural.

Otro proyecto que funciona bien es udis86.

+0

¿Te refieres al algoritmo para desmontar? Suena al principio como si estuvieras llamando 'mov' a un algoritmo. –

+0

correcto, corregido. – alinsoar

Cuestiones relacionadas