Pergunta

Eu gostaria de desmontar o MBR (primeiros 512 bytes) de um disco x86 inicializável que eu tenho. Eu copiei o MBR para um arquivo usando

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

Quaisquer sugestões para um utilitário Linux que possa desmontar o arquivo mbr?

Foi útil?

Solução

Você pode usar o Objdump. De acordo com Este artigo A sintaxe é:

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

Outras dicas

A ferramenta GNU é chamada objdump, por exemplo:

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

Eu gosto ndisasm para esse fim. Ele vem com o Nasm Montatbler, que é gratuito e de código aberto e incluído nos repositórios de pacotes da maioria dos distritos do Linux.

ndisasm -b16 -o7c00h -a -s7c3eh mbr

Explicação - da manpra de ndisansasm

  • -b = Especifica o modo 16-, 32 ou 64 bits. O padrão é o modo de 16 bits.
  • -o = Especifica o endereço de carga nocional para o arquivo. Esta opção faz com que o NDISASM obtenha os endereços que ele lista na margem esquerda e os endereços de destino dos saltos e chamadas de PC, à direita.
  • -a = Ativa o modo de sincronização automático (ou inteligente), no qual o NDISASM tentará adivinhar onde a sincronização deve ser executada, por meio de examinar os endereços de destino dos saltos relativos e a chama de desmontar.
  • -s = Especifica manualmente um endereço de sincronização, de modo que o NDISASM não produza nenhuma instrução da máquina que abranja bytes nos dois lados do endereço. Portanto, a instrução que inicia nesse endereço será desmontada corretamente.
  • mbr = O arquivo a ser desmontado.

Starblue e Hlovdal Ambos têm partes da resposta canônica. Se você deseja desmontar o código RAW i8086, geralmente deseja sintaxe Intel, não a Sintaxe da AT&T também, então 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

Se o seu código for elfo (ou A.out (ou (e) Coff)), você poderá usar o formulário curto:

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 ou 64 bits, omite o ,8086; O cabeçalho ELF já inclui essas informações.

ndisasm, como sugerido por Jameslin, também é uma boa escolha, mas objdump Geralmente vem com o sistema operacional e pode lidar com todas as arquiteturas suportadas pelo GNU Binutils (Superset daqueles suportados pelo GCC), e sua saída geralmente pode ser alimentada no GNU as (NDISASM geralmente pode ser alimentado nasm embora, é claro).

Peter Cordes sugere que "Objconv de Agner Fog é muito legal. Ele coloca os rótulos em alvos de ramificação, facilitando muito a descoberta do que o código faz. Pode desmontar a sintaxe Nasm, Yasm, Masm ou AT&T (GNU). ”

Mike multimídia já descobri --adjust-vma; a ndisasm equivalente é o -o opção.

Para desmontar, digamos, sh4 Código (usei um binário do Debian para testar), use -o com binutils GNU (quase todos os outros desmontadores são limitados a uma plataforma, como x86 com ndisasm e objconv):

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

o -m é a máquina e -EL significa pequeno endian (para sh4eb usar -EB em vez disso), que é relevante para arquiteturas que existem em ambos os endianos.

Experimente este comando:

sudo dd if=/dev/sda bs=512 count=1 | ndisasm -b16 -o7c00h -
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top