2010-07-23 18 views
7

Creé una aplicación simple "Hello World" en VS2005. Es una aplicación de consola directa; que sólo contiene las siguientes líneas:¿Cómo puedo saber si realmente cambió un "ensamblaje"?

Console.WriteLine("Hello World"); 
Console.ReadLine(); 

Cuando traté de reconstruir la misma aplicación de consola sin realizar ningún cambio (sólo tiene que pulsar el botón de reconstrucción), aparece un ejecutable sutilmente diferente. (He generado un hash SHA-1 desde el primer y segundo ejecutable generado, ¡y es diferente!)

¿Por qué es diferente cuando no hay cambios de código? ¿Qué cambió realmente? Usé un editor hexadecimal para comparar y solo vi un par de bytes diferentes.

Supongo que mi pregunta final es, ¿cómo puedo saber si un "ensamblaje" realmente cambió? (Por supuesto, sin tener en cuenta las versiones de archivo, tamaño, etc.)

EDIT

Hasta ahora, hemos establecido que la diferencia radica en la cabecera PE (marca de tiempo y algunos datos de depuración). Antes de reinventar la rueda, ¿existe una herramienta de "comparación de ensamblaje" que ignore el encabezado PE?

Gracias, Ian

Respuesta

6

Las diferencias serán

  • la marca de tiempo en la cabecera PE
  • la GUID de los datos de depuración, si está presente

(y tal vez algo más, según la otra salida que ha publicado?) Para ver esto, ejecute dumpbin /all /rawdata:none en ambos ensamblajes en un símbolo del sistema de VS.

Para hacer esto correctamente, tendría que escribir una herramienta de comparación que entendiera esto e ignorase esos bytes, o tomara copias de los ejecutables, borrara la marca de tiempo y el GUID y luego compararía esas versiones. O, en caso de apuro, podría usar algo como fc /b como lo sugiere el controlfreak y asumir que si hay < 20 bytes diferentes (4 para la marca de tiempo, 16 para el GUID), entonces es probable que sea el mismo.

Puede salirse con la suya con un ensamblado con la marca de tiempo borrada - AFAIK solo se usa para almacenar en caché las compensaciones de símbolos exportados en otras DLL si lo conecta, pero probablemente sea más seguro dejarlo como está. Si realmente necesita ensamblajes binarios idénticos, le sugiero que cambie sus procesos para que nunca los limpie, a menos que realmente los necesite.

+0

Para ignorar correctamente esos bytes, necesito saber la ubicación y el rango de esos bytes ¿verdad? ¿Hay algún tipo de documentación que pueda leer? – Ian

+0

Aquí está el enlace de documentación de formato PE de MSDN: http://www.microsoft.com/whdc/system/platform/firmware/PECOFF.mspx Quise decir la marca de tiempo en el encabezado COFF y el contenido del Directorio de depuración. Sin embargo, me sorprendería mucho si todavía no existen herramientas para hacerlo, pero no sé de ninguna, lo siento. – Rup

+0

Wow, lo has clavado. ¡Es la marca de tiempo y algunos datos de depuración! 4C4953A4 marca de fecha y hora vie Jul 23 16:32:36 2010 4C4953A4 cv 6D 000026E4 8E4 Formato: RSDS, {F421268D-98D4-4D76-B70D-9C3E398E5426}, 1, C: \ HelloWorld \ HelloWorld \ obj \ x86 \ Debug \ HelloWorld.pdb * usando dumpbin/all/rawdata: none – Ian

0

En la línea de comandos fc/b < viejoarchivo> < nuevofichero>

+1

Se supone que esto sea una respuesta? Al menos proporciona un contexto. – Oded

+0

jaja lo siento. Puse algunas cosas, entre paréntesis y se pensaba que eran etiquetas html –

+0

archivos Comparando a.exe y b.exe 00000088: 92 A4 00000770: F4 DD 00000771: 62 20 00000772 : 7F CF 00000773: A1 24 00000774 : 0B AA 00000775: 5A 16 00000776: 7A 9A 00000777: 43 41 00000778: B7 9D 00000779: F3 39 0000077A: 22 C0 0000077B: 8D BF 0000077C: 50 82 0000077D: 17 1D 0000077E : 52 27 0000077F: D6 4A 000008CC: 92 A4 000008E8: 2A 8D 000008E9: 6D 26 000008EA: C2 21 000008EB: F0 F4 000008EC: 70 D4 000008ED: 1E 98 000008EE: 3F 76 000008EF: 4B 4D 000008F0: AC B7 000008F1: 5A 0D 000008F2: 75 9C 000008F3: E0 3E 000008F4: 4D 39 000008F5: 83 8E 000008F6: 6E 54 000008F7: 1E 26 000008F8: 02 01 – Ian

2

Desde un sistema de Visual Studio le solicitan que se puede hacer una comparación más elaborado:

  • Se podría comparar la cabecera PE utilizando la salida de dumpbin:

    dumpbin /HEADERS assembly.dll 
    
  • O se podría comparar PE encabezados y el código IL incrustado en el ensamblado con ildasm:

    ildasm /ALL /TEXT assembly1.dll > dump1.txt 
    ildasm /ALL /TEXT assembly2.dll > dump2.txt 
    fc dump1.txt dump2.txt   
    

    La opción /ALL arrojará los encabezados DOS y PE, el encabezado CLR, los metadatos del ensamblado y IL desensamblado. Sin embargo, no contendrá recursos integrados. Si su assmembly contiene recursos integrados, puede usar la opción /OUT. Esto creará un archivo separado para cada recurso incrustado que puede comparar usando su herramienta de diferencia favorita, p. Ej. WinMerge:

    ildasm /ALL /TEXT /OUT:folder1\dump.txt folder1\assembly.dll 
    ildasm /ALL /TEXT /OUT:folder2\dump.txt folder2\assembly.dll 
    
Cuestiones relacionadas