Подтвердить что ты не робот

Как создать двоичные исправления?

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

4b9b3361

Ответ 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

Просто прочитайте в старом файле и напишите новый, который вам понравился.

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