Primero le daré un poco de antecedentes sobre por qué estoy haciendo esta pregunta:¿Cómo siempre producir byte por byte .exe idéntico en la reconstrucción de la aplicación C#?
Actualmente estoy trabajando en una industria estrictamente regulada y, como tal, nuestro código es cuidadosamente revisado por oficiales. casas de prueba. Estas casas de prueba esperan poder construir el código y generar un .exe o .dll que sea EXACTAMENTE el mismo todas y cada una de las veces (¡sin cambiar ningún código obviamente!). Revisan el MD5 y el SHA1 de los ejecutables que crean para garantizar esto.
Hasta este momento, he estado codificando predominantemente en C++, donde (después de algunas modificaciones en la configuración de proyectos) conseguí que los proyectos se reconstruyeran consistentemente con el mismo MD5/SHA1. Ahora estoy usando C# en un proyecto y estoy teniendo grandes dificultades para hacer que los MD5 coincidan después de una reconstrucción. Soy consciente de que hay "Sellos de tiempo" en el encabezado PE del archivo, y se han borrado a 0. También sé que hay un GUID para el .exe, que de nuevo se ha borrado a 00 00 00 ... etc. Sin embargo, los archivos aún no coinciden.
Estoy usando CFF Explorer para ver y editar el encabezado PE para eliminar las marcas de fecha y hora. Después de usar una herramienta de comparación binaria, solo hay 2 bloques de bytes en el .exe que son diferentes (ambos muy pequeños).
Uno de los bloques inconsistentes aparece solo antes de algún código binario, que en ASCII detalla la ruta del archivo *Project*\obj\Release\xxx.pdb
.
EDIT: Ahora se sabe que es el GUID del archivo * .pdb, sin embargo, ¿todavía no sé si puedo modificarlo sin causar ningún error?
El otro bloque aparece en medio de lo que parecen ser nombres de funciones, es decir. (Una sección típica) AssemblyName.GetName.Version.get_Version.System.IO.Ports.SerialPort.Parity.Byte.<PrivateImplementationDetails>{
entonces el diferente bloque de código:
4A134ACE-D6A0-461B-A47C-3A4232D90816
seguido por:.
"} .ValueType .__ StaticArrayInitTypeSize = 7 $$ method0x60000ab-1.RuntimeFieldHandle.InitializeArray `... etc.
¡Cualquier idea o sugerencia sería bienvenida!
Bien, bien si el GUID se puede deshacer deshabilitando la generación de PDB (o borrándola a todos los 0) esa es la diferencia número 1 resuelto. La diferencia número 2 parece ser mucho más difícil de resolver; ¿Estás diciendo que tengo que pasar por la IL y cambiar el valor allí? ¿O accede al archivo compliled * .exe de forma manual y manual para configurar los bytes? – Siyfion
Bueno, debido a mi trabajo en la herramienta de inyección de recursos, habría elegido la solución de parche * .exe. También se debe hacer una ida y vuelta de ILDASM/ILASM para reemplazar el nombre de la clase. – Daniel
¿Alguna posibilidad de que liberes esta herramienta de parche en el futuro cercano? ;) – Siyfion