2013-01-12 68 views
22

Tôi có thể tháo rời tệp nhị phân phẳng bằng objdump không?Tháo một tệp nhị phân phẳng Sử dụng objdump

Tôi quen thuộc với tháo một thực thi nhị phân có cấu trúc như một tập tin ELF sử dụng:

objdump -d file.elf 

Nhưng nếu tôi có một tập tin nhị phân bằng phẳng mà tôi biết là nghĩa vụ phải được nạp vào, ví dụ, địa chỉ 0xabcd1000 , tôi có thể yêu cầu objdump để tháo rời nó? Tôi đã thử cung cấp các tùy chọn như '--start-address = 0xabcd1000' nhưng objdump chỉ nói rằng nó không nhận ra định dạng.

Tôi có các ý tưởng khác về cách tháo rời tệp nhưng tôi muốn biết liệu objdump có thể cung cấp một giải pháp đơn giản hay không.

+0

Đây không phải là tệp nhị phân phẳng. Có vẻ như đó là tệp ELF. – Calmarius

+0

Trong ví dụ trên, tôi đã đề cập đến một tập tin ELF (file.elf) để minh họa rằng tôi đã quen thuộc với các nguyên tắc tháo gỡ cơ bản. Tuy nhiên, các tập tin tôi đã quan tâm trong việc tháo rời hoàn toàn là một tập tin nhị phân phẳng. Các byte đầu tiên trong tệp là các opcodes đầu tiên được thực thi. Không có tiêu đề. –

+0

Bản sao có thể có của [Làm thế nào để tôi tháo rời mã x86 thô?] (Http://stackoverflow.com/questions/1737095/how-do-i-disassemble-raw-x86-code) –

Trả lời

25

Tôi đã tìm thấy giải pháp cho câu hỏi của riêng mình trên một diễn đàn khác. Có vẻ như sau:

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

Tôi đã thử nghiệm tính năng này và hoạt động.

+11

trả về không thể tháo rời cho kiến ​​trúc không rõ ! có vẻ như bạn đã bỏ lỡ tùy chọn máy '-m i386' trong trường hợp của tôi – TheEnglishMe

+1

Cảm ơn bạn đã nắm bắt. Tôi nghi ngờ đó là bởi vì một objdump tiêu chuẩn trong linux/x86 đất xử lý 2 kiến ​​trúc. Khi tôi chạy nó, tôi đã sử dụng một phiên bản mà chỉ xử lý một vòm (SH-4 trong trường hợp của tôi). –

+1

và bạn có thể bỏ qua --adjust-vma = 0xabcd1000 –

-5

Không, bạn không thể nếu nó không thể định vị lại, như thể nó có chứa mã "Ljmp" (hoặc "jmp xa [addr]") OPCODE.

7

starbluehlovdal cả hai đều có một phần của câu trả lời chuẩn. Nếu bạn muốn tháo rời đang i8086 liệu, bạn thường muốn cú pháp Intel, không AT & cú pháp T, quá, vì vậy sử dụng:

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 

Nếu mã của bạn là ELF (hoặc a.out (hoặc (E) COFF)), bạn có thể sử dụng mẫu ngắn:

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

Đối với mã 32 bit hoặc 64 bit, bỏ qua ,8086; tiêu đề ELF đã bao gồm thông tin này.

ndisasm, theo đề nghị của jameslin, cũng là một lựa chọn tốt, nhưng objdump thường đi kèm với hệ điều hành và có thể đối phó với tất cả các kiến ​​trúc được hỗ trợ bởi GNU binutils (superset của những hỗ trợ bởi GCC), và sản lượng của nó thường có thể được cho ăn vào GNU as (của ndisasm thường có thể được cho vào nasm mặc dù, tất nhiên).

Peter Cordes cho thấy rằng “Agner Fog's objconv rất đẹp. Nó đặt nhãn trên các mục tiêu chi nhánh, giúp dễ dàng hơn nhiều để tìm ra mã nào. Nó có thể tháo rời thành cú pháp NASM, YASM, MASM hoặc AT & T (GNU). ”

Multimedia Mike đã phát hiện ra khoảng --adjust-vma; số tương đương ndisasm là tùy chọn -o.

Để tháo gỡ, nói, sh4 mã (tôi đã sử dụng một nhị phân từ Debian để kiểm tra), sử dụng điều này với GNU binutils (hầu hết disassemblers khác được giới hạn một nền tảng, chẳng hạn như x86 với ndisasmobjconv):

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

các -m là máy, và -EL nghĩa Little Endian (ví sh4eb sử dụng -EB thay), trong đó có liên quan cho các kiến ​​trúc tồn tại trong cả hai endian.

+0

Còn nếu bạn muốn làm mã SH-4 thì sao? –