Wie die beiden früheren Teile gezeigt haben, ist die Rekonstruktion einer Programmdatei aus einem vollständigen Speicherabbild durchaus möglich. Allerdings gibt es keine Gewähr, dass das rekonstruierte Programm auch ausführbar ist. Den Grund erklärt dieser Artikel.
Bislang habe ich zwei sehr ähnliche Verfahren vorgestellt, um Programmdateien aus einem vollständigen Abbild des Arbeitsspeichers zu rekonstruieren. In jedem Fall bedarf es hierzu einiger Mühe. Lohnt sich der Aufwand?

Das rekonstruierte Programm aus den beiden früheren Artikeln verhält sich offensichtlich nicht wie erwartet. Es handelt sich dabei übrigens um dd aus George Garners Forensic Aquisition Utilities. Da das Original bekannt ist, bietet sich zur Klärung der Ursache für das eigenwillige Verhalten ein Vergleich mit der rekonstruierten Datei an. Ich verwende hierzu nwdiff.

Nwdiff markiert alle Bits, die sich unterscheiden. Wie man sieht, unterscheidet sich nur ein kleiner Teil der Rekonstruktion vom Original. Die betreffenden Adressen korrespondieren mit dem Abschnitt .data der Datei. Nun wird auch das Verhalten verständlich: Der Abschnitt .data einer ausführbaren Datei (im PE-Format) enthält einen initialisierten Datenbereich. Die hier abgelegten Variablen werden bereits mit ihrem Initialwert in den Speicher geladen und nicht erst zur Laufzeit durch das Programm initialisiert. Während der Programmausführung kann sich ihr Wert natürlich ändern.
Das Speicherabbild enthält das Programm nicht im jungfräulichen Zustand. In der oberen Grafik ist in der Programmausgabe ist zum Beispiel der Wert des Blockzählers "15435" deutlich zu erkennen. Unterstellt man als Blockgröße beim Aufruf von dd die Größe einer Speicherseite, also 4096 Bytes, so ergibt sich die Adresse 63221760, hexadezimal 0x3c4b000. Das ist nun genau die Adresse, an der der Abschnitt .data im Arbeitsspeicher beginnt (siehe die Tabelle am Ende des ersten Artikels). Der Prozess hat sich selbst abgebildet.
Ist die Rekonstruktion einer Programmdatei also sinnlos? Die dynamische Analyse eines Programms wird wahrscheinlich nicht möglich sein. Hierfür wäre ohnehin mehr Aufwand nötig, zum Beispiel die Rekonstruktion weiterer Dateien und von Eintragungen in der Registry.
Die statische Analyse der Programmdatei ist jedoch möglich. Das heißt, Sie können die Datei in einen Disassembler laden, ihren Header untersuchen und sie mit einem Virenscanner testen. Diese Möglichkeiten können durchaus den Aufwand der Rekonstruktion rechtfertigen.
