首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何反汇编原始的16位x86机器代码?

如何反汇编原始的16位x86机器代码?
EN

Stack Overflow用户
提问于 2009-11-15 17:36:14
回答 4查看 77.3K关注 0票数 98

我想反汇编我有一个可引导的x86磁盘的MBR (前512个字节)。我已经使用以下命令将MBR复制到一个文件

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

对于可以反汇编文件mbr的Linux实用程序有什么建议吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-11-15 17:42:02

您可以使用objdump。根据this article的说法,其语法是:

objdump -D -b binary -mi386 -Maddr16,data16 mbr
票数 115
EN

Stack Overflow用户

发布于 2009-11-15 17:42:12

出于这个目的,我喜欢使用ndisasm。它附带了NASM汇编程序,该程序是免费和开源的,包含在大多数linux发行版的包存储库中。

票数 26
EN

Stack Overflow用户

发布于 2015-12-23 04:44:05

starbluehlovdal都有部分标准答案。如果要反汇编原始i8086代码,通常需要英特尔语法,而不是AT&T语法,因此请使用:

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

如果您的代码是ELF (或a.out (或(E)COFF)),则可以使用缩写形式:

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

对于32位或64位代码,省略,8086;ELF标头已包含此信息。

jameslin建议的ndisasm也是一个很好的选择,但objdump通常与操作系统一起提供,可以处理GNU binutil支持的所有架构(GCC支持的架构的超集),其输出通常可以输入到GNU as中(当然,ndisasm的输出通常可以输入到nasm中)。

Peter Cordes建议“Agner Fog's objconv是非常好的。它将标签放在分支目标上,使得更容易理解代码的作用。它可以反汇编成NASM、YASM、MASM或AT&T (GNU)语法。“

Multimedia Mike已经发现了--adjust-vmandisasm的等价物是-o选项。

比方说,要反汇编sh4代码(我使用了Debian中的一个二进制代码进行测试),可以使用GNU binutils (几乎所有其他反汇编程序都被限制在一个平台上,比如带有ndisasmobjconv的x86 ):

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

-m就是机器,-EL的意思是Little Endian (对于sh4eb,请使用-EB ),这与以任何一种字节顺序存在的体系结构相关。

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1737095

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档