Какой лучший способ сделать патч для двоичного файла? Я хочу, чтобы это было очень просто для пользователей (простое приложение patch
было бы неплохо). Запуск diff в файл просто дает Binary files [...] differ
Как создать двоичные исправления?
Ответ 1
Проверьте bsdiff
и bspatch
(веб-сайт, man- bspatch
, бумагу, GitHub fork).
Чтобы установить этот инструмент:
- Windows: загрузите и распакуйте этот пакет. Вам также понадобится копия
bzip2.exe
вPATH
; скачайте его по ссылке "Binaries" здесь. - macOS: установите Homebrew и используйте его для установки
bsdiff
. - Linux: используйте менеджер пакетов для установки
bsdiff
.
Ответ 2
Courgette, созданный командой Google Chrome, выглядит как наиболее эффективный инструмент для бинарного исправления исполняемых файлов.
Чтобы процитировать их данные:
Вот размеры для недавнего обновления 190.1 → 190.4 на канале разработчика:
- Полное обновление: 10 385 920 байт.
- Обновление bsdiff: 704 512 байт.
- Обновление цукини : 78 848 байт
Вот инструкции, чтобы построить это. Вот бинарный файл Windows от 2018 года, предоставленный Mehrdad.
Ответ 3
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
в вашем менеджере пакетов.
Ответ 4
Современный порт: очень полезный .NET порт для bsdiff/bspatch:
https://github.com/LogosBible/bsdiff.net
Мой личный выбор. Я протестировал его, и это была единственная из всех ссылок, я смог из коробки собрать ее (с Visual Studio, например 2013). (Источник C++ в другом месте немного устарел и требует хотя бы немного полировки и является только 32-битным, который устанавливает ограничения реальной памяти (размер источника различий). Это порт этого кода C++ bsdiff и даже тестирует, если результаты патча идентичны оригинальному коду).
Дальнейшая идея: с помощью .NET 4.5 вы даже можете избавиться от #Zip lib, который здесь зависит.
Я не измерял, немного ли он медленнее, чем код C++, но он работал нормально для меня (файл bsdiff: 90 МБ за 1-2 минуты), и для меня критичным по времени является только bspatch, а не bsdiff.
Я не совсем уверен, если вся память машины x64 используется, но я предполагаю это. Сборка с поддержкой x64 ("Любой процессор") работает как минимум. Пробовал с файлом 100 МБ.
- Кроме того: цитируемый проект Google 'Courgette' может быть лучшим выбором, если вашей основной целью являются исполняемые файлы. Но это работа по его созданию (по крайней мере для мер Windows), а для двоичных файлов он также использует чистый bsdiff/bspatch, насколько я понял документ.
Ответ 5
Для небольших простых патчей проще всего указать 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 old.hex new.hex | grep "^+" | grep -v "^++" | sed "s/^+//" > old.hexpatch
$ xxd -c1 -r old.hexpatch old
$ diff old new
$
Ответ 6
Предполагая, что вы знаете структуру файла, вы можете использовать программу c/С++ для изменения байта байтом:
http://msdn.microsoft.com/en-us/library/c565h7xx(VS.71).aspx
Просто прочитайте в старом файле и напишите новый, который вам понравился.
Не забудьте указать номер версии файла в файле, чтобы вы знали, как читать какую-либо версию формата файла.