如何查看二进制文件?


45

据我了解,编译器生成的二进制文件由CPU可以读取的1和0组成。我有一个二进制文件,但是如何打开它以查看其中的1和0?文字编辑器说无法打开它...

PS我有一个汇编编译的二进制,应该是1和0的普通二进制代码吗?


1
当您显示一个二进制文件时,您会看到它是ascii字符
2013年


否-OP指定“汇编编译二进制”。那没有解决这个问题。例如,它不是音乐文件,而是具有结构的文件。如果没有OP提供其他信息,那么就需要使用非结构化工具。
托马斯·迪基,2016年

1
看我的答案。请注意,术语“二进制”在实践中有两种完全不同的用法:“二进制文件”是指上下文不是纯ASCII文本的文件。“二进制数”是指使用其二进制形式写的数字。
皮埃尔·奥利维尔·瓦雷斯

@mazs ASCII吗?我认为UTF-8更有可能,或者,如果程序认为它是通过huristics以这种方式编码的,则可能会出现一些代码页。
JDługosz

Answers:



45

许多人回答了查询的某些方面,但不是全部。

计算机上的所有文件都存储为1和0。图像,文本文件,音乐,可执行应用程序,目标文件等。

它们都是0和1。唯一的区别是,根据打开它们的方式,它们的解释不同。

当您使用来查看文本文件时cat,可执行文件(cat在这种情况下)将读取所有的1和0,并通过将它们转换为相关字母或语言的字符来向您显示。

当您使用图像查看器查看文件时,它会取所有1和0并将其转换为图像,这取决于文件的格式和一些逻辑来实现。

编译的二进制文件没有什么不同,它们存储为1和0。

arzyfex的答案为您提供了以不同方式查看这些文件的工具,但是以二进制形式读取文件适用于计算机上的任何文件,就像以八进制,十六进制或ASCII形式查看文件一样,在每种情况下可能都没有意义这些格式。

如果您想了解可执行二进制文件的功能,则需要以一种可以向您展示汇编语言(以入门的方式)的方式查看它,

objdump -d /path/to/binary

这是一个反汇编程序,它接收二进制内容并将其转换回汇编程序(这是一种非常底层的编程语言)。 objdump并非始终默认安装,因此可能需要安装,具体取决于您的Linux环境。

一些外部阅读。

注意:正如@Wildcard所指出的,重要的是要注意文件不包含字符 1和0(如您在屏幕上看到的那样),它们包含实际的数字数据,各个信息位都在(1)上或关闭(0)。即使是这样的描述也仅是对事实的近似。它们的关键点在于,如果您确实找到了一个显示1和0的查看器,即使该查看器仍在解释文件中的数据,然后显示0和1的ASCII字符。数据以二进制格式存储(请参阅上面的二进制数链接)。 Pierre-Olivier的社区Wiki条目更详细地介绍了这一点。


好曝光。您可能还想补充一下,您在文本行中看到的字符“ 1”或“ 0” 不会被计算机存储为单个“ 1”或“ 0”。OP对此似乎感到困惑。
通配符

1
我会质疑(即不同意)您的陈述,“当您使用来查看文本文件时cat,可执行文件(cat在这种情况下)将读取所有的1和0,并通过将它们转换为相关字母或字符来向您显示。语言。” cat不这样做;所有cat要做的就是将字节写入标准输出(除非您使用的是“有害”选项)。终端程序(和/或终端硬件,如果适用,即其固件)确定如何将字节呈现为字符,可能需要TTY驱动程序的帮助。
G-Man说'恢复莫妮卡'

我不同意,但是到某个时候,所有简单的描述都破裂了,问题是在不再简单描述事物之前,您走了多远。
8:18

14

在低级别,文件被编码为0和1的序列。

但是,即使程序员也很少去实践。

首先(比这个0和1的故事更重要),您必须了解计算机操作的所有内容都用数字编码。

  • 使用字符集表将字符编码为数字。例如,使用ASCII编码时,字母“ A”的值为65。见http://www.asciitable.com

  • 一个像素用一个或多个数字编码(有许多图形格式),例如,在标准的3色格式中,黄色像素编码为:红色255,绿色255,蓝色0。请参阅http://www.quackit.com/css/css_color_codes.cfm(选择颜色并查看R,G和B单元格)

  • 二进制可执行文件是用Assembly编写的;每个汇编指令都编码为数字。例如,汇编指令MOVB $0x61,%al由两个数字编码:176,97请参见http://www.sparksandflames.com/files/x86InstructionChart.html(每个指令都有一个从00到FF的关联数字,因为使用了十六进制表示法,见下文)

其次:每个数字可以有多种表示形式符号

