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
?
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
?
Jawaban:
Anda bisa menggunakan objdump. Menurut artikel ini sintaksnya adalah:
objdump -D -b binary -mi386 -Maddr16,data16 mbr
--target
alih-alih -b
. -D
adalah "membongkar isi dari semua bagian"; -b bfdname
atau --target=bfdname
akan memaksa membaca sebagai format kode objek yang ditentukan (bukan elf tetapi biner mentah dalam kasus kami); -m machine
akan menentukan arsitektur yang akan digunakan (dalam file kami tidak ada header dengan info arch). -M options
adalah pilihan disassembler; addr16,data16
digunakan untuk "menentukan ukuran alamat default dan ukuran operan" (perlakukan kode sebagai i8086 di mesin disasm universal x86)
Alat GNU disebut objdump , misalnya:
objdump -D -b binary -m i8086 <file>
-m i386
atau -Mintel,x86-64
. i8086
adalah arsitektur lama dan menggunakannya untuk kode modern dapat memberikan hasil yang tidak diharapkan. Selain itu, menentukan x86-64
menjadi -M
mungkin merupakan ide yang bagus saat ini karena banyak mesin yang 64-bit. Meneruskan intel
untuk -M
mengubah sintaks ke gaya Intel alih-alih gaya AT&T default, yang mungkin Anda inginkan atau tidak inginkan.
Saya suka ndisasm
untuk tujuan ini. Itu datang dengan assembler NASM, yang gratis dan open source dan termasuk dalam repositori paket dari sebagian besar distro linux.
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.-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 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 objdump
biasanya 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 ndisasm
setara adalah -o
pilihan.
Untuk membongkar, katakanlah, sh4
kode (saya menggunakan satu biner dari Debian untuk menguji), gunakan ini dengan GNU binutils (hampir semua disassembler lainnya dibatasi pada satu platform, seperti x86 dengan ndisasm
dan objconv
):
objdump -D -b binary -m sh -EL x
The -m
is the machine, dan -EL
artinya Little Endian (untuk sh4eb
digunakan -EB
sebagai gantinya), yang relevan untuk arsitektur yang ada di kedua endian.
gcc -O3 -masm=intel -fverbose-asm -S -o- | less
, karena saya biasanya mencoba mengubah sumber C menjadi kompilasi menjadi asm yang baik.