Bagaimana cara membongkar kode mesin 16-bit x86 mentah?

91

Saya ingin membongkar MBR (512 byte pertama) dari disk x86 bootable yang saya miliki. Saya telah menyalin MBR ke file menggunakan

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

Ada saran untuk utilitas Linux yang dapat membongkar file mbr?

sigjuice.dll
sumber

Jawaban:

109

Anda bisa menggunakan objdump. Menurut artikel ini sintaksnya adalah:

objdump -D -b binary -mi386 -Maddr16,data16 mbr
hlovdal.dll
sumber
dapatkah Anda menjelaskan opsi apa yang Anda tentukan?
Hawken
11
atau --targetalih-alih -b. -Dadalah "membongkar isi dari semua bagian"; -b bfdnameatau --target=bfdnameakan memaksa membaca sebagai format kode objek yang ditentukan (bukan elf tetapi biner mentah dalam kasus kami); -m machineakan menentukan arsitektur yang akan digunakan (dalam file kami tidak ada header dengan info arch). -M optionsadalah pilihan disassembler; addr16,data16digunakan untuk "menentukan ukuran alamat default dan ukuran operan" (perlakukan kode sebagai i8086 di mesin disasm universal x86)
osgx
30

Alat GNU disebut objdump , misalnya:

objdump -D -b binary -m i8086 <file>
starblue
sumber
Anda juga dapat mengatur opsi berbeda untuk arsitektur dan sintaks. Misalnya, -m i386atau -Mintel,x86-64. i8086adalah arsitektur lama dan menggunakannya untuk kode modern dapat memberikan hasil yang tidak diharapkan. Selain itu, menentukan x86-64menjadi -Mmungkin merupakan ide yang bagus saat ini karena banyak mesin yang 64-bit. Meneruskan inteluntuk -Mmengubah sintaks ke gaya Intel alih-alih gaya AT&T default, yang mungkin Anda inginkan atau tidak inginkan.
GDP2
24

Saya suka ndisasmuntuk tujuan ini. Itu datang dengan assembler NASM, yang gratis dan open source dan termasuk dalam repositori paket dari sebagian besar distro linux.

asveikau
sumber
Saya lebih menyukai jawaban ini. Lebih mudah digunakan, dan saya dapat menginstal nasm di OS X - objdump tidak ada, dan saya tidak ingin membangunnya dari sumber.
23
ndisasm -b16 -o7c00h -a -s7c3eh mbr

Penjelasan - dari halaman manual ndisasm

  • -b= Menentukan mode 16-, 32- atau 64-bit. Standarnya adalah mode 16-bit.
  • -o= Menentukan alamat pemuatan nosional untuk file. Pilihan ini menyebabkan ndisasm untuk mendapatkan alamat yang dicantumkan di bawah margin kiri, dan alamat target lompatan dan panggilan relatif-PC, kanan.
  • -a = Mengaktifkan mode sinkronisasi otomatis (atau cerdas), di mana ndisasm akan mencoba menebak di mana sinkronisasi harus dilakukan, dengan cara memeriksa alamat target dari lompatan relatif dan menyebutnya membongkar.
  • -s= Secara manual menentukan alamat sinkronisasi, sehingga ndisasm tidak akan mengeluarkan instruksi mesin apa pun yang mencakup byte di kedua sisi alamat. Oleh karena itu instruksi yang dimulai pada alamat itu akan dibongkar dengan benar.
  • mbr = File yang akan dibongkar.
jameslin
sumber
apa fungsinya sebagai lawan dari ndisasm sederhana? Bisakah Anda menjelaskan opsinya
Hawken
4
Bisakah Anda menjelaskan apa arti dan fungsi opsi tersebut? Memahami jawaban lebih baik daripada hanya mendapatkannya.
Kereta luncur
-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.
Janus Troelsen
15

starblue dan hlovdal keduanya memiliki bagian dari jawaban kanonik. Jika Anda ingin membongkar kode i8086 mentah, Anda biasanya menginginkan sintaks Intel, bukan sintaks AT&T juga, jadi gunakan:

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

Jika kode Anda adalah ELF (atau a.out (atau (E) COFF)), Anda dapat menggunakan formulir singkat:

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

Untuk kode 32-bit atau 64-bit, hilangkan ,8086; header ELF sudah menyertakan informasi ini.

ndisasm, seperti yang disarankan oleh jameslin , juga merupakan pilihan yang baik, tetapi objdumpbiasanya dilengkapi dengan OS dan dapat menangani semua arsitektur yang didukung oleh GNU binutils (superset dari yang didukung oleh GCC), dan keluarannya biasanya dapat dimasukkan ke GNU as(ndisasm's biasanya dapat diumpankan nasm, tentu saja).

Peter Cordes menyarankan bahwa “ Tujuan Agner Fog sangat bagus. Ini menempatkan label pada target cabang, membuat lebih mudah untuk mengetahui apa yang dilakukan kode. Itu dapat dibongkar menjadi sintaks NASM, YASM, MASM, atau AT&T (GNU). ”

Multimedia yang sudah diketahui Mike--adjust-vma ; yang ndisasmsetara adalah -opilihan.

Untuk membongkar, katakanlah, sh4kode (saya menggunakan satu biner dari Debian untuk menguji), gunakan ini dengan GNU binutils (hampir semua disassembler lainnya dibatasi pada satu platform, seperti x86 dengan ndisasmdan objconv):

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

The -mis the machine, dan -ELartinya Little Endian (untuk sh4ebdigunakan -EBsebagai gantinya), yang relevan untuk arsitektur yang ada di kedua endian.

mirabilos
sumber
2
Tujuan Agner Fog sangat bagus. Ini menempatkan label pada target cabang , membuat lebih mudah untuk mengetahui apa yang dilakukan kode. Itu dapat dibongkar menjadi sintaks NASM, YASM, MASM, atau AT&T (GNU).
Peter Cordes
Itu dibangun dengan baik langsung dari kotak di GNU / Linux, bagi saya. Tapi ya, ini hanya x86 / x86-64, tidak seperti GNU binutils. Namun, ia memiliki banyak petunjuk khusus x86 yang bagus yang ditambahkan sebagai komentar, seperti ketika awalan ukuran operan dapat menyebabkan LCP-stall di decoder CPU Intel. Dengan segala cara, sebutkan dalam jawaban Anda. Salah satu tujuan utama komentar adalah untuk membantu poster meningkatkan jawaban mereka, tidak hanya sebagai sesuatu yang perlu dibaca juga oleh pemirsa di kemudian hari.
Peter Cordes
1
@PeterCordes Ya, saya memiliki MirBSD sebagai OS utama;)
mirabilos
@PeterCordes tetapi tampaknya tidak dapat membongkar biner mentah, bukan? Saya harus membuat file ELF minimal hanya untuk dapat memasukkan banyak instruksi ke dalamnya, tetapi mungkin saya melewatkan beberapa opsi?
Ruslan
1
@Ruslan: IDK, pertanyaan menarik. Saya biasanya hanya menggunakan objdump, atau jika saya ingin label cabang gcc -O3 -masm=intel -fverbose-asm -S -o- | less, karena saya biasanya mencoba mengubah sumber C menjadi kompilasi menjadi asm yang baik.
Peter Cordes
9

Coba perintah ini:

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