2013-01-12 12 views
22

Kann ich eine flache Binärdatei mit objdump zerlegen?Zerlegen einer flachen Binärdatei mit objdump

Ich bin vertraut mit einem strukturierten ausführbaren Binärdatei wie eine ELF-Datei mit der Demontage:

objdump -d file.elf 

Aber wenn ich eine flache Binärdatei, die ich weiß, sollten bei geladen werden, zB Adresse 0xabcd1000 Kann ich Objdump bitten, es zu zerlegen? Ich habe versucht, Optionen wie '--start-Adresse = 0xabcd1000' zu liefern, aber objdump sagt nur, dass es das Format nicht erkennt.

Ich habe andere Ideen, wie man die Datei zerlegt, aber ich wollte wissen, ob objdump eine einfache Lösung bieten könnte.

+0

Dies ist keine flache Binärdatei. Es sieht so aus, als wäre es eine ELF-Datei. – Calmarius

+0

Im obigen Beispiel habe ich eine ELF-Datei (file.elf) erwähnt, um zu verdeutlichen, dass ich mit den grundlegenden Zerlegungsprinzipien vertraut war. Allerdings war die Datei, die ich zu demontieren interessierte, absolut eine flache binäre Datei. Die ersten Bytes in der Datei waren die ersten Opcodes, die ausgeführt wurden. Es gab keinen Header. –

+0

Mögliches Duplikat von [Wie zerlege ich rohen x86-Code?] (Http://StackOverflow.com/questions/1737095/how-do-i-disassembles-raw-x86-code) –

Antwort

25

Ich fand die Lösung zu meiner eigenen Frage auf einem anderen Forum. Es sieht in etwa so aus:

objdump -b binary --adjust-vma=0xabcd1000 -D file.bin 

Ich habe das getestet und es funktioniert.

+11

Rückkehr kann nicht für Architektur unbekannt zerlegen ! scheint, dass Sie die Maschinenoption '-m i386' in meinem Fall verpasst haben – TheEnglishMe

+1

Danke für diesen Fang. Ich vermute, es liegt daran, dass ein Standard-Objdump in Linux/x86 Land 2 Architekturen behandelt. Als ich es ausführte, benutzte ich eine Version, die nur einen Bogen (SH-4 in meinem Fall) behandelt. –

+1

und Sie können weglassen --adjust-vma = 0xabcd1000 –

-5

Nein, Sie können nicht, wenn es nicht verschiebbar ist, wie wenn es einen "ljmp" (oder einen "jmp far [addr]") OPCODE enthält.

7

starblue und hlovdal haben beide Teile der kanonischen Antwort. Wenn Sie rohe i8086 Code zerlegen wollen, Sie wollen in der Regel Intel Syntax, nicht AT & T-Syntax auch so verwenden:

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 

Wenn Ihr Code ELF (oder a.out (oder (E) COFF)), können Sie das kurzes Formular verwenden:

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

Für 32-Bit oder 64-Bit-Code, lassen Sie die ,8086; Der ELF-Header enthält diese Information bereits.

ndisasm, wie jameslin vorgeschlagen, ist auch eine gute Wahl, aber objdump kommt in der Regel mit dem Betriebssystem und kann mit allen Architekturen unterstützt durch GNU binutils (Obermenge derer unterstützt von GCC) und dessen Ausgang zugeführt werden kann in der Regel beschäftigen in GNU as (ndisasm kann natürlich natürlich auch in nasm eingespeist werden).

Peter Cordes schlägt vor, dass "Agner Fog's objconv ist sehr schön. Es fügt Branch-Targets Labels hinzu und macht es viel einfacher herauszufinden, was der Code tut. Es kann in NASM, YASM, MASM oder AT & T (GNU) Syntax zerlegen „

Multimedia Mike bereits herausgefunden über --adjust-vma. Das ndisasm entspricht der -o Option.

zu zerlegen, sagen wir, sh4 Code (verwendete ich ein binäres von Debian zu testen), verwenden Sie diese mit GNU binutils (fast alle anderen Disassembler auf eine Plattform beschränkt sind, wie x86 mit ndisasm und objconv):

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

die -m ist die Maschine, und -EL bedeutet Little Endian (für sh4eb Verwendung -EB statt), die für die Architekturen relevant ist, die in entweder endianness existieren.

+0

Wie wäre es, wenn Sie SH-4-Code tun möchten? –