¿Cómo desmonto el código de máquina x86 de 16 bits sin procesar?

91

Me gustaría desmontar el MBR (primeros 512 bytes) de un disco x86 de arranque que tengo. He copiado el MBR a un archivo usando

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

¿Alguna sugerencia para una utilidad de Linux que pueda desensamblar el archivo mbr?

sigjuice
fuente

Respuestas:

109

Puede utilizar objdump. Según este artículo, la sintaxis es:

objdump -D -b binary -mi386 -Maddr16,data16 mbr
hlovdal
fuente
¿Puede explicar qué hacen las opciones que especifique?
Hawken
11
o en --targetlugar de -b. -Des "desmontar el contenido de todas las secciones"; -b bfdnameo --target=bfdnameforzará la lectura como formato de código objeto especificado (no elf sino binario sin formato en nuestro caso); -m machineespecificará la arquitectura a usar (en nuestro archivo no hay un encabezado con información de arco). -M optionsson opciones de desensamblador; addr16,data16se utilizan para "especificar el tamaño predeterminado de la dirección y el tamaño del operando" (tratar el código como i8086 uno en el motor universal de desasos x86)
osgx
29

La herramienta GNU se llama objdump , por ejemplo:

objdump -D -b binary -m i8086 <file>
estrella azul
fuente
También puede configurar diferentes opciones para la arquitectura y la sintaxis. Por ejemplo, -m i386o -Mintel,x86-64. i8086es una arquitectura antigua y su uso para código moderno puede producir resultados inesperados. Además, especificar x86-64a -Mpodría ser una buena idea hoy en día, ya que muchas máquinas son de 64 bits. Pasar intela -Mcambia la sintaxis al estilo Intel en lugar del estilo predeterminado de AT&T, que puede que desee o no.
GDP2
24

Me gusta ndisasmpara este propósito. Viene con el ensamblador NASM, que es gratuito y de código abierto y se incluye en los repositorios de paquetes de la mayoría de las distribuciones de Linux.

asveikau
fuente
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.
22
ndisasm -b16 -o7c00h -a -s7c3eh mbr

Explicación : de la página de manual de ndisasm

  • -b= Especifica el modo de 16, 32 o 64 bits. El modo predeterminado es 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 los saltos y llamadas relativas a PC, a la derecha.
  • -a = Habilita el modo de sincronización automático (o inteligente), en el que ndisasm intentará adivinar dónde se debe realizar la sincronización, mediante el examen de las direcciones de destino de los saltos relativos y las llamadas desmonta.
  • -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 tanto, la instrucción que comienza en esa dirección se desmontará correctamente.
  • mbr = El archivo a desmontar.
jameslin
fuente
¿Qué hace esto en contraposición al simple desastre? ¿Puede explicar las opciones?
Hawken
4
¿Podría explicar qué significan y hacen esas opciones? Comprender una respuesta es mejor que simplemente obtener una.
Trineo
-b specifies 16-, 32- or 64-bit mode. The default is 16-bit mode. -o is the notional load address for the file. This option causes ndisasm to get the addresses it lists down the left hand margin, and the target addresses of PC-relative jumps and calls, right. -s specifies a synchronisation address, such that ndisasm will not output any machine instruction which encompasses bytes on both sides of the address. Hence the instruction which starts at that address will be correctly disassembled.
Janus Troelsen
15

starblue y hlovdal tienen partes de la respuesta canónica. Si desea desensamblar el código i8086 sin procesar, generalmente desea la sintaxis de Intel, no la sintaxis de AT&T, así que use:

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 su código es ELF (o a.out (o (E) COFF)), puede usar la forma corta:

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

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

ndisasm, como sugiere jameslin , también es una buena opción, pero objdumpgeneralmente viene con el sistema operativo y puede manejar todas las arquitecturas compatibles con GNU binutils (superconjunto de las compatibles con GCC), y su salida generalmente se puede alimentar a GNU as(los ndisasm generalmente pueden ser alimentados nasm, por supuesto).

Peter Cordes sugiere que “ la objconv de Agner Fog es muy agradable. Coloca etiquetas en los destinos de las ramas, lo que facilita mucho la comprensión de lo que hace el código. Puede desmontarse en sintaxis NASM, YASM, MASM o AT&T (GNU) ".

Multimedia Mike ya se enteró --adjust-vma; el ndisasmequivalente es la -oopción.

Para desensamblar, digamos, sh4código (usé un binario de Debian para probar), use esto con GNU binutils (casi todos los demás desensambladores están limitados a una plataforma, como x86 con ndisasmy objconv):

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

El -mes la máquina, y -ELsignifica Little Endian (para sh4ebusar -EBen su lugar), que es relevante para arquitecturas que existen en cualquier endianidad.

mirabilos
fuente
2
La objconv de Agner Fog es muy agradable. Coloca etiquetas en los destinos de las ramas , lo que facilita mucho la comprensión de lo que hace el código. Se puede desmontar en sintaxis NASM, YASM, MASM o AT&T (GNU).
Peter Cordes
Se construyó bien desde el primer momento en GNU / Linux, para mí. Pero sí, es solo x86 / x86-64, a diferencia de GNU binutils. Sin embargo, tiene muchas sugerencias interesantes específicas de x86 que agrega 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ónelo en su respuesta. Uno de los principales propósitos de los comentarios es ayudar al cartel a mejorar su respuesta, no solo como algo que los espectadores posteriores también deben leer.
Peter Cordes
1
@PeterCordes Sí, bueno, tengo MirBSD como sistema operativo principal;)
mirabilos
@PeterCordes pero parece que no puede desensamblar binarios en bruto, ¿verdad? Tuve que crear archivos ELF mínimos solo para poder introducir un montón de instrucciones, pero ¿tal vez me perdí alguna opción?
Ruslan
1
@Ruslan: IDK, pregunta interesante. Por lo general, solo uso objdump, o si quiero etiquetas de rama gcc -O3 -masm=intel -fverbose-asm -S -o- | less, ya que generalmente trato de modificar la fuente de C para compilar en un buen asm.
Peter Cordes
9

Prueba este comando:

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