Wiederherstellen von In-Memory-Pages-Daten nach fehlgeschlagenem Aufwecken im Ruhezustand

9

Das Macbook meiner Freundin stürzte ab, als versucht wurde, eine Datei aus dem Ruhezustand wiederherzustellen. Der Fortschrittsbalken wurde bei ~ 10% angehalten. Danach haben wir den Computer für einen normalen Start neu gestartet.

Für dieses Speicherbild im Ruhezustand war in Pages ein nicht gespeichertes Dokument geöffnet, das wir wiederherstellen möchten. Es gibt ein sleepimageIn /private/var/vm, von dem ich annehme, dass es sich um das Ruhezustand-Image handelt, das nie korrekt wiederhergestellt wurde. Wir haben dieses Ding gesichert, um es am Leben zu erhalten.

Wir haben es versucht, strings sleepimage | grep known_substringaber es hat nichts zurückgegeben. grep -a known_substring sleepimageIch habe auch nichts getan, daher gehe ich davon aus, dass Pages die Textdaten nicht als einfachen Text gespeichert hat.

Bearbeiten: Nachdem ich diese Antwort auf Binary Grep gelesen hatte, versuchte ich es perl -ln0777e 'print unpack("H*",$1), "\n", pos() while /(null_padded_substring)/g' sleepimagewieder fruchtlos zu machen. Ich habe es mit Nullen aufgefüllt, um eine Übereinstimmung für UTF-8-Text zu versuchen. Dann habe ich es mit .*Klumpen zwischen den einzelnen Charakteren versucht - immer noch keine Würfel.

Daher speichert Pages wahrscheinlich keinen Text durch eine übliche Codierung im Speicher. Ich müsste eine Übersetzungsregel zwischen ASCII-Zeichenfolge und Pages-Datendarstellung finden - ich denke vielleicht an eine Art Objective C-Zeichenfolgenpuffer. Für mich scheint es sehr seltsam, Zeichendaten als etwas anderes als eine Folge von Zeichen zu speichern, aber genau das scheint Pages zu tun.

Wenn Sie eine Idee haben, wie Sie die speicherinterne Darstellung von Text in Pages herausfinden können, kann dies bei der Lösung dieses Problems sehr hilfreich sein. Vielleicht kann ich den Prozessspeicher auf einfache Weise sichern und lesen?

Eine andere mögliche Lösung ist einfacher - ich gehe davon aus, dass es irgendwie möglich ist, den Computer von hier aus neu zu starten sleepimage, aber ich kann keine Dokumentation finden, wie Sie damit vorgehen würden. Einige andere Benutzer ( Makrumoren ) scheinen darauf gestoßen zu sein, aber bei allen Forumfragen , die ich gefunden habe, hat keiner von ihnen Antworten.

Die OS X-Version ist Snow Leopard, 10.6.8.

Komplexe Programmiervorschläge sind willkommen. Ich mache C und Python.

Vielen Dank.

