修补二进制文件的含义?

修补二进制文件的含义?

我试图通过在联机帮助页的示例中修补二进制文件来理解它的含义xxd

Patch the date in the file xxd.1
% echo "0000037: 3574 68" | xxd -r - xxd.1
% xxd -s 0x36 -l 13 -c 13 xxd.1
0000036: 3235 7468 204d 6179 2031 3939 36  25th May 1996
  1. 这是否意味着编辑二进制文件,或者是像维基百科

    补丁是一款旨在解决问题的软件1使用或更新计算机程序或其支持数据。

  2. xxd和有何patch不同,它们有何相似之处?
  3. 这个例子试图做什么?

答案1

给文件打补丁意味着修改它,其含义是修改通常很小。该用法来自一般英语用法,其中补丁是一个小的修改(例如,对一块布)。对于文件来说,补丁并不总是修复。

补丁是描述如何修改一个文件或一组文件的一系列指令。在 Unix 世界中,补丁通常是diff命令,描述文本文件中的更改。这种意义上的补丁描述了在文件中添加、删除或修改行的修改。该patch实用程序应用这些指令来修改一个文件或一组文件。它尝试智能地将多个补丁应用到同一个文件,因为第一个补丁可能会导致阻止应用第二个补丁的更改,因为文件不再处于预期状态。因为它们的操作强烈基于行,diff所以patch它们不太适合二进制文件。

xxd是用于处理二进制文件的通用实用程序。它的功能之一是对文件进行修改。例如,该命令xxd -r - xxd.1意味着应用标准输入上描述的修改。示例补丁(即修改指令)0000037: 3574 68的意思是:从偏移量0x37(即十进制的 55)开始,将接下来的三个字节替换为 0x35、0x74 和 0x68(即三个字符5th)。

答案2

当您将补丁应用于文件时,您将使用更新的数据覆盖其中的一部分(补丁还可以在末尾添加附加数据)。您可以修补任何类型的文件,无论是文本、二进制还是其他类型的文件,因为所有文件归根结底都是字节流。

补丁文件中指定了应该被覆盖的部分。

如果软件修复涉及更新文件,则补丁可以将该文件修改为与更新文件的完整版本相同。由于补丁不是完整文件,而只是差异,因此补丁会更小,消耗更少的磁盘空间,下载时消耗更少的带宽。

在十六进制编辑器(例如hexer)中直接编辑二进制文件有时称为“手动”修补。

我不熟悉xxd,但从初步搜索看来xxd可以生成倾倒或二进制数据的十六进制列表,并且还可以将此类列表转换回直接二进制。因此,您可以使用 转储十六进制xxd,使用vim或其他文本编辑器对其进行编辑,然后使用xxd -r.您还可以使用“hexdump 格式”echo通过管道将字符串传递给它。 xxd(其他选项可让您对二进制文件执行更改。看起来xxd有很多选项可让您指定开始和停止覆盖或修补的位置。)

示例中的第一个命令基本上是告诉将文件中从偏移量开始的xxd字节更改为(ASCII 表示“第 5”)。 可以读取它自己的“hexdump”格式,这就是“echo”命令提供给.xxd.10x00000370x35 0x74 0x68xxdxxd

示例中的第二个命令是转储-c文件中从同一偏移量开始的 13 个字节的计数 ( )。

patch命令执行类似的操作,但它需要“diff”格式的文件。您可以通过保存命令的输出来创建 diff 文件diff,该文件将比较两个文件并以所述 diff 格式表达差异。从阅读man页面来看,补丁更多的是用于更改文本文件,而不是直接的二进制文件。

答案3

在微控制器上,有时会有程序改变程序存储器,即程序本身。你可以说程序在运行时“变异”。

这只是更改二进制应用程序的一种解释。

事实上,您在微控制器程序中经常使用二进制修补。由于您的程序是机器代码,并且通常是在汇编程序中进行编程,因此汇编后的机器代码非常直接地表示了您所编程的内容。因此,一旦您的代码被组装,您只需为部分或全部微控制器程序存储器提供补丁即可。

相关内容