Ripristinare i dati di Pages in memoria dal riattivazione del letargo non riuscita


9

Il Macbook della mia ragazza si è arrestato in modo anomalo durante il tentativo di ripristino da un file ibernato. La barra di avanzamento si è fermata al ~ 10%, dopo di che abbiamo riavviato il computer per un normale avvio.

Questa immagine di memoria in letargo aveva un documento non salvato aperto in Pages, che vorremmo recuperare. C'è un sleepimagein /private/var/vm, che presumo sia l'immagine di ibernazione che non è mai stata ripristinata correttamente. Abbiamo sostenuto questa cosa per tenerla in vita.

Ci abbiamo provato strings sleepimage | grep known_substringma non ha restituito nulla. grep -a known_substring sleepimageinoltre non ha fatto nulla, quindi suppongo che Pages non abbia conservato i dati di testo in memoria come testo normale.

Modifica: Dopo aver letto questa risposta su Binary grep, ho provato a farlo perl -ln0777e 'print unpack("H*",$1), "\n", pos() while /(null_padded_substring)/g' sleepimage, essendo di nuovo inutile. L'ho riempito di null per tentare una corrispondenza per il testo UTF-8. Poi ho provato con i .*globs tra ogni personaggio - ancora nessun dado.

Quindi probabilmente Pages non memorizza il testo con alcuna codifica comune in memoria. Avrei bisogno di trovare una regola di traduzione tra la stringa ASCII e la rappresentazione dei dati di Pages: sto forse pensando a una specie di buffer di stringa dell'obiettivo C. A me sembra molto strano memorizzare i dati dei personaggi come nient'altro che una sequenza di caratteri, ma questo sembra essere ciò che Pages sta facendo.

Se hai idea di come capire la rappresentazione in memoria del testo all'interno di Pages, potrebbe essere molto utile per risolvere questo problema. Forse posso scaricare e leggere la memoria di processo in modo semplice?

Un'altra possibile soluzione è più semplice: suppongo sia in qualche modo possibile riavviare il computer da questo sleepimage, ma non riesco a trovare alcuna documentazione su come procedere. Alcuni altri utenti ( macrumori ) sembrano aver riscontrato questo, ma per tutte le domande del forum che ho trovato, nessuno di loro ha risposte.

La versione OS X è Snow Leopard, 10.6.8.

Suggerimenti complessi che coinvolgono la programmazione sono i benvenuti. Faccio C e Python.

Grazie.


1
Spero che tu abbia fatto una copia di quel file in modo da non esaminare un nuovo sleepimage che è stato scritto dopo il riavvio. Quindi potresti voler ricreare la situazione (senza crash) con una RAM libera massima - cioè solo le pagine aperte scrivono un testo univoco e lascia che il sistema operativo scriva un nuovo sleepimage; e quindi iniziare a esaminarlo per il tuo testo unico.
iolsmit,

@iolsmit Sì, tutti i test vengono eseguiti su una copia di sleepimage. Passare al setaccio un'altra immagine alla ricerca di un testo unico sarebbe altrettanto difficile, poiché l'immagine avrebbe comunque dimensioni di 4 GB e il blocco di memoria di Pages verrebbe allocato in modo casuale in quel file. Suppongo che potrei azzerare la RAM, quindi aprire le pagine e quindi cercare sequenze diverse da zero in sleepimage. Ma Pages consuma 200 MB di memoria, a prescindere - ancora un piccolo ago nel pagliaio.
sapht

Il testo è memorizzato con 0x00 tra ogni carattere, quindi devi cercarlo o cercare questa stringa: loobsdpkdbik; vedi anche la mia risposta qui sotto
iolsmit,

