Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   exe ohne Zeitstempel etc. vergleichen (https://www.delphipraxis.net/170037-exe-ohne-zeitstempel-etc-vergleichen.html)

uligerhardt 27. Aug 2012 14:09

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:
dumpbin /rawdata
funktionieren - siehe hier. Leider habe ich kein dumpbin.exe und würde auch ungern extra deswegen ein VS Express installieren. Ich hab auch mal etwas mit tdump.exe herumprobiert, aber das unterdrückt mir auch die relevanten Änderungen. Hat jemand eine Idee?

DeddyH 27. Aug 2012 14:57

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?

uligerhardt 27. Aug 2012 15:10

AW: exe ohne Zeitstempel etc. vergleichen
 
Zitat:

Zitat von DeddyH (Beitrag 1180134)
Ohne jetzt groß darüber nachgedacht zu haben: evtl. genügt es bereits, bei beiden Dateien den PE-Header "einfach" zu überspringen?

Ein
Delphi-Quellcode:
fc /b
liefert
Code:
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
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.

DeddyH 27. Aug 2012 15:14

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.

haentschman 27. Aug 2012 15:53

AW: exe ohne Zeitstempel etc. vergleichen
 
Wie wäre es mit einem Hash vergleich ? MD5 o.ä... ? Sind sie gleich, sind die Dateien gleich... 8-)

DeddyH 27. Aug 2012 15:57

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.

haentschman 27. Aug 2012 16:02

AW: exe ohne Zeitstempel etc. vergleichen
 
Zitat:

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
...sollte doch mit MD5 machbar sein. Von jeder EXE den Hash vergleichen. Wird der gleiche Quellcode kompiliert ist der Hash gleich. Voraussetzung: Die Versionsinformationen (Build) wird nicht erhöht. Dann würden sie sich unterscheiden.

himitsu 27. Aug 2012 16:02

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.

haentschman 27. Aug 2012 16:05

AW: exe ohne Zeitstempel etc. vergleichen
 
Zitat:

Delphi schreibt den Compierzeitpunkt mit rein und der ist jedesmal anders.
...echt jetzt ? Dann ist es nicht so einfach... :(

himitsu 27. Aug 2012 16:20

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).

mjustin 27. Aug 2012 17:13

AW: exe ohne Zeitstempel etc. vergleichen
 
Zitat:

Zitat von DeddyH (Beitrag 1180160)
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.

Was bedeutet "der etwas auf sich hält"? Ein Hash (oder eine Hashfunktion) kann auch eine Prüfziffer sein, wie zum Beispiel bei der ISBN. Damit dürfte es nur zehn verschiedene eindeutige Bücher im Handel geben, mit je einer von zehn verschiedenen ISBN. Wollen wir das ;) ?

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" ;)

mjustin 27. Aug 2012 17:20

AW: exe ohne Zeitstempel etc. vergleichen
 
Zitat:

Zitat von uligerhardt (Beitrag 1180115)
wenn ich das Projekt zweimal kompiliere, ohne etwas zu ändern, möchte ich als Ergebnis "gleich", unabhängig von irgendwelchen Zeitstempeln etc.


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:

http://stackoverflow.com/a/2014040/80901

Zitat:

Part of the problem your seeing, IIRC, is that the compiler doesn't zero out memory before doing a compile/build. Thus anything left in uninitialized memory becomes filler in the output for alignment purposes.

WM_CLOSE 27. Aug 2012 17:47

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).

Aphton 27. Aug 2012 18:18

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 14:10 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz