为什么在可执行二进制文件中插入字符会导致其“中断”?

史蒂夫·布朗:

为什么在可执行二进制文件中插入字符会导致其“中断”?

并且,有什么方法可以添加字符而不破坏已编译的程序?

背景

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

例如,在下面的应用程序中,Facebook可以将其更改为Lacebook,程序仍然可以正常执行:

在此处输入图片说明

在此处输入图片说明

但它会破坏新角色

我还知道,如果添加了新字符,它将破坏程序,使其无法运行,否则将立即崩溃。例如,My在前面添加Facebook将实现以下目的:

在此处输入图片说明

我知道的

我不知道

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

我想知道的

  1. 为什么多余的字符导致程序中断?
  2. 是什么决定程序已损坏?操作系统?操作系统是否也将此程序保留在沙盒中,以使它不会在当今使整个系统崩溃?
  3. 有什么方法可以通过十六进制编辑器在已编译程序的文本字符串中添加额外的字符,而不会导致应用程序中断?
大卫·施瓦兹(David Schwartz):

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

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

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

因为它们将所有其他信息放在错误的位置文件中,所以加载程序最终将加载错误的内容。另外,代码跳转可能会到达错误的位置,可能在指令中间。

是什么决定程序已损坏?操作系统?操作系统是否也将此程序保留在沙盒中,以使它不会在当今使整个系统崩溃?

这完全取决于搞砸了什么。可能是您移动了标头,并且加载程序注意到标头中的某些参数包含无效数据。

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

可能不可靠。至少,您需要可靠地标识需要调整的代码部分。这可能会令人惊讶地困难,特别是如果有人试图如此故意地做到这一点。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

发行版之间的可执行二进制文件之间有什么区别?

在shell脚本中嵌入可执行二进制文件

将文件存储在可执行二进制文件中

为什么“链接时间优化”会导致二进制文件更大?

Android:在AOSP版本中包含su二进制可执行文件

在Android中运行FFmpeg可执行二进制文件

为什么可执行二进制文件包含包含的头文件的路径?

为什么GCC根据文件创建共享对象而不是可执行二进制文件?

如何告诉clang将调试符号放入可执行二进制文件中?

在python中按行读取二进制文件会导致unicode数据问题吗?

什么会导致.NET Core二进制文件加载本机库,然后引发DllNotFoundException?

为什么写此二进制文件会切断文件的结尾?

与位置无关的可执行文件:什么是“主要可执行二进制文件”?

为什么“二进制文件”不在原始二进制文件中?

在Linux中从可执行文件到机器代码的二进制执行步骤

漏洞扫描程序会扫描源代码还是可执行文件(二进制文件)?

为什么无法在已挂载的ext文件系统中执行二进制文件,为什么呢?

是什么会导致Linux中的file命令将文本文件报告为二进制数据?

不明白为什么我不能在tclsh中执行命令行二进制文件

为什么我会执行二进制文件错误?

什么时候可以在可执行二进制文件中编辑字符串?

为什么可执行文件需要二进制格式规范?

为什么这个二进制文件似乎不可执行?

二进制文件不可执行

链接二进制文件以从其原始目录执行

Ruby gem 的单个可执行二进制文件

为什么 git 会阻止合并二进制文件?

为什么这个二进制输出代码会导致内存泄漏

从二进制文件中读取结构会导致错误的字符