为什么将字符插入可执行的二进制文件会导致它"中断"?

Ste*_*own 8 c linux compiler-construction linker hex-editors

为什么将字符插入可执行的二进制文件会导致它"中断"?

而且,有没有办法在不破坏编译程序的情况下添加字符?

背景

我已经知道很长一段时间了,可以使用十六进制编辑器来更改已编译的可执行文件中的代码,并且仍然可以正常运行...

作为下面的应用程序中的一个示例,Facebook可以更改为Lacebook,程序仍将执行正常:

在此输入图像描述

在此输入图像描述

但它打破了新角色

我也知道如果添加了新字符,它将破坏程序并且不会运行,或者它会立即崩溃.例如,My在前面添加Facebook将实现此目的:

在此输入图像描述

我知道的

我不知道的

  • 我不太了解操作系统和可执行文件之间的关系.我猜想当你输入程序名称并按回车键时,你基本上是指示操作系统"执行"该文件,这基本上意味着将文件加载到内存中,设置处理器指向它的指针,然后告诉它'走!'
  • 我理解为什么在二进制文件的文本字符串中有额外的字符会导致问题

我想知道什么

  1. 为什么额外的字符会导致程序中断?
  2. 什么东西决定程序被打破?操作系统?操作系统是否也将此程序保留为沙箱,以便它现在不会崩溃整个系统?
  3. 有没有办法通过十六进制编辑器在编译程序的文本字符串中添加额外的字符,而不是让应用程序中断?

Bar*_*mar 5

当程序被编译成机器代码时,它包括许多对程序存储器中指令和数据地址的引用.编译器确定程序所有内存的布局,并将这些地址放入程序中.可执行文件也被组织成段,并且在开头有一个目录,其中包含每个部分中的字节数.

如果在程序中插入一些内容,那么之后所有内容的地址都会向上移动.但是程序中包含对程序和数据位置的引用的部分不会更新,它们会继续指向原始地址.此外,包含所有部分大小的表格不再正确,因为您增加了所修改部分的大小.


Dav*_*rtz 5

我不太明白操作系统和可执行文件之间的关系。我猜想,当您输入程序名称并按回车键时,您基本上是在指示操作系统“执行”该文件,这基本上意味着将文件加载到内存中,将处理器的指针设置为指向它,然后告诉它'走!'

现代操作系统只是将文件映射到内存中。在需要它之前,他们不会费心加载它的页面。

为什么多余的字符会导致程序中断?

因为他们把文件中的所有其他信息放在错误的地方,所以加载器最终加载了错误的东西。此外,代码中的跳转最终会出现在错误的地方,可能是在一条指令的中间。

什么东西决定程序坏了?操作系统?操作系统是否也将这个程序保存在沙盒中,以便它现在不会使整个系统崩溃?

这取决于究竟是什么被搞砸了。可能是您移动了一个标题,加载器注意到标题中的某些参数具有无效数据。

有什么方法可以通过十六进制编辑器将额外的字符添加到已编译程序的文本字符串中,而不会使应用程序中断?

可能不可靠。至少,您需要可靠地识别需要调整的代码部分。这可能出乎意料地困难,特别是如果有人故意如此刻意地做到这一点。