2009-11-15 14 views
74

Me gustaría desensamblar el MBR (primeros 512 bytes) de un disco x86 de arranque que tengo. He copiado el MBR a un archivo usando¿Cómo desarmo el código x86 sin formato?

dd if=/dev/my-device of=mbr bs=512 count=1 

alguna sugerencia para una utilidad de Linux que puede desmontar el archivo mbr?

Respuesta

89

Puede usar objdump. De acuerdo con this article la sintaxis es:

objdump -D -b binary -mi386 -Maddr16,data16 mbr 
+0

¿Puedes explicarnos qué hacen las opciones que especifiques? – Hawken

+10

o '--target' en lugar de' -b'. '-D' es" desmontar el contenido de todas las secciones "; '-b bfdname' o' --target = bfdname' forzarán la lectura como formato de código de objeto especificado (no elf sino binario en bruto en nuestro caso); '-m machine' especificará la arquitectura a usar (en nuestro archivo no hay encabezado con información de arco). '-M options' son opciones de desensamblador; 'addr16, data16' se usan para" especificar el tamaño de dirección predeterminado y el tamaño del operando "(tratar el código como i8086 uno en el motor universal de desastres x86) – osgx

18

me gusta ndisasm para este propósito. Viene con el ensamblador NASM, que es gratuito y de código abierto e incluido en los repositorios de paquetes de la mayoría de las distribuciones de Linux.

+0

Me gusta más esta respuesta. Más fácil de usar, y podría instalar Nasm en OS X - objdump no estaba allí, y no quiero compilarlo desde la fuente. –

+0

@ H2CO3 NASM suele estar preinstalado en OS-X ... – Hawken

26

La herramienta se llama GNU objdump, por ejemplo:

objdump -D -b binary -m i8086 <file> 
+0

También puede establecer diferentes opciones para la arquitectura y la sintaxis. Por ejemplo, '-m i386' o' -Mintel, x86-64'. 'i8086' es una arquitectura antigua y su uso para un código moderno puede producir resultados inesperados. Además, especificar 'x86-64' a' -M' podría ser una buena idea hoy en día ya que muchas máquinas son de 64 bits. Pasar 'intel' a' -M' cambia la sintaxis a estilo Intel en lugar del estilo AT & T predeterminado, que puede o no desear. – GDP2

7

sudo dd if =/dev/sda bs = 512 count = 1 | ndisasm -b16 -o7c00h -

16
ndisasm -b16 -o7c00h -a -s7c3eh mbr 

Explicación - de página de manual ndisasm

  • -b = Especifica 16-, el modo de 32 o 64 bits. El valor predeterminado es el modo de 16 bits.
  • -o = Especifica la dirección de carga teórica para el archivo. Esta opción hace que ndisasm obtenga las direcciones que enumera en el margen izquierdo, y las direcciones de destino de saltos y llamadas relativos a PC, a la derecha.
  • -a = Habilita el modo de sincronización automática (o inteligente), en el que ndisasm intentará adivinar dónde debe realizarse la sincronización, mediante el examen de las direcciones de destino de los saltos relativos y las llamadas que desensambla.
  • -s = Especifica manualmente una dirección de sincronización, de modo que ndisasm no generará ninguna instrucción de máquina que abarque bytes en ambos lados de la dirección. Por lo tanto, la instrucción que comienza en esa dirección se desmontará correctamente.
  • mbr = El archivo que se va a desmontar.
+0

¿Qué hace esto en comparación con el simple ndisasm? ¿Puedes explicar las opciones? – Hawken

+4

¿Podrías explicar qué significan y qué significan esas opciones? Comprender una respuesta es mejor que solo obtener una. – ArtB

+0

'-b especifica el modo de 16, 32 o 64 bits. El valor predeterminado es el modo de 16 bits. '-o es la dirección de la carga teórica para el archivo. Esta opción hace que ndisasm obtenga las direcciones que enumera en el margen izquierdo , y las direcciones de destino de saltos y llamadas relativos a PC, right'' -s especifica una dirección de sincronización, de modo que ndisasm no generará ninguna salida instrucción de máquina que abarca los bytes en ambos lados de la dirección. Por lo tanto, la instrucción que comienza en en esa dirección se desarmará correctamente. –

8

starblue y hlovdal ambos tienen partes de la respuesta canónica. Si desea desmontar código i8086 prima, normalmente se quiere sintaxis Intel, AT no & sintaxis T, también, a fin de utilizar:

objdump -D -Mintel,i8086 -b binary -m i386 mbr.bin 
objdump -D -Mintel,i386 -b binary -m i386 foo.bin # for 32-bit code 
objdump -D -Mintel,x86-64 -b binary -m i386 foo.bin # for 64-bit code 

Si el código es ELF (o a.out (o (E) COFF)), se puede utilizar la forma corta:

objdump -D -Mintel,i8086 a.out # disassembles the entire file 
objdump -d -Mintel,i8086 a.out # disassembles only code sections 

Para el código de 32 bits o de 64 bits, omita el ,8086; el encabezado ELF ya incluye esta información.

ndisasm, según lo sugerido por jameslin, es también una buena opción, pero objdump por lo general viene con el sistema operativo y puede hacer frente a todas las arquitecturas soportadas por GNU binutils (superconjunto de los apoyados por GCC), y su salida por lo general se puede alimentar en GNU as (ndisasm por lo general se puede alimentar a nasm, por supuesto).

Peter Cordes sugiere que "Agner Fog's objconv es muy bueno. Coloca etiquetas en los destinos de las ramificaciones, facilitando mucho más descubrir qué hace el código. Se puede desmontar en NASM, YASM, MASM, o AT & T sintaxis (GNU) “

Multimedia Mike ya se enteraron de --adjust-vma.; el equivalente ndisasm es la opción -o.

Para desmontar, por ejemplo, sh4 código (que utiliza uno binario de Debian para probar), utilice esto con GNU binutils (casi todos los otros desensambladores se limitan a una plataforma, como x86 con ndisasm y objconv):

objdump -D -b binary -m sh -EL x 

el -m es la máquina, y -EL significa Little Endian (por sh4eb uso -EB lugar), que es relevante para las arquitecturas que existen en cualquiera endianness.

+2

[objconv de Agner Fog] (http://agner.org/optimize/) es muy agradable. Pone las etiquetas en branch * targets *, haciendo que sea mucho más fácil averiguar qué hace el código. Se puede desensamblar en sintaxis NASM, YASM, MASM o AT & T (GNU). –

+0

Construyó bien desde el primer momento en GNU/Linux, para mí. Pero sí, solo es x86/x86-64, a diferencia de los binutils de GNU. Sin embargo, tiene un montón de bonitos consejos específicos de x86 que se agregan como comentarios, como cuando un prefijo de tamaño de operando puede causar un bloqueo de LCP en los decodificadores de una CPU Intel. Por supuesto, menciónalo en tu respuesta. Uno de los propósitos principales de los comentarios es ayudar al aficionado a mejorar su respuesta, no solo como algo que los espectadores posteriores también deben leer. –

+1

@PeterCordes Sí, bueno, tengo MirBSD como sistema operativo principal;) – mirabilos

Cuestiones relacionadas