Wie bereits gezeigt identifiziert eine Suche auf der Basis von Ähnlichkeiten im oberen Teil von Page Directories zu vielen falschen Treffern. In diesem Beitrag werde ich diese Doppelgänger von Page Directories näher betrachten.
Zunächst einmal ist sehr unwahrscheinlich, dass ein Block zufälliger Daten einem Page Directory ähnelt. Weiterhin habe ich auf dem Testsystem keinerlei Datenstrukturen untersucht, bevor nicht das Speicherabbild vollständig erstellt war. Die Doppelgänger werden deshalb auch nicht Artefakte eines zwischengespeicherten Speicherabbildes sein.
Wenn etwas wie ein PD aussieht, was passiert dann, wenn man es auch als PD interpretiert? Hier lässt sich noch einmal die Selbstreferentialität des PD ausnutzen; PDE 0x0300 nennt dann die Page Frame Number und damit die Adresse des "wahren" PD. Interessanterweise gibt es an dieser Adresse tatsächlich ein gültiges PD.
Ich habe also das originale Page Directory mit seiner vermeintlichen Kopie verglichen. Beide stimmen bis auf das letzte Bit überein! Aber welche Systemaktivität erzeugt diese Kopien und warum?
Die ersten Speicherabbilder erzeugte ich mittels dd. Nun mag man einwenden, dass das System weiterhin arbeitet, während dd den Arbeitsspeicher in eine Datei kopiert. Wenn nun während dieser Zeit das Betriebssystem das PD im Speicher verschiebt, dann könnte dd das selbe PD mehrfach sichern. Wirklich das selbe PD? Genau genommen nicht, denn dann müssten sich Original und Kopie zumindest im PDE 0x300 unterscheiden.
Zudem fand ich Kopien von PD auch in Speicherabbildern die mit anderen Methoden erstellt wurden,insbesondere durch Pausieren von virtuellen Maschinen in VMware durch durch Provozieren von Crash Dumps. Diese beiden Methoden stellen sicher, dass während der Erstellung des Abbildes die gewöhnliche Systemaktivität ruht.
Ich denke deshalb, dass die gewöhnliche Aktivität des Betriebssystems diese Kopien verursacht. Aber ich kenne derzeit die genaue Ursache nicht.
Nachfolgend zeige ich die Ergebnisse eines Suchlaufs über das erste Abbild aus der DFRWS 2005 Memory Analysis Challenge. Test1 basiert auf der Selbstreferentialität von Page Directories, Test 2 verwendet die Ähnlichkeit in den oberen Bereichen von Page Directories mehrerer Prozesse.
Offset Test1 Test2 Remarks 0x00000000 0.0000 1.0000 0x00030000 1.0000 1.0000 0x00233000 0.0000 1.0000 0x0059e000 0.9902 1.0000 0x01a24000 0.9902 1.0000 0x01a6d000 0.9902 1.0000 0x01d9e000 0.9901 1.0000 0x01f93000 0.9902 0.0000 appears to be PDE at 0x01a24000 (WinMgmt.exe) 0x02bf1000 0.9902 1.0000 0x02ce5000 0.9902 1.0000 0x02ce7000 0.9902 1.0000 0x02dbc000 0.9902 1.0000 0x02e4c000 0.9901 1.0000 0x030cb000 0.9901 0.0000 appears to be PDE at 0x02e4c000 (alogserv.exe) 0x03104000 0.9901 1.0000 0x039a2000 0.9901 1.0000 0x039cb000 0.9902 0.0000 appears to be PDE at 0x02dbc000 (DragDrop.exe) 0x03b46000 0.9902 0.0000 appears to be PDE at 0x02dbc000 (DragDrop.exe) 0x03ca1000 0.9902 1.0000 0x03e02000 0.9902 1.0000 0x03fb0000 0.9901 1.0000 0x0429f000 0.9902 1.0000 0x043de000 0.9902 1.0000 0x04461000 0.9902 0.0000 appears to be PDE at 0x02dbc000 (DragDrop.exe) 0x04fe4000 0.9902 1.0000 0x052ad000 0.9902 1.0000 0x052e5000 0.9902 1.0000 0x0575e000 0.9901 1.0000 0x058dd000 0.9901 1.0000 0x05a23000 0.9902 1.0000 0x05cb4000 0.9902 1.0000 0x05d0c000 0.9901 1.0000 0x05e2e000 0.9902 1.0000 0x05f78000 0.9902 1.0000 0x0600d000 0.9902 1.0000 0x0615e000 0.9901 0.0000 appears to be PDE at 0x0575e000 (cmd.exe) 0x06173000 0.9902 1.0000 0x06423000 0.9901 0.0000 appears to be PDE at 0x058dd000 (cmd2k.exe) 0x067b5000 0.9900 1.0000 0x06955000 0.9902 1.0000 0x06c98000 0.9902 1.0000 0x06f53000 0.9903 1.0000 0x07234000 0.9902 1.0000 0x0739d000 0.9901 1.0000 0x075a7000 0.9902 1.0000 0x076b2000 0.9901 1.0000
Das Programm, das diese Daten ermittelt, stelle ich auf Anfrage im Einzelfall gerne zur Verfügung. Der Code ist allerdings noch zu unreif und die Funktionalität zu eingeschränkt, um es für die Allgemeinheit freizugeben.
