Ham 16 bit x86 makine kodunu nasıl parçalarına ayırabilirim?


92

Sahip olduğum önyüklenebilir bir x86 diskinin MBR'sini (ilk 512 bayt) sökmek istiyorum. MBR'yi kullanarak bir dosyaya kopyaladım

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

Dosyayı parçalarına ayırabilen bir Linux yardımcı programı için herhangi bir öneriniz var mbrmı?

Yanıtlar:


110

Objdump kullanabilirsiniz. Bu makaleye göre sözdizimi şöyledir:

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

belirlediğiniz seçeneklerin ne işe yaradığını açıklayabilir misiniz?
Hawken

11
veya --targetyerine -b. -D"tüm bölümlerin içeriğini parçalarına ayırın"; -b bfdnameveya --target=bfdnamebelirtilen nesne kodu formatında okumaya zorlar (bizim durumumuzda elf değil, ham ikili); -m machinekullanılacak mimariyi belirleyecektir (dosyamızda kemer bilgisine sahip başlık yoktur). -M optionssökücü seçenekleridir; addr16,data16"varsayılan adres boyutunu ve işlenen boyutunu belirtmek" için kullanılır (kodu evrensel x86 disasm motorunda i8086 olarak ele alın)
osgx

30

GNU aracı objdump olarak adlandırılır , örneğin:

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

Ayrıca mimari ve sözdizimi için farklı seçenekler de ayarlayabilirsiniz. Örneğin, -m i386veya -Mintel,x86-64. i8086eski bir mimaridir ve modern kod için kullanılması beklenmedik sonuçlar doğurabilir. Dahası, belirterek x86-64etmek -Mpek makineler 64 bit olduğundan günümüzde iyi bir fikir olabilir. Geçme inteliçin -MIntel tarzı yerine sizin veya istediğiniz olmayabilir varsayılan AT & T tarzı, değişiklikler sözdizimi.
GDP2

24

ndisasmBu amacı seviyorum . Ücretsiz ve açık kaynaklı olan ve çoğu linux dağıtımının paket depolarında bulunan NASM assembler ile birlikte gelir.


Bu cevabı daha çok beğendim. Kullanımı daha kolay ve OS X'e nasm yükleyebilirim - objdump orada değildi ve onu kaynaktan oluşturmak istemiyorum.

23
ndisasm -b16 -o7c00h -a -s7c3eh mbr

Açıklama - ndisasm kılavuz sayfasından

  • -b= 16-, 32- veya 64-bit modunu belirtir. Varsayılan, 16 bit modudur.
  • -o= Dosya için kavramsal yükleme adresini belirtir. Bu seçenek, ndisasm'ın listelediği adresleri sol kenar boşluğunda ve PC ile ilgili sıçrama ve çağrıların hedef adreslerini sağdan almasına neden olur.
  • -a = Ndisasm'ın, göreceli atlamaların hedef adreslerini inceleyerek ve onu söküp çağırarak, senkronizasyonun nerede yapılması gerektiğini tahmin etmeye çalışacağı otomatik (veya akıllı) senkronizasyon modunu etkinleştirir.
  • -s= Manuel olarak bir senkronizasyon adresi belirtir, öyle ki ndisasm, adresin her iki tarafında baytları kapsayan herhangi bir makine talimatı vermez. Bu nedenle o adreste başlayan talimat doğru bir şekilde demonte edilecektir.
  • mbr = Demonte edilecek dosya.

basit ndisasmın aksine bu ne yapar? Seçenekleri açıklayabilir misin
Hawken

4
Bu seçeneklerin ne anlama geldiğini ve ne işe yaradığını açıklayabilir misiniz? Bir cevabı anlamak, bir cevap almaktan daha iyidir.
Kızak

-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 ve hlovdal hem kanonik cevap parçaları var. Ham i8086 kodunu parçalara ayırmak istiyorsanız, AT&T sözdizimini değil, genellikle Intel sözdizimini istersiniz, bu nedenle şunu kullanın:

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

Kodunuz ELF (veya a.out (veya (E) COFF)) ise, kısa biçimi kullanabilirsiniz:

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

32 bit veya 64 bit kod için ,8086; ELF başlığı bu bilgiyi zaten içeriyor.

ndisasm, jameslin'in önerdiği gibi , iyi bir seçimdir, ancak objdumpgenellikle işletim sistemi ile birlikte gelir ve GNU binutils (GCC tarafından desteklenenlerin üst kümesi) tarafından desteklenen tüm mimarilerle başa çıkabilir ve çıktısı genellikle asGNU'ya (ndisasm'ın nasmelbette beslenecek ).

Peter CordesAgner Fog'un objconv'si çok güzel. Dal hedeflerine etiketler koyar ve kodun ne yaptığını anlamayı çok daha kolay hale getirir. NASM, YASM, MASM veya AT&T (GNU) sözdizimine bölünebilir. "

Multimedya Mike zaten öğrendi --adjust-vma; ndisasmeşdeğerdir -oseçeneği.

Diyelim ki sh4kodu sökmek için (Debian'dan bir ikiliyi test etmek için kullandım), bunu GNU ikilileriyle kullanın (hemen hemen tüm diğer çözücüler tek bir platformla sınırlıdır, örneğin x86 ndisasmve ile objconv):

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

-mMakinedir ve -ELKüçük Endian (için anlamı sh4ebkullanımda -EBya endian mevcut mimarileri için geçerlidir yerine).


2
Agner Fog'un objconv'si çok güzel. Dal hedeflerine etiketler koyar ve kodun ne yaptığını anlamayı çok daha kolay hale getirir. NASM, YASM, MASM veya AT&T (GNU) sözdizimine ayrılabilir.
Peter Cordes

Benim için GNU / Linux üzerinde kutudan çıktığı anda iyi inşa edildi. Ama evet, GNU binutils'in aksine yalnızca x86 / x86-64'tür. Bununla birlikte, bir işlenen boyutu önekinin bir Intel CPU'nun kod çözücülerinde bir LCP durmasına neden olabileceği durumlarda olduğu gibi, yorumlar olarak eklediği x86'ya özgü pek çok güzel ipucu vardır. Elbette cevabınızda bundan bahsedin. Yorumların ana amaçlarından biri, sadece daha sonra izleyicilerin de okuması gereken bir şey olarak değil, gönderenin yanıtlarını geliştirmesine yardımcı olmaktır.
Peter Cordes

1
@PeterCordes Evet, ana işletim sistemi olarak MirBSD'ye sahibim;)
mirabilos

@PeterCordes ama ham ikili dosyaları parçalayamıyor gibi görünüyor, değil mi? Bir dizi talimatı besleyebilmek için minimum ELF dosyası oluşturmam gerekiyordu, ama belki de bazı seçenekleri kaçırdım?
Ruslan

1
@Ruslan: IDK, ilginç soru. Genellikle sadece objdump kullanırım veya dal etiketleri istersem gcc -O3 -masm=intel -fverbose-asm -S -o- | less, çünkü genellikle C kaynağını iyi bir asm'ye derlemek için ayarlamaya çalışıyorum.
Peter Cordes

9

Bu komutu deneyin:

sudo dd if=/dev/sda bs=512 count=1 | ndisasm -b16 -o7c00h -
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.