sapht
quelle
1
Hoffentlich haben Sie eine Kopie dieser Datei erstellt, damit Sie nicht ein neueres Schlafbild untersuchen, das nach dem Neustart geschrieben wurde. Dann möchten Sie möglicherweise die Situation (ohne Absturz) mit einem maximalen freien RAM neu erstellen - dh nur Seiten öffnen, schreiben Sie einen eindeutigen Text und lassen Sie das Betriebssystem ein neues Schlafbild schreiben. und dann beginnen Sie, das für Ihren einzigartigen Text zu untersuchen.
Iolsmit
@iolsmit Ja, alle Tests werden an einer Kopie von durchgeführt sleepimage. Das Durchsuchen eines anderen Bildes nach eindeutigem Text wäre ebenso schwierig, da das Bild immer noch 4 GB groß wäre und der Pages-Speicherblock irgendwo zufällig in dieser Datei zugewiesen würde. Ich nehme an, ich könnte den Arbeitsspeicher auf Null setzen, dann Seiten öffnen und dann im Schlafbild nach Sequenzen ungleich Null suchen. Aber Pages verbraucht trotzdem 200 MB Speicher - immer noch eine kleine Nadel im Heuhaufen.
Sapht
Ihr Text wird mit 0x00 zwischen den einzelnen Zeichen gespeichert, daher müssen Sie danach oder nach dieser Zeichenfolge suchen: loobsdpkdbik; siehe auch meine Antwort unten
iolsmit
Sind auf den Versionen nicht standardmäßig Versionen aktiviert, auch wenn Sie keine Zeitmaschinensicherung haben (suchen Sie nach mobilen Sicherungen, bei denen das System die Daten auch ohne angeschlossenes Sicherungslaufwerk sichert)? Haben Sie einfachere Möglichkeiten ausgeschlossen, die Datei zurückzugewinnen, ohne eine forensische Analyse des Schlafbild-Dateiformats durchzuführen? (egal wie großartig das sein wird, wenn du es
abziehst
@bmike Versionen wurden nur mit Lion geliefert, aber diese Maschine ist auf Snow Leopard (10.6.8) und ich erinnere mich, dass ich einiges an Arbeit verloren habe, weil iWork auf SL abstürzte und nicht automatisch
gespeichert wurde

Antworten:

1

Update mit Bildern:

  • dass loobsdpkdbikKennung zuerst erwähnt, ist nicht ein - kurz vor meinem Text das erste Mal , sein happend ich es versucht.

  • Ein Teil des Textes scheint "verloren" zu gehen (dh nicht in einem fortlaufenden Speicherbereich gespeichert zu werden), und dies kann sich mit der RAM-Nutzung verschlechtern

  • Möglicherweise können Sie keinen aussagekräftigen Text aus dem Schlafbild wiederherstellen

Nun mein Originaltext (mit Tippfehler im 1. Absatz, sry Mr. Matisse):

Versteckte Schätze: MoMas Abby Aldrich Rockefeller Sculpture Garden, 1953 von Philip Johnson entworfen, ist eine spektakuläre urbane Oase mit reflektierenden Pools und wunderschöner Landschaftsgestaltung. Diese Außengalerie ist mit wechselnden Ausstellungen von Skulpturen im Freien ausgestattet, darunter Werke von Aristide Maillol, Alexander Calder, Henri Maisse, Pablo Picasso und Richard Serra.

Wenn Sie die neuen Gemälde- und Skulpturengalerien im MoMa besuchen, sollten Sie unbedingt die Treppe überqueren, die den vierten und fünften Stock überbrückt, um Henri Matisses monumentales Bild von Freude und Energie, Dance (1909), zu sehen. Das Gemälde sollte ursprünglich im Treppenhaus eines russischen Palastes in Moskau hängen.

Und der wiederhergestellte Text:

Versteckte Edelsteine: Ma s Abby Aldrich Rockeller Sculpre Gn, entworfen von Phip John 1953, ist ein spektakulärer ursithtseflecting Pools autifulandscapg. Diese Galerie im Freien ist mit wechselnden Ausstellungsstücken von Outor Sculpre ausgestattet, darunter Arbeiten von Aristide Maillol, Alexander Calder, Henri Maisse, Pabloicasso und Anchard Sea.

Achten Sie beim Betrachten der neuen Galerien für Gemäldeskulpturen in Ma darauf, die Brücke zu überbrücken, die das vierte Bild von Henri Matse, dem Bild von Freude und Augen, Dan (19), überbrückt. Das Gemälde befand sich in der Treppenhalle des Rsian-Palastes in Moskau.

Und die Screenshots:

Originaltext in Seiten

Text aus dem Schlafbild wiederhergestellt


Es scheint , dass für ein (nicht gespeicherten) Pages - Dokument (fast) alle Zeichen in Ihrem Text durch getrennt sind 0x00im Speicher - so STRINGwird S.T.R.I.N.Gmit zu .sein 0x00. Also muss man entweder danach suchen; Ich kann 0xED für ein grafisches Front-End empfehlenloobsdpkdbik ... oder Sie suchen nach einem Bezeichner, der 5 Bytes vor dem Text steht (zumindest in einem Fall).

iolsmit
quelle
Hmm, ich habe nach "loobsdpkdbik" gesucht, aber immer noch leer. Wurde diese Kennung vor jeder Variante des nicht gespeicherten Dokuments angezeigt? Vielleicht bedeutet es etwas über das Dokument - wie Fenstervererbung, Standardschriftart usw. Ich habe früher mit Perl nach einer mit Nullen aufgefüllten Zeichenfolge gesucht, dh es s\0u\0b\0s\0t\0r\0i\0n\0ghat nicht funktioniert, mehr Beschreibung ist in meiner ursprünglichen Frage. Oh - wie hast du das herausgefunden?
Sapht
@sapht Ich habe meine Antwort aktualisiert. Es scheint, dass der Text nicht kontinuierlich im Speicher gespeichert ist, was es unmöglich machen könnte, sich vom Schlafbild zu erholen. Und dass "loobsdpkdbik" nicht mit dem Pages-Dokument zusammenhängt, sondern zufällig vor meinem Text steht.
Iolsmit
Vielleicht gehörte der Teilstring damals zu den gemurmelten Worten des diskontinuierlichen Gedächtnisses. Ich habe noch keine Daten im Schlafbild gefunden, aber wir müssen möglicherweise nur nach dem richtigen Teilstring suchen. Oder der Speicherblock wurde nie geschrieben. Gute Arbeit bei der Untersuchung des Schlafbildes, danke.
Sapht
@sapht Wenn Ihr Schlafbild nicht beschädigt ist, sollte es den vollständigen Text des Pages-Dokuments enthalten. Durch das Wiederherstellen des Arbeitsspeichers wird es dort platziert, wo sich das System im Ruhezustand befand. Ich würde empfehlen, das Sleepimage in einer virtuellen Maschine zu testen: Installieren Sie jedes unterstützte OS X in einer virtuellen Maschine (oder verwenden Sie VMware Fusion 4.1 ;) - klonen Sie dann Ihre Maschine auf die virtuelle Festplatte und starten Sie das Booten vom Sleepimage.
Iolsmit
2

Erster Versuch, WENN know_string im Klartext gespeichert wurde (nicht der Fall)

Ich denke du könntest es versuchen

grep -Ubo --binary-files=text "known_substring" sleepimage 

Aus diesem Grund gibt der Parameter -U die Suche in Binärdateien an, -b gibt an, dass der Versatz in Bytes zum übereinstimmenden Teil angezeigt werden soll, und schließlich gibt -o an, dass nur der übereinstimmende Teil gedruckt werden soll.

Wenn das funktioniert, würden Sie den Offset in Bytes kennen, um zu dieser Region zu gelangen, aber ich würde nicht genau wissen, wie ich dort vorgehen soll. Abhängig vom Dateityp könnten Sie wahrscheinlich nach der Dateitypsignatur in der Nähe dieses informierten Offsets suchen und versuchen, nur die Bytes zu isolieren, die Teil dieser Datei sind. Dazu könnten Sie entweder ein C-Programm schreiben, um dies zu tun, oder vielleicht ausführen hexdump -s known_offset sleepimageund versuchen, nur die Bytes abzurufen, die sich auf die benötigte Datei beziehen.

Angenommen, ich wollte etwas über Chrome wissen:

$ sudo grep -Ubo --binary-files=text -i "chrome" sleepimage
3775011731:chrome

Ich weiß also, dass beim Byte-Offset 3775011731 Chrom vorkommt. Daher könnte ich:

$ sudo hexdump -s 3775011731 sleepimage | head -n 3
e1021b93 09 09 3c 73 74 72 69 6e 67 3e 2e 63 68 72 6f 6d
e1021ba3 65 2e 67 6f 6f 67 6c 65 2e 63 6f 6d 3c 2f 73 74
e1021bb3 72 69 6e 67 3e 0a 09 09 3c 6b 65 79 3e 45 78 70

Der schwierige Teil wäre, nur die gewünschten Bytes zu erhalten. Wenn der Dateityp einen bekannten Header hat, können Sie möglicherweise die Headergröße in Bytes vom Hexdump-Offset abziehen, sodass Sie die Datei "von Anfang an" erhalten. Wenn der Dateityp eine bekannte "EOF" -Signatur hat, können Sie auch versuchen, danach zu suchen, und daher nur die Bytes bis zu diesem Punkt abrufen.

Was ist Ihr Dateityp? Denken Sie, dass in Ihrem Fall ein solches Verfahren angewendet werden könnte? Beachten Sie, dass ich dies noch nie zuvor getan habe und mich auf viele "Vermutungen" stütze, aber ich nehme an, dass so etwas eine kleine Chance hat, zu funktionieren.

Zweiter Versuch, eine langsame Methode zum Parsen aller Bytes

Die Methode vorher funktioniert nicht, weil sie auch nur nach einfachem Text sucht, meine Wette. Für diesen zweiten Text habe ich ein einfaches C-Programm erstellt, das Folgendes enthält:

#include <stdio.h>

int main () {
  printf("assim");
  return 0;
}

Also könnte ich in diesem Text nach "assim" suchen, was Ihre bekannte Zeichenfolge wäre. Um zu wissen, nach welchen Bytes gesucht werden soll, habe ich Folgendes getan:

$ echo -n "assim" | hexdump
0000000 61 73 73 69 6d                                 
0000005

Daher muss ich "61 73 73 69 6d" finden. Nachdem ich diese einfache C-Quelle in das Programm "tt" kompiliert hatte, habe ich Folgendes getan:

hexdump -v -e '/1 "%02X\n"' tt | # format output for hexdump of file tt
    pcregrep -M --color -A 3 -B 3 "61\n73\n73\n69\n6D" # get 3 bytes A-fter and 3 bytes B-fore the occurence

Was zu mir zurückkehrte:

Geben Sie hier die Bildbeschreibung ein

Wenn Sie so etwas tun würden, könnten Sie wahrscheinlich Ihre Daten abrufen. Es wäre allerdings etwas langsam, 2 bis 8 GB Bytes zu analysieren ...

Beachten Sie, dass Sie bei diesem Ansatz die Hexen in Großbuchstaben finden müssen (schreiben Sie 6D anstelle von 6d auf dem letzten Grep), nicht in Kleinbuchstaben, und \ n anstelle von Leerzeichen verwenden müssen (damit Sie -A und - verwenden können) B für den grep). Sie könnten es verwenden grep -i, damit die Groß- und Kleinschreibung nicht berücksichtigt wird, aber es wäre etwas langsamer. Verwenden Sie daher nur Großbuchstaben, wenn dies verwendet wird.

