Как мне создать бинарные патчи? - PullRequest
49 голосов
/ 22 декабря 2009

Какой лучший способ сделать патч для двоичного файла? Я хочу, чтобы это было просто для пользователей (простое приложение patch было бы хорошо). Запуск diff для файла дает Binary files [...] differ

Ответы [ 5 ]

43 голосов
/ 22 декабря 2009

Проверьте bsdiff и bspatch ( веб-сайт , manpage , paper , GitHub fork ).

Чтобы установить этот инструмент:

  • Windows: Загрузите и извлеките этот пакет . Вам также понадобится копия bzip2.exe в PATH; скачайте его по ссылке "Двоичные файлы" здесь .
  • macOS: установите Homebrew и используйте его для установки bsdiff.
  • Linux: используйте менеджер пакетов для установки bsdiff.
17 голосов
/ 29 декабря 2013

Courgette , созданный командой Google Chrome, выглядит как наиболее эффективный инструмент для бинарного исправления исполняемых файлов.

Цитировать свои данные:

Вот размеры последнего обновления 190.1 -> 190.4 на канале разработчика:

  • Полное обновление: 10 385 920 байт
  • Обновление bsdiff: 704 512 байт
  • Обновление кабачка: 78 848 байт

Вот инструкции по его сборке . Вот двоичный файл Windows от 2018 года, предоставленный Mehrdad .

9 голосов
/ 13 июля 2015

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: Доступен как xdelta или xdelta3 в вашем менеджере пакетов.
7 голосов
/ 07 июля 2015

Современный порт: очень полезный .NET порт для bsdiff / bspatch:

https://github.com/LogosBible/bsdiff.net

Мой личный выбор. Я протестировал его, и это была единственная из всех ссылок, которую я смог из коробки скомпилировать (с Visual Studio, например, 2013). (Исходный код C ++ в другом месте немного устарел и требует, по крайней мере, небольшой полировки и только 32-битный, который устанавливает ограничения реальной памяти (размер источника diff). Это порт этого кода C ++ bsdiff и даже тестирует, идентичны ли результаты патча к исходному коду).

Дальнейшая идея: с помощью .NET 4.5 вы даже можете избавиться от #Zip lib, который здесь зависит.

Я не измерял, немного ли он медленнее, чем код c ++, но он работал нормально для меня (файл bsdiff: 90 МБ за 1-2 минуты), и для меня критичным по времени является только bspatch, не bsdiff.

Я не совсем уверен, используется ли вся память машины x64, но я предполагаю это. Сборка с поддержкой x64 («Любой процессор») работает как минимум. Пробовал с файлом 100 МБ.

- Кроме того: цитируемый проект Google 'Courgette' может быть лучшим выбором, если вашей основной целью являются исполняемые файлы. Но это работа по его сборке (по крайней мере, для мер Windows), а для двоичных файлов он также использует чистый bsdiff / bspatch, насколько я понял документ.

0 голосов
/ 22 декабря 2009

Предполагая, что вы знаете структуру файла, вы можете использовать программу на языке c / c ++, чтобы изменять его побайтно:

http://msdn.microsoft.com/en-us/library/c565h7xx(VS.71).aspx

Просто прочитайте в старом файле и запишите новый, модифицированный по вашему усмотрению.

Не забудьте включить в файл номер версии формата файла, чтобы вы знали, как читать любую заданную версию формата файла.

...