web-dev-qa-db-fra.com

Comment démonter le code machine x86 16 bits brut?

Je voudrais démonter le MBR (512 premiers octets) d'un disque x86 amorçable que j'ai. J'ai copié le MBR dans un fichier en utilisant

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

Des suggestions pour un utilitaire Linux qui peut démonter le fichier mbr?

86
sigjuice

Vous pouvez utiliser objdump. Selon cet article la syntaxe est:

objdump -D -b binary -mi386 -Maddr16,data16 mbr
100
hlovdal

L'outil GNU est appelé objdump, par exemple:

objdump -D -b binary -m i8086 <file>
26
starblue

J'aime ndisasm à cet effet. Il est livré avec l'assembleur NASM, qui est gratuit et open source et inclus dans les référentiels de packages de la plupart des distributions Linux.

20
asveikau
ndisasm -b16 -o7c00h -a -s7c3eh mbr

Explication - à partir de la page de manuel ndisasm

  • -b = Spécifie le mode 16, 32 ou 64 bits. La valeur par défaut est le mode 16 bits.
  • -o = Spécifie l'adresse de chargement théorique du fichier. Cette option permet à ndisasm d'obtenir les adresses qu'il répertorie dans la marge de gauche et les adresses cibles des sauts et appels relatifs au PC, à droite.
  • -a = Active le mode de synchronisation automatique (ou intelligent), dans lequel ndisasm tentera de deviner où la synchronisation doit être effectuée, en examinant les adresses cibles des sauts relatifs et les appelle à se désassembler.
  • -s = Spécifie manuellement une adresse de synchronisation, de telle sorte que ndisasm ne produira aucune instruction machine qui contienne des octets des deux côtés de l'adresse. Par conséquent, l'instruction qui commence à cette adresse sera correctement démontée.
  • mbr = Le fichier à démonter.
19
jameslin

starblue et hlovdal ont tous deux des parties de la réponse canonique. Si vous souhaitez désassembler le code i8086 brut, vous voulez généralement la syntaxe Intel, pas la syntaxe AT&T aussi, alors utilisez:

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 votre code est ELF (ou a.out (ou (E) COFF)), vous pouvez utiliser le formulaire court:

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

Pour le code 32 bits ou 64 bits, omettez le ,8086; l'en-tête ELF contient déjà ces informations.

ndisasm, comme suggéré par jameslin , est également un bon choix, mais objdump est généralement fourni avec le système d'exploitation et peut gérer toutes les architectures prises en charge par GNU binutils (surensemble de ceux pris en charge par GCC), et sa sortie peut généralement être introduite dans GNU as (les ndisasm peuvent généralement être introduits dans nasm bien sûr).

Peter Cordes suggère que " l'objconv d'Agner Fog est très agréable. Il met des étiquettes sur les cibles de branche, ce qui facilite beaucoup la compréhension de ce que fait le code. Il peut se désassembler en syntaxe NASM, YASM, MASM ou AT&T (GNU). "

Mike multimédia a déjà découvert --adjust-vma; l'équivalent ndisasm est le -o option.

Pour démonter, par exemple, sh4 code (j'ai utilisé un binaire de Debian pour tester), utilisez-le avec GNU binutils (presque tous les autres désassembleurs sont limités à une seule plate-forme, comme x86 avec ndisasm et objconv):

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

Le -m est la machine et -EL signifie Little Endian (pour sh4eb utilisation -EB à la place), ce qui est pertinent pour les architectures qui existent dans les deux endianness.

12
mirabilos

Essayez cette commande:

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