Frage

Wie verbringe ich zwei Binärdateien?

Ich habe zwei Versionen eines Programms, Version 1 und Version 2. Ich habe eine kleine Anzahl von Änderungen zwischen den beiden Versionen vorgenommen, aber leider nicht regelmäßig unterstützt, und obwohl ich die Quelle für Version 2 habe Ich habe nur die Binärdatei von Version 1. Ich muss herausfinden, was genau ich zwischen den beiden Versionen verändert habe. Ich habe versucht, einen Objdumph der beiden Versionen zu erstellen und dann Diff zu verwenden, um die Änderungen zu finden, aber das funktioniert nicht, da die Offsets unterschiedlich sind und Diff fast jede Zeile als geändert hat.

Zum Beispiel könnte eine Zeile sein bgez v0,4074d0<daemonize+0xd4> in Version 1 und und bgez v0,4073d4<daemonize+0xd4> In Version 2. werden diese direkt aus den Dump -Dateien kopiert. Sie können sehen, dass die beiden Zeilen dasselbe tun, aber Diff kann sie nicht unterscheiden. Die Dateien sind zu groß für mich, um jede Zeile manuell zu untersuchen. Wie erkenne ich Funktionenänderungen und ignoriert gleichzeitig Unterschiede im Offset?

War es hilfreich?

Lösung 2

Ich löste dies schließlich, indem ich die Rohanweisungen und Offset -Marker entfernen habe, sodass ich nur die Baugruppe hatte, dann SED zum Ausziehen jeder Ziffer und Filterung von Difffachen, um Änderungen zu ignorieren, die aus nur einer 1 -Linie bestehen. Ich war ein wenig überrascht, dass es funktioniert hat, aber es tat es.

Andere Tipps

Es ist möglich. Ich arbeite derzeit an einem Projekt, das in der Lage ist, Funktionen und Speicherzeigeradressen aus einer kompilierten Datei in einer neuen/modifizierten Binärdatei zu suchen. Es unterstützt Windows PE- und Elf -Binärdateien auf x86 und x86_64. Es gibt auch ein Papier, das den Ansatz beschreibt. Es funktioniert gut für mein Umkehrprojekt, bei dem ich alle Hooks und Speicheradressen häufig aktualisieren muss, wenn binäre Updates vorgenommen werden. Aber es gibt auch andere Anwendungsfälle.

Schau es dir hier an.

Der Trick ist, dass es sich nicht auf schwache Textvergleiche stützt, sondern die Binärdateien abgebaut und alle Funktionen vergleicht, indem der geometrische Abstand zwischen ihnen unter Verwendung von Codemetriken gemessen wird.

Kurze Antwort: Sie können nicht.

Lange Antwort: Schreiben Sie Ihren eigenen Diff, der einen oder einen der Operanden der Opcodes ignorieren kann, wenn sie ein numerischer unmittelbarer Wert sind.

Sie können SED oder AWK (oder Perl oder ...) verwenden, um einen Filter zu schreiben, um alle Offsets identisch zu machen, bevor Sie Differie ausführen. Das Schreiben eines solchen Filters wird dem Leser als Übung überlassen. :-P

Sicher etwas wie BSDIFF Würde den Job machen?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top