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 sleepimage
In /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_substring
aber es hat nichts zurückgegeben. grep -a known_substring sleepimage
Ich 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' sleepimage
wieder 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.
quelle
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.Antworten:
Update mit Bildern:
dass
loobsdpkdbik
Kennung 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):
Und der wiederhergestellte Text:
Und die Screenshots:
Es scheint , dass für ein (nicht gespeicherten) Pages - Dokument (fast) alle Zeichen in Ihrem Text durch getrennt sind
0x00
im Speicher - soSTRING
wirdS.T.R.I.N.G
mit zu.
sein0x00
. Also muss man entweder danach suchen; Ich kann 0xED für ein grafisches Front-Endempfehlen...loobsdpkdbik
oder Sie suchen nacheinem Bezeichner, der 5 Bytes vor dem Text steht (zumindestin einem Fall).quelle
s\0u\0b\0s\0t\0r\0i\0n\0g
hat nicht funktioniert, mehr Beschreibung ist in meiner ursprünglichen Frage. Oh - wie hast du das herausgefunden?Erster Versuch, WENN know_string im Klartext gespeichert wurde (nicht der Fall)
Ich denke du könntest es versuchen
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 sleepimage
und versuchen, nur die Bytes abzurufen, die sich auf die benötigte Datei beziehen.Angenommen, ich wollte etwas über Chrome wissen:
Ich weiß also, dass beim Byte-Offset 3775011731 Chrom vorkommt. Daher könnte ich:
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:
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:
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:
Was zu mir zurückkehrte:
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:
quelle
-U
angrep
schien keinen großen Unterschied zu machen (a
kurz 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,grep
akzeptiert jedoch keine Null-Bytes für ein Übereinstimmungszeichen.echo -n "assim" | hexdump
den Hexdump für die UTF-8-Codierung erhalte, können Sieecho -n "assim" | iconv -t UTF-16 | hexdump
andere 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 :)