Vergleicht generierte ausführbare Dateien auf Äquivalenz

8

Ich muss zwei ausführbare Dateien und / oder gemeinsame Objekte vergleichen, die mit den gleichen Compiler / Flags kompiliert wurden und sicherstellen, dass sie sich nicht geändert haben. Wir arbeiten in einer regulierten Umgebung, so dass es für Testzwecke wirklich nützlich wäre, genau zu bestimmen, welche Teile der ausführbaren Datei sich geändert haben.

Die Verwendung von MD5Sums / Hashes funktioniert nicht, da die Header Informationen über die Datei enthalten.

Kennt irgendjemand ein Programm oder eine Methode, um zu überprüfen, dass 2 Dateien gleichwertig sind, selbst wenn sie zu einem anderen Zeitpunkt erstellt wurden?

    
Luciano 12.07.2010, 19:35
quelle

3 Antworten

4

Eine interessante Frage. Ich habe ein ähnliches Problem auf Linux. Intrusion-Detection-Systeme wie OSSEC oder Tripwire können zu Fehlalarmen führen, wenn sich die Hashsumme einer ausführbaren Datei plötzlich ändert. Dies ist möglicherweise nichts Schlimmeres als das "Prelink" -Programm von Linux, das die ausführbare Datei für schnelleres Starten patcht.

Um zwei Binärdateien zu vergleichen (im ELF-Format ), kann man die ausführbare Datei "readelf" verwenden und dann "diff" zum Vergleichen von Ausgaben. Ich bin mir sicher, dass es raffinierte Lösungen gibt, aber ohne weitere Umschweife, ein armer Mann Komparator in Perl:

%Vor%

Jetzt können Sie zum Beispiel auf Maschine 1 laufen:

%Vor%

Und auf Maschine 2:

%Vor%

Nachdem Sie kopiert, SFTP-ed oder NSF-ed (Sie verwenden nicht FTP, oder?) die Dateien in den gleichen Dateibaum, vergleichen Sie die Dateien:

%Vor%

In meinem Fall existieren Unterschiede in den Abschnitten ".gnu.conflict", ".gnu.liblist", ".got.plt" und ".dynbss", was für eine "prelink" - Intervention in Ordnung sein könnte, aber in der Codeabschnitt ".text", der ein Bad Sign wäre.

    
David Tonhofer 15.11.2011 18:54
quelle
1

Um weiter zu kommen, hier ist, was ich schließlich herausgefunden habe:

Anstatt die endgültigen ausführbaren Dateien & amp; Gemeinsame Objekte, verglichen wir die .o-Dateien vor der Verknüpfung. Wir nahmen an, dass der Verknüpfungsprozess ausreichend reproduzierbar war, dass dies in Ordnung wäre.

Es funktioniert in einigen unserer Fälle, wo wir zwei Builds haben, wo wir eine kleine Änderung vorgenommen haben, die den endgültigen Code (Code-Pretty-Drucker) nicht beeinflussen sollte, aber uns nicht hilft, wenn wir das nicht haben Build intermediate output.

    
Luciano 11.02.2011 16:07
quelle
-1

Vor ein paar Jahren musste ich dasselbe tun. Wir mussten beweisen, dass wir die ausführbare Datei von der Quelle wiederherstellen konnten, wenn sie nur eine Revisionsnummer, ein Versionskontroll-Repository, Build-Tools und Build-Konfiguration erhielten. Hinweis: Wenn eine dieser Änderung ist, sehen Sie möglicherweise einen Unterschied.

Ich erinnere mich, dass es einige Zeitstempel in der ausführbaren Datei gibt. Der Trick besteht darin, zu erkennen, dass die Datei nicht nur aus einer Menge Bytes besteht, die nicht interpretiert werden können. Die Datei hat Abschnitte, die meisten werden sich nicht ändern, aber es wird einen Abschnitt für die Zeit der Erstellung geben (oder so etwas).

Ich erinnere mich nicht an alle Details, aber die Befehle, die Sie benötigen, sind {objcopy, objdump, nm}, ich denke objdump wäre der erste, der es versucht.

Hoffe, das hilft.

    
ctrl-alt-delor 04.10.2013 12:54
quelle