Oder wenn Sie ein automatisiertes "Skript" möchten:

FILENAME=tt # file to parse looking for string
BEFORE=3 # bytes before occurrence
AFER=3 # bytes after occurrence
KNOWNSTRING="assim" # string to search for

ks_bytes="$(echo -n "$KNOWNSTRING" | hexdump | head -n1 | cut -d " " -f2- | tr '[:lower:]' '[:upper:]' | sed -e 's/ *$//g' -e 's/ /\\n/g')"

hexdump -v -e '/1 "%02X\n"' $FILENAME | pcregrep -M --color -A $AFER -B $BEFORE $ks_bytes
FernandoH
quelle
Der Text wird nur im Speicher gespeichert, da die Datei nie gespeichert wurde. Es gibt also keinen echten Dateityp, sondern nur die Art der Darstellung, die Pages intern für die Daten aufbewahrt. Die Weitergabe -Uan grepschien keinen großen Unterschied zu machen ( akurz für --binary-files=text). Wenn ich den Byte-Offset hätte, könnte ich definitiv fortfahren, aber entweder ist die Datei beschädigt oder Pages speichert die Daten auf eine Nicht-ASCII-Weise. Möglicherweise UTF-8, grepakzeptiert jedoch keine Null-Bytes für ein Übereinstimmungszeichen.
Sapht
Ich habe den Beitrag mit einem weiteren Versuch bearbeitet. Es scheint zu funktionieren. Es ist jedoch sehr langsam und Sie müssen "raten", wie viele Bytes Sie vor und nach dem Auftreten des bekannten Strings benötigen. Hinweis: Wenn ich echo -n "assim" | hexdumpden Hexdump für die UTF-8-Codierung erhalte, können Sie echo -n "assim" | iconv -t UTF-16 | hexdumpandere Codierungen ausprobieren , in diesem Fall UTF-16. Ich habe keine Ahnung, wie er im Speicher gespeichert ist. In meinem Fall wurde er jedoch gespeichert als UTF-8 in der Tat :)
FernandoH
Hmm, nun, der Hex-Dump für Ihr C-Programm druckt den Text, da er tatsächlich in die Binärdatei eingebettet ist - gcc wird auf diese Weise kompiliert, sodass alle statischen Zeichenpuffer im Programm selbst als In-Memory-Referenz gespeichert werden. Für Pages wurden diese Daten jedoch bei runti e erstellt. Ich habe meine Antwort mit einer neuen Übereinstimmung aktualisiert, die ich über Perl versucht habe, was erfolglos war. Daher bin ich mir ziemlich sicher, dass der Text auf eine seltsame, nicht standardmäßige Weise gespeichert wird, da die ASCII-Bytes nicht einmal gleich sind. Vielleicht ein objektiver C-String-Puffer ...
Sapht
Hummm .. Was wäre, wenn Sie stattdessen versuchen würden, nach der Zeichenfolge "Pages.app" zu suchen? Ich würde nicht wissen, wie ich von dort aus vorgehen soll, wenn etwas gefunden würde (z. B. was zur App gehört und was ist Ihr Dokument?), Aber wenn wir diesen Gedankengang beibehalten würden, könnte dies der Beginn eines Versuchs sein. Obwohl ich zugeben muss, dass es einfachere Alternativen geben muss, wäre dies eine ziemlich mühsame
FernandoH
Erinnerst du dich an Stücke aus dieser Papers-Datei? Obwohl es im Speicher gespeichert wurde, können Sie versuchen, direkt nach diesen zu suchen, wenn Sie einige genaue Sätze kennen, die dort geschrieben wurden (wenn Sie sich erinnern oder wenn Sie eine frühere Version der Datei haben)! Das wäre viel einfacher, denke ich :) Und da Pages ein Textbearbeitungsprogramm ist, möchten Sie wohl das wiederherstellen, was geschrieben wurde, oder? Wenn dies der Fall ist, suchen Sie nach dem Inhalt anstatt nach Metainformationen, es kann einfacher sein. Ich hoffe zumindest.
FernandoH