【问题标题】:What are the symbols inside of an executable file?可执行文件中的符号是什么?
【发布时间】:2018-07-12 11:20:04
【问题描述】:

我一直想知道可执行文件里面的符号是什么意思,比如当我组装我的程序时,它会创建一个文件,但是当我用文本编辑器打开那个文件时,它有这些不可读的代码,例如 ^@^B ^A 等。这是机器码吗?我认为机器代码就像汇编,但带有二进制文件。

【问题讨论】:

  • 你看到的随机混乱是你的文本编辑器试图将它在可执行文件中找到的单个字节转换为文本。构成可执行文件的字节会导致编辑器呈现难以理解的文本和符号,因为可执行文件的内容不是文本文件……而是构成可执行文件结构的字节。可执行文件有很多部分,并且有几种不同的格式(取决于您的平台)。
  • @SimonWhitehead 是否可以只看到字节而不是符号?
  • 是的 - 您使用 a hex editor 执行此操作。十六进制编辑器将向您显示单个字节和它们的文本表示。如果您觉得需要,还允许您操作它们。
  • 另外...我假设您是一名程序员...您可以编写一些代码来逐字节读取文件。这是等价的……显然。
  • 这只是因为文本编辑器试图将其显示为文本而不应该是文本;当您将其显示为文本时,它根本没有意义。就像如果你用fprintf 写一个int 然后用fread 读它,你会得到垃圾。

标签: c assembly executable binaryfiles machine-code


【解决方案1】:

这些符号是对底层“机器代码”或字节码的错误表示(这取决于文件的可执行文件类型)。在大多数架构中,代码以 指令 的形式传递给 CPU,这些指令有几个字节长(取决于架构和指令格式)。这些指令以二进制编码,因此指令可能类似于

001011000011010...1001110010

请注意,这是一个虚构的示例,通常没有人查看指令的实际二进制或十六进制编码,但它的编码表示对人眼具有更多意义。这看起来像mov r0 r3

当你运行一个二进制文件时,你可以想象 CPU 逐条指令读取文件并执行它。但是,当您尝试使用文本编辑器打开二进制文件来读取它时,它会尝试将文件解释为文本,而不是指令集。字符有自己的二进制编码(通常是 UTF-8),但它通常不会与指令的编码重叠。当一串二进制数字与有效的可打印字符的编码不匹配时,它通常与 转义序列 或其他各种东西匹配,因此它们显示为这些奇怪的符号。

请注意,指令和字符的长度通常是不同的,所以不要期望一个符号在“机器码”中一定意味着什么。

编辑:这是可执行格式的一个非常简化的模型,仅用于解释符号是什么。可执行文件比指令列表复杂得多。

【讨论】:

  • nobody looks at the actual binary or hex encoding - 我愿意.. 我正在写一个(蹩脚的)JIT 编译器.. ;) you can think of the CPU reading the file instruction by instruction and executing it - 并非所有的可执行格式都只是平面指令.. 所以这是一个好主意如果你想了解他们。格式有很多种,而且很多都有很大的部分,用于处理许多完全独立于代码部分的不同内容。
  • 忘记添加免责声明,说这是一个非常简化的二进制模型,感谢您的澄清。当然,内容因可执行格式而异,您可以拥有包含任意数据、标题和处理器声明的部分。并且很抱歉忽略了您的项目和其他类似项目,我真的不知道在当今时代逐点检查有多么重要。
  • 完全不需要为任何事情道歉......我只是为 OP 提供更多信息:)
  • 我实际上经常查看十六进制编码,因为 x86 机器码是可变长度指令集,您可以从编码中看到很多有趣的东西。
【解决方案2】:

您看到的是 不可打印的字符,它们以 ersatz 表示形式显示。基本上,在某些情况下,UNIX 终端驱动程序将不可打印的字符转换为 ^X 形式的序列,表示其 ASCII 码等于 X 的字符被 027 (0x1f) 屏蔽。这是一张完整的表格:

000 NUL ^@    001 SOH ^A    002 STX ^B    003 ETX ^C
004 EOT ^D    005 ENQ ^E    006 ACK ^F    007 BEL ^G
010 BS  ^H    011 HT  ^I    012 LF  ^J    013 VT  ^K
014 FF  ^L    015 CR  ^M    016 SO  ^N    017 SI  ^O
020 DLE ^P    021 DC1 ^Q    022 DC2 ^R    023 DC3 ^S
024 DC4 ^T    025 NAK ^U    026 SYN ^V    027 ETB ^W
030 CAN ^X    031 EM  ^Y    032 SUB ^Z    033 ESC ^[
034 FS  ^\    035 GS  ^]    036 RS  ^^    037 US  ^_

最常见的是^@,表示一个全零字节。使用像

这样的十六进制转储工具
od -x binary

确认这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多