据我了解,编译器生成的二进制文件由CPU可以读取的1和0组成。我有一个二进制文件,但是如何打开它以查看其中的1和0?文字编辑器说无法打开它...
PS我有一个汇编编译的二进制,应该是1和0的普通二进制代码吗?
据我了解,编译器生成的二进制文件由CPU可以读取的1和0组成。我有一个二进制文件,但是如何打开它以查看其中的1和0?文字编辑器说无法打开它...
PS我有一个汇编编译的二进制,应该是1和0的普通二进制代码吗?
Answers:
许多人回答了查询的某些方面,但不是全部。
计算机上的所有文件都存储为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条目更详细地介绍了这一点。
cat
,可执行文件(cat
在这种情况下)将读取所有的1和0,并通过将它们转换为相关字母或字符来向您显示。语言。” cat
不这样做;所有cat
要做的就是将字节写入标准输出(除非您使用的是“有害”选项)。终端程序(和/或终端硬件,如果适用,即其固件)确定如何将字节呈现为字符,可能需要TTY驱动程序的帮助。
在低级别,文件被编码为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个苹果。
但是我也可以组成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
列出以十六进制形式编码数据(或汇编程序)的数字。然后,您可以使用计算器获取相应的二进制形式。
您可以在十六进制编辑器中打开它,将其显示为一系列十六进制值。 xxd file
你想达到什么目的?
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
等等...比二进制文件更具可读性。
strings
命令将删除他想要查看的大多数字节。
strings
命令-尤其是长度较长的命令- strings -n 6
确实有助于弄清楚二进制文件中包含任何字符串常量等的内容。此答案应该是注释,然后它将很好。
strings
命令的有用性,只是它没有在这里回答OP问题。
您似乎仍然对其感到困惑的一个重要部分:十六进制值只是二进制值的另一种表示形式。大多数十六进制编辑器或十六进制转储将以十六进制显示值,因为它比二进制更易读。
例如:
二进制:
xxd -b README.md
00000000: 00100011 00100000
十进制是35和32
xxd README.md
00000000: 2320
还有35和32的十进制数
vim
安装才能使用xxd
。
您可以使用以下红宝石单眼线做到这一点:
$ ruby -e 'while c=STDIN.read(1); printf "%08b" % c.bytes.first; end'
传统的基于C的系统糟糕地支持以二进制格式AFAIK输出内容。它通常不是很有用,因为与十六进制转储不同,它很难阅读。
%08b
会使它将输出分组为字节。