2009-11-15 19 views
74

Je voudrais démonter le MBR (premiers 512 octets) d'un disque amorçable x86 que j'ai. J'ai copié le MBR à un fichier en utilisantComment désassembler le code x86 brut?

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

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

Répondre

89

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

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

pouvez-vous expliquer ce que les options que vous spécifiez faire? – Hawken

+10

ou '--target' au lieu de' -b'. '-D' est" désassembler le contenu de toutes les sections "; '-b bfdname' ou' --target = bfdname' forcera la lecture au format de code objet spécifié (pas elf mais binaire brut dans notre cas); '-m machine' spécifiera l'architecture à utiliser (dans notre fichier il n'y a pas d'en-tête avec des informations arch). '-M options' sont des options de désassembleur; 'addr16, data16' sont utilisés pour" spécifier la taille de l'adresse par défaut et la taille de l'opérande "(traiter le code comme un i8086 dans le moteur de disasm universel x86) – osgx

18

J'aime ndisasm à cet effet. Il est livré avec l'assembleur NASM, qui est gratuit et open source et inclus dans les dépôts de paquets de la plupart des distributions Linux.

+0

J'aime mieux cette réponse. Plus facile à utiliser, et je pourrais installer nasm sur OS X - objdump n'était pas là, et je ne veux pas le construire à partir de la source. –

+0

@ H2CO3 NASM est généralement préinstallé sur OS-X ... – Hawken

26

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

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

Vous pouvez également définir différentes options pour l'architecture et la syntaxe. Par exemple, '-m i386' ou' -Mintel, x86-64'. 'i8086' est une ancienne architecture et l'utiliser pour du code moderne peut donner des résultats inattendus. En outre, spécifier 'x86-64'' '-M' pourrait être une bonne idée de nos jours puisque de nombreuses machines sont en 64 bits. Passer 'intel' à' -M' change la syntaxe en style Intel au lieu du style AT & T par défaut, que vous pouvez ou non vouloir. – GDP2

7

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

16
ndisasm -b16 -o7c00h -a -s7c3eh mbr 

Explication - à partir de NDISASM manpage

  • -b = Indique 16, 32 ou 64 bits. La valeur par défaut est le mode 16 bits.
  • -o = Spécifie l'adresse de chargement fictive pour le fichier. Cette option amène ndisasm à obtenir les adresses qu'il répertorie dans la marge de gauche, et les adresses cibles des sauts et appels relatifs à 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 des appels qu'il désassemble.
  • -s = Spécifie manuellement une adresse de synchronisation, de sorte que ndisasm ne produise aucune instruction machine qui englobe les 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ésassembler.
+0

qu'est-ce que cela fait par opposition à ndisasm simple? Pouvez-vous expliquer les options – Hawken

+4

Pourriez-vous expliquer ce que ces options signifient et font? Comprendre une réponse est mieux que d'en obtenir un. – ArtB

+0

'-b spécifie le mode 16, 32 ou 64 bits. La valeur par défaut est le mode 16 bits. '' -o est l'adresse de chargement fictive du fichier. Cette option permet à ndisasm d'obtenir les adresses qu'il répertorie dans la marge gauche , et les adresses cibles des appels et des appels relatifs au PC, right.' '-s spécifie une adresse de synchronisation, de sorte que ndisasm ne génère aucune sortie instruction machine qui englobe les octets des deux côtés de l'adresse. Par conséquent, l'instruction qui commence à cette adresse sera correctement désassemblée. » –

8

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

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 la forme courte:

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

32 bits ou code 64 bits, omettre le ,8086; l'en-tête ELF inclut déjà cette information.

ndisasm, comme suggéré par jameslin, est également un bon choix, mais objdump vient généralement avec le système d'exploitation et peut faire face à toutes les architectures supportées par GNU binutils (sur-ensemble de ceux pris en charge par GCC), et sa sortie peuvent généralement être alimentés dans GNU as (ndisasm peut habituellement être introduit dans nasm bien que, bien sûr).

Peter Cordes suggère que "Agner Fog's objconv est très agréable. Il place les étiquettes sur les cibles de la branche, ce qui facilite beaucoup la compréhension du code. Il peut démonter en MSNA, yasm, MASM, ou AT & T (GNU) syntaxe « déjà

Multimedia Mike trouvé à propos de --adjust-vma. l'équivalent ndisasm est l'option -o.

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

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

le -m est la machine, et des moyens -EL little endian (pour sh4eb utilisation -EB place), qui est pertinente pour les architectures qui existent dans les deux endianness.

+2

[objconv Agner Fog] (http://agner.org/optimize/) est très agréable. Il place les étiquettes sur les cibles * de la 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). –

+0

Il s'est bien construit dès la sortie de la boîte sur GNU/Linux, pour moi. Mais oui, c'est seulement x86/x86-64, contrairement à binutils GNU. Cependant, il a beaucoup de jolis indices spécifiques x86 qu'il ajoute en tant que commentaires, comme lorsqu'un préfixe de taille d'opérande peut causer un décrochage LCP dans les décodeurs d'un processeur Intel. Par tous les moyens, mentionnez-le dans votre réponse. L'un des principaux objectifs des commentaires est d'aider l'auteur à améliorer sa réponse, pas seulement comme quelque chose que les téléspectateurs ultérieurs ont besoin de lire aussi. –

+1

@PeterCordes Oui bien j'ai MirBSD comme OS principal;) – mirabilos