Binary 如何创建二进制修补程序?

Binary 如何创建二进制修补程序?,binary,patch,Binary,Patch,为二进制文件制作补丁的最佳方法是什么?我希望它对用户来说是简单的应用程序(一个简单的patch应用程序就好了)。在文件上运行diff只会使二进制文件[…]不同签出bsdiff和bspatch(,) 要安装此工具,请执行以下操作: Windows:下载并解压缩。您还需要PATH中的bzip2.exe副本;从“二进制文件”链接下载 macOS:安装自制软件并使用它安装bsdiff Linux:使用软件包管理器安装bsdiff 假设你知道文件的结构,你可以使用C/C++程序逐字节修改: 只需读入旧

为二进制文件制作补丁的最佳方法是什么?我希望它对用户来说是简单的应用程序(一个简单的
patch
应用程序就好了)。在文件上运行diff只会使
二进制文件[…]不同

签出
bsdiff
bspatch
(,)

要安装此工具,请执行以下操作:

  • Windows:下载并解压缩。您还需要
    PATH
    中的
    bzip2.exe
    副本;从“二进制文件”链接下载
  • macOS:安装自制软件并使用它安装
    bsdiff
  • Linux:使用软件包管理器安装
    bsdiff

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

    只需读入旧文件,然后写出一个新文件,根据需要修改即可

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

    ,由Google Chrome团队开发,看起来是二进制修补可执行文件最有效的工具

    引用他们的数据:

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

    • 完全更新:10385920字节
    • bsdiff更新:704512字节
    • 小胡瓜更新:78848字节

    给你。这是从2018年起提供的。

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

    我个人的选择。 我对它进行了测试,它是所有链接中唯一的一个,我能够开箱即用地编译它(使用Visual Studio,例如2013)。(其他地方的C++源有点过时,需要至少一点抛光,只有32位,它设置了真正的内存(差异源大小)限制。这是C++代码BSDIFF的端口,甚至测试补丁结果与原始代码相同。) 进一步的想法:使用.NET4.5,您甚至可以去掉#Zip lib,这是一个依赖项

    我没有测量它是否比C++代码稍微慢一些,但是它对我来说很好,(BSDIFF:90 MB文件在1-2分钟),对我来说关键的时间只是BSPATCH,而不是BSDIF.< 我不确定是否使用了x64机器的全部内存,但我假设是这样。支持x64的构建(“任何CPU”)至少可以工作。尝试使用100 MB的文件

    - 此外:如果您的主要目标是可执行文件,那么引用的谷歌项目“小胡瓜”可能是最佳选择。但就我对文档的理解而言,构建它(至少对于Windows measures),对于二进制文件,它也使用纯bsdiff/bspatch。

    xdelta(,)是另一种选择。它似乎是最近的,但我不知道它与其他工具(如bsdiff)相比如何

    用法:

    • 创建修补程序:
      xdelta-e-s旧文件新文件增量文件
    • 应用修补程序:
      xdelta-d-s旧\u文件delta\u文件已解码\u新文件
    安装:

    • Windows:下载
    • 巧克力:
      choco安装xdelta3
    • 自制:
      brew安装xdelta
    • Linux:在包管理器中以
      xdelta
      xdelta3
      的形式提供

    对于小而简单的补丁程序,最简单的方法是告诉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
    $
    
    hdifffatch:
    可以在windows、macos、linux、android上运行
    支持二进制文件或目录之间的差异
    创建修补程序:
    hdiffz[-m |-s-64][-c-lzma2]旧路径新路径输出增量文件

    应用修补程序:
    hpatchz旧路径增量文件输出新路径

    安装:
    ,或下载源代码&make

    Jojos二进制差异:

    另一个好的二进制diff算法

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

    使用
    git diff
    还可以使用
    --binary
    生成二进制文件的ASCII编码,例如适合粘贴到电子邮件中。

    扩散修补wpf 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标签

    Microsoft Visual Studio社区2019

    版本16.7.7

    .NETFramework,版本=v4.7.2


    在Windows10x64bits中测试,该文档说,“我们编写了一个新的diff算法,它更了解我们正在推送的数据类型——包含已编译可执行文件的大型文件”。这意味着它对其他二进制文件不起作用(或者根本不起作用)。谢谢你的链接。但在Windows下编译它是一个真实的故事。它首先安装一个完整的开发人员系统,例如Git、Python等。也许它可以工作,但在我的机器上,fetch使用了一些安全且失败的端口。有人知道二进制下载链接吗?@jamescourgette是bsdiff的真正继承者。来自文档:小胡瓜
    diff=bsdiff(concat(原件,猜测),更新)
    。用一个合理的
    bdiff
    算法,你就有了
    len(bdiff(concat(original,guess),update))
    和一个小的(常量)
    C
    。将
    C
    设置为10是一个安全的赌注。也许有人可以为
    bsdiff
    计算
    C
    。注意,如果给定的
    bdiff
    算法保证
    len(bdiff(concat(原始,随机),update),则C==1
    
    $ xxd -c1 old > old.hex
    $ xxd -c1 new > new.hex
    $ diff old.hex new.hex | grep "^+" | grep -v "^++" | sed "s/^+//" > old.hexpatch
    $ xxd -c1 -r old.hexpatch old
    $ diff old new
    $