如何创建二进制补丁?

为二进制文件制作补丁的最佳方法是什么?

我希望它对用户来说是简单的应用(一个简单的 patch应用程序将是不错的)。对文件运行 diff 只会得到 Binary files [...] differ

85306 次浏览

看看 bsdiffbspatch(网站手册纸张GitHub 的叉子)。

安装此工具:

  • Windows: 下载并解压 这个包裹。您还需要 PATHbzip2.exe的副本; 请从“二进制文件”链接 给你下载该副本。
  • MacOS: 安装 Homebrew 并使用它来安装 bsdiff
  • Linux: 使用包管理器安装 bsdiff

假设你知道文件的结构,你可以使用 C/C + + 程序一个字节一个字节地修改它:

Http://msdn.microsoft.com/en-us/library/c565h7xx(vs.71).aspx

只需读入旧文件,并写出一个新的修改,因为你喜欢。

不要忘记在文件中包含文件格式版本号,这样您就知道如何读取文件格式的任何给定版本。

由 Google Chrome 团队开发的 Courgette 似乎是最有效的二进制可执行文件修补工具。

引用他们的数据:

下面是开发者频道最近的190.1-> 190.4更新的大小:

  • 完整更新: 10,385,920字节
  • Bsdiff update: 704,512字节
  • Courgette 更新: 78,848字节

这是 制造它的指令。这是 梅赫达德提供的2018年的 Windows 二进制文件

现代端口: 对 bsdiff/bspatch 非常有用的.NET 端口:

Https://github.com/logosbible/bsdiff.net

我个人的选择。

我测试过了,它是所有链接中唯一的一个。开箱即用,我能够编译它(使用 Visual Studio,例如 Visual Studio 2013)。(其他地方的 C + + 源代码有点过时,至少需要一点改进,而且只有32位,这设置了实际内存(不同的源代码大小)限制。这是此 C + + 代码 bsdiff 的一个端口,甚至测试补丁结果是否与原始代码相同。)

更进一步的想法: 使用.NET 4.5,你甚至可以去掉 # Zip 库,这是一个依赖项。

我还没有测量它是否比 C + + 代码慢一点,但它对我来说工作得很好,(bsdiff: 90MB 文件在1-2分钟内) ,对我来说时间紧迫的只是 bspatch,而不是 bsdiff。

我不太确定是否使用了 x64机器的全部内存,但我假设是这样。具有 x64能力的版本(“任何 CPU”)至少可以工作。我试过使用100MB 的文件。

- 此外: 如果你的主要目标是可执行文件,引用的谷歌项目“ Courgette”可能是最好的选择。但是构建它是一项工作(至少对于 Windows 度量) ,对于二进制文件,它也使用纯 bsdiff/bspatch,就我对文档的理解而言。

Xdelta (网站GitHub)是另一种选择。它似乎是最近才出现的,但除此之外,我不知道它与其他工具(如 bsdiff)相比有什么不同。

用法:

  • 创建补丁: xdelta -e -s old_file new_file delta_file
  • 应用补丁: xdelta -d -s old_file delta_file decoded_new_file

安装:

  • Windows: 下载 官方二进制文件
  • 巧克力: choco install xdelta3
  • 家酿: brew install xdelta
  • Linux: 在包管理器中可以使用 xdeltaxdelta3

对于小而简单的补丁程序,最简单的方法就是告诉 diff 使用-a (或—— text)选项将文件视为文本。据我所知,更复杂的二进制差分只对减少补丁的大小有用。

$ man diff | grep -B1 "as text"
-a, --text
treat all files as text
$ diff old new
Binary files old and new differ
$ diff -a old new > old.patch
$ patch < old.patch old
patching file old
$ diff old new
$

如果文件大小相同,而补丁只修改了几个字节,您可以使用 xxd,它通常与操作系统一起安装。下面将每个文件转换为每行一个字节的十六进制表示形式,然后对文件进行差分以创建一个紧凑的补丁,然后应用该补丁。

$ xxd -c1 old > old.hex
$ xxd -c1 new > new.hex
$ diff -u old.hex new.hex | grep "^+" | grep -v "^++" | sed "s/^+//" > old.hexpatch
$ xxd -c1 -r old.hexpatch old
$ diff old new
$

这是 bmaupin 推荐的一个更简单、更清晰、更好的版本,它使用了进程替代,而不是中间文件 diff 和 grep:

$ comm -13 <(xxd -c1 old) <(xxd -c1 new) > old.hexpatch
$ xxd -c1 -r old.hexpatch old
$ diff old new
$

在这里,comm -13删除仅出现在第一个输入中的行以及出现在两个输入中的行,只留下第二个输入独占的行。

Diff 和 git-diff 可以通过使用 -a将二进制文件视为文本来处理它们。

有了 git-diff,你也可以使用 --binary,它产生二进制文件的 ASCII 编码,适合粘贴到电子邮件,例如。

Https://github.com/reproteq/diffpatchwpf 区分贴片 简单的二进制补丁制造工具。

比较两个二进制文件并将它们之间的差异保存到新文件 patch.txt 中

快速简单地将补丁应用到另一个二进制文件中。

现在您可以在另一个二进制文件中快速轻松地应用差异。

例如:

1-加载文件 Aori.bin

2-加载文件 Amod.bin

3-比较并保存 Aori-patch. txt

4-加载文件 Bori.bin

5-加载补丁 Aori-patch. txt

6-应用补丁和保存文件 Bori 补丁

Alt Tag

Https://youtu.be/epyuf4t5mwk

MicrosoftVisualStudio 社区2019

版本16.7.7

. NETFramework,Version = v4.7.2

在 Windows 10x64位测试