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
?
--target
lugar de-b
.-D
es "desmontar el contenido de todas las secciones";-b bfdname
o--target=bfdname
forzará la lectura como formato de código objeto especificado (no elf sino binario sin formato en nuestro caso);-m machine
especificará la arquitectura a usar (en nuestro archivo no hay un encabezado con información de arco).-M options
son opciones de desensamblador;addr16,data16
se 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)La herramienta GNU se llama objdump , por ejemplo:
fuente
-m i386
o-Mintel,x86-64
.i8086
es una arquitectura antigua y su uso para código moderno puede producir resultados inesperados. Además, especificarx86-64
a-M
podría ser una buena idea hoy en día, ya que muchas máquinas son de 64 bits. Pasarintel
a-M
cambia la sintaxis al estilo Intel en lugar del estilo predeterminado de AT&T, que puede que desee o no.Me gusta
ndisasm
para 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.fuente
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.fuente
-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.
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:
Si su código es ELF (o a.out (o (E) COFF)), puede usar la forma corta:
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, peroobjdump
generalmente 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 GNUas
(los ndisasm generalmente pueden ser alimentadosnasm
, 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
; elndisasm
equivalente es la-o
opción.Para desensamblar, digamos,
sh4
có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 conndisasm
yobjconv
):El
-m
es la máquina, y-EL
significa Little Endian (parash4eb
usar-EB
en su lugar), que es relevante para arquitecturas que existen en cualquier endianidad.fuente
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.Prueba este comando:
fuente