获取可执行二进制文件的完整反汇编

25

是否可以获得可执行文件的完整反汇编(可用作汇编器的输入)?

当我使用 otool -tV a.out 时,我只能看到文本节。其他节,如数据节,则不可见。

当我使用 gdb 时,反汇编命令需要起始地址和结束地址。但我不知道如何找出二进制文件(比如a.out)的起始地址和结束地址。

我正在尝试对一个可执行文件进行反汇编,调整汇编代码,然后重新汇编它。这是可能的吗?

如果能够找到二进制文件中所有节的名称,那也将有所帮助。

4个回答

40

尝试使用这个命令,我记得以前有用过:

otool -tvV a.out

2
这个命令在过去帮了我很多忙,就是 otool -IvV a.out(显示间接符号表)。此外还有一个 -d 开关,用于获取 data 部分的信息。更多信息请参见:man otool - andwagon

3
在Mac上,您可以安装(可能通过Homebrew)包含gobjdump的binutils。一旦安装,您就可以反汇编任何二进制程序。它是开源和免费的。

这应该是一条注释,因为它并没有试图回答问题。 - jww

0

你可以使用Hopper Disassembler

引用:

Hopper是Mac的逆向工程工具,可让您反汇编、反编译和调试32/64位Intel Mac可执行文件。

它售价59美元,但您可以下载演示版先检查是否能完成工作。

编辑

根据手册,似乎您也可以使用otool实现此功能。

.B -d 显示(_^_DATA,_^_data)部分的内容。

还可以查看这篇简短的博客文章(存档链接,原始链接已失效),其中描述了otool的使用方法,以及@Sjlver提到的如何使用objdump


otool -d 显示数据段。但这并不是全部。如果可执行文件调用一个像 printf("ABCD") 这样的方法,我无法在汇编中找到字符串 "ABCD" 的声明。 - mynk
1
我正在寻找免费的解决方案,所以没有尝试过。 - mynk
这应该是一条注释,因为它并未试图回答问题。 - jww
@jww,为什么这不是在试图回答问题呢? - Jørgen R

-4
在Linux上,您可以尝试使用objdump -D myprog
请注意,这仅适用于程序不包含不规则控制流的情况。特别是恶意软件经常被混淆,例如插入虚假字节,然后跳过它们。
如果您的目标是这种程序,我听说最好使用的产品之一是IDA pro

4
这应该是一条评论,因为它并没有试图回答问题。 - jww

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接