![]() |
exe ohne Zeitstempel etc. vergleichen
Hallo zusammen!
Ich möchte zwei Kompilate eines Projekts daraufhin vergleichen, ob sie den selben Objektcode (?) enthalten. D.h. wenn ich das Projekt zweimal kompiliere, ohne etwas zu ändern, möchte ich als Ergebnis "gleich", unabhängig von irgendwelchen Zeitstempeln etc. Wenn ich vor dem zweiten Kompilieren etwas Relevantes am Code ändere, soll "ungleich" herauskommen. Scheinbar würde das mittels
Delphi-Quellcode:
funktionieren - siehe
dumpbin /rawdata
![]() |
AW: exe ohne Zeitstempel etc. vergleichen
Ohne jetzt groß darüber nachgedacht zu haben: evtl. genügt es bereits, bei beiden Dateien den PE-Header "einfach" zu überspringen?
|
AW: exe ohne Zeitstempel etc. vergleichen
Zitat:
Delphi-Quellcode:
liefert
fc /b
Code:
bei einem Exe der Größe $17C00, also scheinbar ein Unterschied am Anfang und einer eher am Ende? Meine Experimente mit tdump haben auch immer Unterschiede bei zwei Time Stamps ergeben.
00000108: 2F 6F
00000109: 7E 68 00016604: 6E D4 00016605: 80 73 00016624: 6E D4 00016625: 80 73 0001666C: 6E D4 0001666D: 80 73 0001668C: 6E D4 0001668D: 80 73 000166A4: 6E D4 000166A5: 80 73 000166BC: 6E D4 000166BD: 80 73 000166D4: 6E D4 000166D5: 80 73 000166EC: 6E D4 000166ED: 80 73 00016704: 6E D4 00016705: 80 73 0001671C: 6E D4 0001671D: 80 73 00016734: 6E D4 00016735: 80 73 0001674C: 6E D4 0001674D: 80 73 |
AW: exe ohne Zeitstempel etc. vergleichen
Dann müsste man wohl über die Dokumentation des Dateiformats (es sei denn, man hat das zufällig komplett im Kopf) herauszufinden versuchen, was genau an den entsprechenden Stellen steht und diese dann vom Vergleich ausnehmen.
|
AW: exe ohne Zeitstempel etc. vergleichen
Wie wäre es mit einem Hash vergleich ? MD5 o.ä... ? Sind sie gleich, sind die Dateien gleich... 8-)
|
AW: exe ohne Zeitstempel etc. vergleichen
Es geht doch nicht darum, wie verglichen werden soll, sondern was. Ein Hash, der etwas auf sich hält, liefert doch auch nur dann gleiche Ergebnisse, wenn beide Dateien Byte für Byte gleich sind, und das sind sie ja nicht.
|
AW: exe ohne Zeitstempel etc. vergleichen
Zitat:
|
AW: exe ohne Zeitstempel etc. vergleichen
Joar, also entweder läßt man die unerwünschten Bereiche von der Berechnung des Hash's aus, oder man füllt/überschreibt die unerwünschten Bereiche mit definierten Werten und berechnet dann den Hash über alles.
@haentschman: Delphi schreibt den Compierzeitpunkt mit rein und der ist jedesmal anders. |
AW: exe ohne Zeitstempel etc. vergleichen
Zitat:
|
AW: exe ohne Zeitstempel etc. vergleichen
Ja, früher stand zwar da im PE-Header, wo der Wert reingehört, ein "MagicValue" und die Zeit mußte man sich dann an anderer Stelle in der Datei suchen, aber seit einer Weile schreiben die es auch endlich ordentlich rein. (wer es vorher schon richtig drin haben wollte, der konnte sich z.B. von den DDevExtensions helfen lassen)
Du kannst aber die Datei in den RAM laden, die PE-Header durchgehn, dann eben die entsprechenden Stellen überschreiben und eventuell auch noch in den Resourcen die VersionsInfo entfernen/überschreiben, vor dem Vergleichen/Haschen. Bzw. man kann die EXE ja auch in ihre Einzelteile zerlegen und jede Section einzeln haschen (notfalls dann noch zusammenrechnen). |
AW: exe ohne Zeitstempel etc. vergleichen
Zitat:
![]() Und ja, eine MD5 oder sonstige Dateiprüfziffer sollte natürlich bei verschiedenen Eingabedateien möglichst auch verschieden sein. Es gibt aber keine absolut "besseren" oder "schlechteren" Hashfunktionen, nur je Einsatzbereich unterschiedlich geeignete. Länger != "besser" ;) |
AW: exe ohne Zeitstempel etc. vergleichen
Zitat:
Nach dieser Quelle werden beim Kompilieren zufällige Bytes im Speicher nicht (zum Beispiel mit Nullen) initialisiert, und können daher bei jedem Buildvorgang neue Werte enthalten: ![]() Zitat:
|
AW: exe ohne Zeitstempel etc. vergleichen
Du könntest auch im Precompile-Script einen Hash aller *.pas + *.dfm Dateien machen und diesen Hash als Resource speichern. Reagiert dann aber auch auf Kommentaränderungen, die keine Auswirkungen auf den Code haben.
Alternaiv die SVN(/Git/Sonstige)-Revision ablegen. Ich gehe jetzt davon aus, dass es dein Prog ist und mit Delphi programmiert. Und dass du das Programm vergleichen willst, nicht das Ergebnis(exe). |
AW: exe ohne Zeitstempel etc. vergleichen
Ich würde folgendes vorschlagen:
Du machst keine Hash Überprüfung über die ganze Executable, die selbst aus verschiedensten Daten - mitunter Code - besteht, sondern nur nen Hash Vergleich mit den Code Sections! (".text" / "text" / ".code" / "code"...) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:05 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz