¿Cómo puedo crear parches binarios?


¿Cuál es la mejor manera de hacer un parche para un archivo binario? Quiero que sea simple para los usuarios aplicar (una aplicación simple patch sería bueno). Ejecutar diff en el archivo solo da Binary files [...] differ

Author: Mike, 2009-12-22

5 answers

Si usar algo más que el estándar patch es una opción para usted, es posible que desee comprobar bsdiff y bspatch:

Http://www.daemonology.net/bsdiff /

Bsdiff y bspatch son herramientas para construir y aplicar parches a archivos binarios. [...]

 40
Author: Heinzi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-22 09:09:07

Google Courgette tool parece la herramienta más eficiente para parches de diferencias binarias

Comparando con bsdiff - parche 10 veces más pequeño!

Bsdiff actualización 704,512

Actualización de calabacín 78,848

 14
Author: Speakus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:55:09

Xdelta es otra opción.

make patch:

  xdelta3.exe -e -s old_file new_file delta_file

apply patch:

  xdelta3.exe -d -s old_file delta_file decoded_new_file

Está disponible en mac a través de homebrew: brew install xdelta

Parece ser más reciente, pero por lo demás no tengo idea de cómo se compara con otras herramientas como bsdiff.

 9
Author: Jared Beck,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-13 19:33:44

Puerto moderno: Puerto. NET muy útil para bsdiff/bspatch:

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

Mi elección personal. Lo probé, y fue el único de todos los enlaces, pude compilarlo desde el principio (con Visual Studio, por ejemplo, 2013). (La fuente de C++ en otros lugares está un poco desactualizada y necesita al menos un poco de pulido y es de solo 32 bits que establece límites de memoria real (tamaño de fuente de diferencia). Este es un port de este código C++ bsdiff e incluso prueba si el parche resulta son idénticos al código original).

Otra idea: Con.NET 4.5 incluso podrías deshacerte de #Zip lib, que es una dependencia aquí.

No he medido si es ligeramente más lento que el código c++, pero funcionó bien para mí, (bsdiff: archivo de 90 MB en 1-2 min.), y el tiempo crítico para mí es solo el bspatch, no el bsdiff.

No estoy muy seguro, si se utiliza toda la memoria de una máquina x64, pero lo asumo. La compilación compatible con x64 ("Cualquier CPU") funciona al menos. Probado con un 100 Archivo MB.

- Además: El citado proyecto de Google 'Courgette' puede ser la mejor opción si su objetivo principal son archivos ejecutables. Pero es trabajo construirlo (por lo menos para las medidas de Windows), y para los archivos binarios también está usando bsdiff/bspatch puro, por lo que he entendido el documento.

 6
Author: Philm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-17 19:39:57

Suponiendo que conoce la estructura del archivo, podría usar un programa c / c++ para modificarlo byte por byte:

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

Simplemente lea en el archivo antiguo y escriba uno nuevo modificado a su gusto.

No olvide incluir un número de versión de formato de archivo en el archivo para que sepa cómo leer cualquier versión dada del formato de archivo.

 -1
Author: Jamie Clarke,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-22 09:12:53