如何为二进制文件创建补丁是最好的方法?
我希望用户能够简单地应用它(一个简单的 patch
应用程序会很好)。在文件上运行diff只会给出 Binary files [...] differ
。
Courgette是Google Chrome团队开发的二进制可执行文件最有效的补丁工具。
引用他们的数据:
以下是开发通道上最近一次190.1 -> 190.4更新的大小:
- 完整更新:10,385,920字节
- bsdiff更新:704,512字节
- Courgette更新:78,848字节
这里是构建它的说明。这是一个2018年Windows二进制文件,由Mehrdad提供。
bsdiff
的真正继承者。从文档中可以看出,Courgette diff = bsdiff(concat(original, guess), update)
。通过一个合理的bdiff
算法,你可以得到len(bdiff(concat(original,guess),update)) < len(bdiff(original,update))+C
,其中小常数C
很小。将C
设置为10是一个安全的选择。也许有人可以计算出bsdiff
的C
值。请注意,如果给定的bdiff
算法保证对于任何原始值、随机值和更新值,都有len(bdiff(concat(original,random),update)) <= len(bdiff(original,update))
,那么C==1。 - Tinoxdelta (网站, GitHub) 是另一个选择。它似乎更加时新,但除此之外我不知道它与其他工具如 bsdiff 相比如何。
用法:
xdelta -e -s old_file new_file delta_file
xdelta -d -s old_file delta_file decoded_new_file
安装方式:
choco install xdelta3
brew install xdelta
xdelta
或 xdelta3
。xdelta
,它有不同的命令行命令。就像这样:xdelta delta old_file new_file delta_file
和 xdelta patch delta_file old_file decoded_new_file
。 - Mariusz Pawelski$ 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 -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
$
$ comm -13 <(xxd -c1 old) <(xxd -c1 new) > old.hexpatch
$ xxd -c1 -r old.hexpatch old
$ diff old new
$
在这里,comm -13 删除仅出现在第一个输入中以及出现在两个输入中的行,仅保留第二个输入独有的行。
<
和>
;为了让它在行前加上+
和-
,我不得不使用diff -u
,例如:diff -u old.hex new.hex | grep "^+" | grep -v "^++" | sed "s/^+//" > old.hexpatch
。 - bmaupincomm -13 <(xxd -c1 old) <(xxd -c1 new) > old.hexpatch
- bmaupin现代端口:非常有用的.NET端口,用于bsdiff/bspatch:
https://github.com/LogosBible/bsdiff.net
这是我的个人选择。
我进行了测试,它是所有链接中唯一一个可以直接编译的(例如,使用Visual Studio,如Visual Studio 2013)。(其他地方的C++源码有点过时,并且需要至少对其进行一些修补,并且只支持32位,这会设置真正的内存(diff源文件大小)限制。这是这个C++代码bsdiff的端口,甚至测试补丁结果是否与原始代码相同。)
更进一步的想法:使用.NET 4.5甚至可以摆脱此处的依赖项#Zip库。
我没有测量它是否比C++代码稍微慢一些,但对我来说它很好用,(bsdiff:90 MB文件需要1-2分钟),对我来说时间紧迫的只有bspatch,而不是bsdiff。
我不确定一个x64机器的整个内存是否被使用,但我认为是这样的。x64可用构建("Any CPU")至少可以工作。我试过使用100 MB文件。
-此外:引用的Google项目“Courgette”可能是最好的选择,如果你的主要目标是可执行文件。但是构建它需要工作(对于至少适用于Windows的措施),而对于二进制文件,它也仅使用纯bsdiff/bspatch,就我所理解的文档而言。
HDiffPatch可以在Windows、macOS、Linux和Android上运行。
它支持二进制文件或目录之间的差异;
创建补丁:hdiffz [-m|-s-64] [-c-lzma2] old_path new_path out_delta_file
应用补丁:hpatchz old_path delta_file out_new_path
安装:
从最新版本下载,或下载源代码并make
;
Jojos Binary Diff是另一个很好的二进制差异算法;
https://github.com/reproteq/DiffPatchWpf DiffPatchWpf是一个简单的二进制补丁制作工具。
比较两个二进制文件并将它们之间的差异保存在新文件patch.txt中。
快速、轻松地在另一个二进制文件中应用补丁。
现在您可以快速、轻松地将差异应用于另一个二进制文件。
示例:
1- 加载Aori.bin文件。
2- 加载Amod.bin文件。
3- 比较并保存Aori-patch.txt文件。
4- 加载Bori.bin文件。
5- 加载Aori-patch.txt文件。
6- 应用补丁并保存Bori-patched.bin文件。
alt标签
微软Visual Studio社区版2019
版本16.7.7
.NET Framework,版本=v4.7.2
已在Windows 10 x64位上进行测试
使用 -a
,diff 和 git-diff 可以将二进制文件作为文本处理。
使用 --binary
,git-diff 还可以生成二进制文件的 ASCII 编码,适合粘贴到电子邮件中。
假设您知道文件的结构,您可以使用C/C++程序逐字节修改它:
http://msdn.microsoft.com/en-us/library/c565h7xx(VS.71).aspx
只需读取旧文件,并将其修改为所需的新文件。
不要忘记在文件中包含文件格式版本号,以便您知道如何读取任何给定版本的文件格式。
bsdiff
和courgette
是针对可执行二进制文件进行优化的;找到了一些非官方Windows二进制文件,但它们并没有成功运行。 - Vlastimil Ovčáčíkapt-cyg
,这些软件包也存在于那里,可以轻松安装和执行! - Pysis