假设我有23个苹果。

  • 如果我每组十个苹果,我将得到:2组十个和3个单独的苹果。这就是我们写23时的意思:先写2(十),再写3(单位)。
  • 但是我也可以组成16个苹果小组。因此,我将得到一个16人一组和7个孤单的苹果。用十六进制表示法(即16的基数),我将写为:17(16 + 7)。为了与十进制表示法区分开,通常以十六进制表示法加上前缀或后缀:17h,#17或$ 17。但是,如何代表9个以上的16个分组或9个单独的苹果中的多个?简而言之,我们使用从A(10)到F(15)的字母。数字31(如在31个苹果中)以十六进制表示为#1F。

  • 在同一行上,我们可以进行两个苹果的分组。(以及两个(两个)苹果组,即2x2的苹果组,依此类推)。那么23是:1组2x2x2x2苹果,0组2x2x2苹果,1组2x2苹果,1组2个苹果和1个孤立的苹果(将以二进制形式记为10111)。

(请参阅https://en.wikipedia.org/wiki/Radix

从物理上讲,允许两种状态(开关)的机制以及在内存存储中的磁盘上都很容易实现。

这就是为什么数据和程序(被视为数字)以其二进制形式编写和处理的原因。

然后根据数据类型将其转换为适当的格式(字母A,黄色像素)或执行(MOV指令)。

hexdump列出以十六进制形式编码数据(或汇编程序)的数字。然后,您可以使用计算器获取相应的二进制形式。



4

您可以在十六进制编辑器中打开它,将其显示为一系列十六进制值。 xxd file

你想达到什么目的?


但是我认为计算机只能读取1和0。我能看到那些吗?我试图了解计算机的工作原理
马丁·泽尔丁

2
仅此一点对您无济于事。如果您想了解其工作原理,请在Linux机器上查看ELF文件格式,以及en.wikipedia.org/wiki/X86_instruction_listings。如果您只想查看编译器生成的代码,请查看使用gdb运行它。由于您想获得更多的“低水平”知识,因此也请访问nand2tetris.org。对于汇编语言,我听说6502和mips汇编比x86_64 / x86汇编好得多
theblazehen

@theblazehen现代x86系列汇编程序是一头野兽。8086是可管理的,而且我认为从汇编时代开始,几乎可以容忍那个时代(1970年代末至1980年代上半年)的任何CPU。
CVn


3

Linux strings命令在文件中打印可打印字符的字符串,例如:

$ strings /usr/bin/gnome-open 
/lib64/ld-linux-x86-64.so.2
3;o:)
libgnome-2.so.0
_ITM_deregisterTMCloneTable
g_object_unref
gmon_start__
g_dgettext
_Jv_RegisterClasses
g_strdup
_ITM_registerTMCloneTable
g_error_free
gnome_program_init
libgnome_module_info_get
libgio-2.0.so.0
g_ascii_strncasecmp

等等...比二进制文件更具可读性。


OP问我如何打开它以查看其中的1和0?但是该strings命令将删除他想要查看的大多数字节。
jlliagre

@jlliagre-尽管您是正确的,但是该strings命令-尤其是长度较长的命令- strings -n 6确实有助于弄清楚二进制文件中包含任何字符串常量等的内容。此答案应该是注释,然后它将很好。

@Joe是的,我不质疑strings命令的有用性,只是它没有在这里回答OP问题。
jlliagre

3

您似乎仍然对其感到困惑的一个重要部分:十六进制值只是二进制值的另一种表示形式。大多数十六进制编辑器或十六进制转储将以十六进制显示值,因为它比二进制更易读。

例如:

二进制:

xxd -b README.md                                                                
00000000: 00100011 00100000

十进制是35和32

xxd README.md                                                                   
00000000: 2320

还有35和32的十进制数


其他人已经提到了这一点。但是,这是一个很好的总结。如果要更改第一段,可以编辑答案。
wizzwizz4

很好,我没有看到任何人提及它,我可能会错过它。
日,星期四

请注意,您需要vim安装才能使用xxd
starbeamrainbowlabs

2

您可以vim通过以下方式在中查看二进制文件:

  • 在打开文件 vim
  • 进入 :% !xxd -b

xxd命令可以进一步调整,例如:

  • 通过添加-g4,它将对32位数据包中的位进行分组
  • 通过添加-c4,它将格式化输出,使其每行有4个字节

将以上两个标志加在一起,将为您每行提供一个32位整数。


1

您可以使用以下红宝石单眼线做到这一点:

$ ruby -e 'while c=STDIN.read(1); printf "%08b" % c.bytes.first; end'

传统的基于C的系统糟糕地支持以二进制格式AFAIK输出内容。它通常不是很有用,因为与十六进制转储不同,它很难阅读。


谢谢!在其后直接添加一个空格%08b会使它将输出分组为字节。
starbeamrainbowlabs

0

GHex是您的朋友:)
您可以使用命令行

Ubuntu 安装它:

须藤apt-get install ghex

软呢帽:

须藤百胜安装ghex

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.