Le pagine non hanno versioni attivate per impostazione predefinita anche se non si dispone di un backup della macchina del tempo (cercare backup mobili in cui il sistema esegue il backup delle cose anche senza l'unità di backup connessa)? Hai escluso modi più semplici per recuperare il file senza condurre eroicamente un'analisi forense sul formato del file immagine di sospensione? (non importa quanto sarà fantastico se lo tiri fuori;)
bmike

Le versioni di @bmike sono arrivate solo con Lion, ma quella macchina è su Snow Leopard (10.6.8) e ricordo di aver perso un bel po 'di lavoro a causa di un crash di iWork su SL e di non avere un salvataggio automatico ...
iolsmit,

Risposte:


1

Aggiornamento con immagini:

  • che loobsdpkdbikidentificatore menzionato prima, non è uno - solo gionro per essere prima del mio testo la prima volta ho provato.

  • parte del testo sembra essere "perso" (cioè non salvato in un tratto di memoria continua) e questo può peggiorare con l'utilizzo della RAM

  • potresti non essere in grado di recuperare testo significativo dall'immagine del sonno

Ora il mio testo originale (con refuso nel 1 ° paragrafo, sry Mr. Matisse):

Hidden Gems: Abby Aldrich Rockefeller Sculpture Garden di MoMa, progettato da Philip Johnson nel 1953, è una spettacolare oasi urbana con le sue piscine che riflettono e il suo splendido paesaggio. Questa galleria all'aperto è installata con mostre mutevoli di sculture all'aperto, tra cui opere di Aristide Maillol, Alexander Calder, Henri Maisse, Pablo Picasso e Richard Serra.

Mentre visiti le nuove gallerie di pittura e scultura al MoMa, assicurati di attraversare la scala che collega il quarto e il quinto piano per vedere l'immagine monumentale di gioia ed energia di Henri Matisse, Dance (1909). Il dipinto era originariamente destinato ad essere appeso nella sala delle scale di un palazzo russo a Mosca.

E il testo recuperato:

Hidden Gems: La maia Abby Aldrich Rockeller Sculpre Gn, progettata da Phip John nel 1953, è una spettacolare ursithtseflecting pool autifulandscapg. Questa galleria all'aperto è arricchita da mostre temporanee di scultore esterno, tra cui opere di Aristide Maillol, Alexander Calder, Henri Maisse, Pabloicasso, mare di anchard.

Mentre guardi le nuove galere di sculture di pittura a Ma, assicurati di attraversare in stasi il ponte per la quarta quarta serie di immagini di Henri Matse sulla gioia e l'occhio di Dan (19). Il dipinto era intonato alla sala scale del palazzo Rsian di Mosca.

E le schermate:

Testo originale in Pages

Testo recuperato da sleepimage


Sembra che per un documento di Pagine (non salvato) (quasi) tutti i caratteri nel tuo testo siano separati da 0x00in memoria - così STRINGdiventa S.T.R.I.N.Gcon l' .essere 0x00. Quindi devi cercarlo; Posso raccomandare 0xED per un front-end grafico ... ..o cerchi loobsdpkdbikquale sembra essere (parte di) un identificatore, che arriva 5 byte prima del testo (almeno solo in un caso).


Hmm, ho cercato "loobsdpkdbik", ma ancora vuoto. Questo identificatore è apparso prima di ogni variante del documento non salvato? Forse significa qualcosa sul documento - come l'ereditarietà delle finestre, il carattere predefinito, ecc ... Ho cercato una stringa con riempimento null usando prima il perl, cioè s\0u\0b\0s\0t\0r\0i\0n\0gnon ha funzionato, più descrizione è nella mia domanda originale. Oh - come l'hai scoperto?
Sapht,

@sapht ho aggiornato la mia risposta; sembra che il testo non sia archiviato in un tratto continuo in memoria, il che potrebbe rendere impossibile il recupero dall'immagine del sonno. E che "loobsdpkdbik" non è correlato al documento di Pages, è solo successo prima del mio testo.
iolsmit,

Forse allora la sottostringa era tra le parole borbottate della memoria discontinua. Non ho ancora trovato alcun dato nel sleepimage, ma potremmo solo cercare la sottostringa giusta. O il blocco di memoria non è mai stato scritto. Ottimo lavoro per indagare sull'immagine del sonno, grazie.
Sapht

@sapht Se il tuo sleepimage non è corrotto, dovrebbe contenere il testo completo del documento di Pages, poiché il ripristino della RAM lo metterebbe nel punto in cui si trovava il sistema quando era in letargo. Consiglierei di provare il sleepimage in una macchina virtuale: Installa qualsiasi OS X supportato in una macchina virtuale (o usa VMware fusion 4.1 ;) - quindi clona la tua macchina sull'HDD virtuale e prova ad avviare da sleepimage.
iolsmit,

2

Primo tentativo, SE known_string ERA memorizzato in testo normale (non il caso)

Immagino che potresti provare a usare

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

Da ciò, il parametro -U specifica la ricerca sui file binari, -b specifica che l'offset in byte alla parte corrispondente deve essere visualizzato e, infine, -o specifica che deve essere stampata solo la parte corrispondente.

Se funziona, conosceresti l'offset in byte per arrivare a quella regione, ma non saprei esattamente come procedere lì. A seconda del tipo di file, è possibile verificare la firma del tipo di file vicino all'offset informato e provare a isolare solo i byte che fanno parte di quel file. Per questo, immagino che potresti scrivere un programma C per farlo, o forse eseguire hexdump -s known_offset sleepimagee provare a ottenere solo i byte relativi al file che ti serve.

Ad esempio, supponiamo che volessi sapere qualcosa su Chrome:

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

Quindi so di aver avuto una ricorrenza di chrome all'offset di byte 3775011731. Quindi potrei:

$ 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

La parte difficile sarebbe quella di ottenere solo i byte desiderati. Se il tipo di file ha un'intestazione nota, è possibile sottrarre la dimensione dell'intestazione in byte dall'offset hexdump, in modo da ottenere il file "dall'inizio". Se il tipo di file ha una firma "EOF" nota, puoi provare a cercarla e quindi ottenere solo i byte fino a quel punto.

Qual è il tuo tipo di file? Pensi che una procedura come questa possa essere utilizzata nel tuo caso? Nota che non l'ho mai fatto prima e mi sto basando su molte "ipotesi", ma suppongo che qualcosa del genere abbia una piccola possibilità di lavorare ..

Secondo tentativo, un metodo lento per l'analisi di tutti i byte

Il metodo prima non funziona perché cerca anche solo testo semplice, la mia scommessa. Per questo secondo testo ho creato un semplice programma C contenente:

#include <stdio.h>

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

Così ho potuto cercare "assim", che sarebbe la tua stringa nota, in quel testo. Per sapere quali byte cercare ho fatto:

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

Quindi, devo trovare "61 73 73 69 6d". Dopo aver compilato quella semplice sorgente C nel programma "tt", ho fatto quanto segue:

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

Che mi è tornato:

inserisci qui la descrizione dell'immagine

Se hai fatto qualcosa del genere, immagino che potresti ottenere i tuoi dati .. Sarebbe un po 'lento analizzare 2 ~ 8 GB di byte però ...

Nota che in questo approccio devi trovare gli esagoni in maiuscolo (scrivi 6D invece di 6d sull'ultimo grep), non in lettere maiuscole e usa \ n invece di spazi bianchi (in modo da poter usare -A e - B per il grep). Puoi usarlo in grep -imodo che diventi case-sensitive, ma sarebbe un po 'più lento. Quindi, usa solo maiuscole se questo è usato.

Oppure, se si desidera uno "script" completamente automatizzato:

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

Il testo viene archiviato solo in memoria, poiché il file non è mai stato salvato. Quindi non esiste un tipo di file reale, solo il tipo di rappresentazione che Pages mantiene internamente per i dati. Passare -Ua grepnon sembra fare molta differenza ( aè l'abbreviazione di --binary-files=text). Se avessi l'offset di byte, potrei sicuramente procedere, ma o il file è corrotto o Pages sta memorizzando i dati in un modo non ASCII. Forse UTF-8, ma grepnon accetterà byte nulli per un personaggio corrispondente.
sapht

Ho modificato il post con un altro tentativo .. sembra funzionare .. ma è davvero lento e dovrai "indovinare" quanti byte vuoi prima e dopo il verificarsi di known_string. Nota: quando echo -n "assim" | hexdumpottengo il hexdump per la codifica UTF-8, potresti provare echo -n "assim" | iconv -t UTF-16 | hexdumpper altre codifiche, in questo caso UTF-16, non ho Idead su come è memorizzato in memoria .. Ma nel mio caso è stato memorizzato come UTF-8 davvero :)
FernandoH,

Hmm, beh, il dump esadecimale per il tuo programma C stampa il testo dal momento che è effettivamente incorporato nel binario - gcc si compila in questo modo in modo che tutti i buffer di caratteri statici siano memorizzati nel programma stesso per riferimento in memoria. Ma per Pages quei dati sono stati creati a runti e. Ho aggiornato la mia risposta con una nuova corrispondenza che ho provato tramite perl, che è stata inutile, quindi sono abbastanza sicuro che il testo sia memorizzato in una strana maniera non standard, poiché i byte ASCII non sono uguali. Forse un po 'di buffer della stringa C obiettivo ...
sapht

Hummm .. E se invece provassi a cercare la stringa "Pages.app"? Non saprei come procedere da lì se fosse stato trovato qualcosa (come, cosa appartiene all'App e qual è il tuo documento?), Ma se dovessimo mantenere questo filo di pensiero, potrebbe essere l'inizio di un tentativo. Anche se devo ammettere che ci devono essere alternative più facili, questa sarebbe piuttosto laboriosa
FernandoH,

In realtà, ricordi pezzi di quel file Papers? Anche se è stato archiviato in memoria, se conosci alcune frasi esatte che sono state scritte lì (se ricordi o se hai una versione precedente del file), puoi provare a cercarle direttamente! Sarebbe molto più facile, immagino :) E dato che Pages è un programma di editing di parole, credo che tu voglia recuperare ciò che è stato scritto, giusto? In tal caso, cerca il contenuto anziché le meta informazioni, potrebbe essere più semplice .. Spero, almeno ..
FernandoH,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.