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ésassembler le fichier mbr
?
--target
au lieu de-b
.-D
est "démonter 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 sur l'archive).-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 i8086 dans le moteur de désasme universel x86)L'outil GNU s'appelle objdump , par exemple:
la source
-m i386
ou-Mintel,x86-64
.i8086
est une architecture ancienne et son utilisation pour du code moderne peut donner des résultats inattendus. De plus, spécifierx86-64
à-M
pourrait être une bonne idée de nos jours, car de nombreuses machines sont 64 bits. Passerintel
à-M
modifie la syntaxe en style Intel au lieu du style AT&T par défaut, ce que vous pouvez ou non vouloir.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.la source
Explication - 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 fictive 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 des appels relatifs au PC, à droite.-a
= Active le mode de synchronisation automatique (ou intelligente), dans lequel ndisasm tentera de deviner où la synchronisation doit être effectuée, en examinant les adresses cibles des sauts relatifs et en l'appelant à la désassemblage.-s
= Spécifie manuellement une adresse de synchronisation, de sorte que ndisasm ne sortira aucune instruction machine englobant 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ésassembler.la source
-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 et hlovdal ont tous deux des parties de la réponse canonique. Si vous souhaitez démonter du code i8086 brut, vous voulez généralement la syntaxe Intel, pas la syntaxe AT&T, alors utilisez:
Si votre code est ELF (ou a.out (ou (E) COFF)), vous pouvez utiliser la forme courte:
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 ilobjdump
est généralement fourni avec le système d'exploitation et peut gérer toutes les architectures prises en charge par GNU binutils (un sur-ensemble de celles prises en charge par GCC), et sa sortie peut généralement être introduite dans GNUas
(ndisasm peut généralement être introduitnasm
cependant, bien sûr).Peter Cordes suggère que « l'objconv d'Agner Fog est très gentil. Il met des étiquettes sur les cibles de branche, ce qui facilite beaucoup la compréhension de ce que fait le code. Il peut être désassemblé dans la syntaxe NASM, YASM, MASM ou AT&T (GNU). »
Multimédia Mike a déjà découvert
--adjust-vma
; l'ndisasm
équivalent est l'-o
option.Pour désassembler, disons, du
sh4
code (j'ai utilisé un binaire de Debian pour tester), utilisez ceci avec les binutils GNU (presque tous les autres désassembleurs sont limités à une plate-forme, comme x86 avecndisasm
etobjconv
):Le
-m
est la machine, et-EL
signifie Little Endian (àsh4eb
utiliser à la-EB
place), ce qui est pertinent pour les architectures qui existent dans les deux endianness.la source
gcc -O3 -masm=intel -fverbose-asm -S -o- | less
, car j'essaie généralement de modifier la source C pour la compiler en un bon asm.Essayez cette commande:
la source