9 votos

Recuperación de los datos de las páginas en memoria en caso de fallo en la activación de la hibernación

El Macbook de mi novia se estrelló al intentar restaurar desde un archivo hibernado. La barra de progreso se detuvo en ~10%, después de lo cual reiniciamos la computadora para un arranque normal.

Esta imagen de memoria hibernada tenía un documento sin guardar abierto en Pages, que nos gustaría recuperar. Hay un sleepimage en /private/var/vm que supongo que es la imagen de hibernación que nunca se restauró correctamente. Hicimos una copia de seguridad de esta cosa para mantenerla viva.

Intentamos strings sleepimage | grep known_substring pero no ha devuelto nada. grep -a known_substring sleepimage tampoco hizo nada, así que asumo que Pages no mantuvo los datos de texto en la memoria como texto plano.

Edición: Después de leer esta respuesta en Grep binario Intenté perl -ln0777e 'print unpack("H*",$1), "\n", pos() while /(null_padded_substring)/g' sleepimage , siendo de nuevo infructuoso. Lo rellené con nulos para intentar una coincidencia con el texto UTF-8. Luego probé con .* globos entre cada personaje todavía no hay dados.

Así que es probable que Pages no almacene el texto por ninguna codificación común en la memoria. Necesitaría encontrar una regla de traducción entre la cadena ASCII y la representación de datos de Pages -- estoy pensando quizás en algún tipo de buffer de cadena de Objective C. A mí me parece muy raro almacenar datos de caracteres como algo más que una secuencia de caracteres, pero parece que esto es lo que hace Pages.

Si tienes alguna idea de cómo averiguar la representación en memoria del texto dentro de Pages, podría ser muy útil para resolver este problema. ¿Tal vez pueda volcar y leer la memoria del proceso de alguna manera sencilla?

Otra posible solución es más simple - estoy asumiendo que es de alguna manera posible reiniciar el equipo de este sleepimage pero no encuentro ninguna documentación sobre cómo proceder con eso. Algunos otros usuarios ( macrumors ) parecen haber encontrado esto, pero por todas las preguntas del foro que he encontrado, ninguna tiene respuesta.

La versión de OS X es Snow Leopard, 10.6.8.

Las sugerencias complejas que impliquen programación son bienvenidas. Hago C y Python.

Gracias.

2voto

Fernando Puntos 114

Primer intento, SI la cadena conocida estuviera almacenada en texto plano (no es el caso)

Supongo que podrías intentar usar

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

A partir de ahí, el parámetro -U especifica la búsqueda en archivos binarios, -b especifica que se debe mostrar el desplazamiento en bytes de la parte coincidente y, por último, -o especifica que sólo se debe imprimir la parte coincidente.

Si eso funciona, usted sabrá el desplazamiento en bytes para llegar a esa región, pero no sabría exactamente cómo proceder allí. Dependiendo del tipo de archivo, probablemente se podría comprobar la firma del tipo de archivo cerca de ese desplazamiento informado y tratar de aislar sólo los bytes que forman parte de ese archivo. Para esto, supongo que podrías escribir un programa en C para hacerlo, o tal vez ejecutar hexdump -s known_offset sleepimage e intenta obtener sólo los bytes que se relacionan con el archivo que necesitas.

Por ejemplo, supongamos que quiero saber algo sobre Chrome:

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

Así que sé que tengo una ocurrencia de cromo en el desplazamiento de bytes 3775011731. Por lo tanto, podría:

$ 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

Lo difícil sería conseguir sólo los bytes que quieres. Si el tipo de archivo tiene una cabecera conocida, tal vez podrías restar el tamaño de la cabecera en bytes del offset del hexdump, para obtener el archivo "desde el principio". Si el tipo de archivo tiene una firma "EOF" conocida, podrías intentar buscarla también y así obtener sólo los bytes hasta ese punto.

¿Cuál es su tipo de archivo? ¿Cree usted que algún procedimiento como este podría ser utilizado en su caso? Ten en cuenta que nunca he hecho esto antes, y me estoy basando en un montón de "suposiciones", pero supongo que algo así tiene una pequeña posibilidad de funcionar..

Segundo intento, un método lento para analizar todos los bytes

El método anterior no funciona porque también busca sólo texto plano, mi apuesta. Para este segundo texto he creado un sencillo programa en C que contiene:

#include <stdio.h>

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

Así que podría buscar "assim", que sería su cadena_conocida, en ese texto. Para saber qué bytes buscar hice:

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

Por lo tanto, debo encontrar "61 73 73 69 6d". Después de compilar ese sencillo código fuente en C en el programa "tt", hice lo siguiente:

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

Que volvió a mí:

enter image description here

Si hicieras algo así, supongo que podrías obtener tus datos.. Aunque sería un poco lento analizar 2~8GBs de bytes...

Tenga en cuenta que en este enfoque debe encontrar los hexágonos en mayúsculas (escriba 6D en lugar de 6d en el último grep), no en minúsculas, y utilice \n en lugar de espacios en blanco (para poder utilizar -A y -B para el grep). Puede utilizar grep -i por lo que se convirtió en insensible a las mayúsculas y minúsculas, pero sería un poco más lento. Por lo tanto, solo hay que usar las mayúsculas si se usa esto.

O, si quieres un "script" automatizado:

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

1voto

penkoad Puntos 41

Actualización con fotos:

  • que loobsdpkdbik El identificador mencionado en primer lugar, no es uno - sólo pasó a ser antes de mi texto la primera vez que lo intenté.

  • parte del texto parece "perderse" (es decir, no se guarda en un tramo continuo de memoria) y esto puede empeorar con el uso de la RAM

  • es posible que no pueda recuperar un texto significativo de la imagen de sueño

Ahora mi texto original (con una errata en el primer párrafo, lo siento Sr. Matisse):

Joyas ocultas: El Jardín de Esculturas Abby Aldrich Rockefeller del MoMa, diseñado por Philip Johnson en 1953, es un espectacular oasis urbano con sus estanques reflectantes y su hermoso paisaje. Esta galería al aire libre está instalada con muestras cambiantes de escultura al aire libre, incluyendo obras de Aristide Maillol, Alexander Calder, Henri Maisse, Pablo Picasso y Richard Serra.

Cuando visite las nuevas galerías de pintura y escultura del MoMa, no deje de recorrer la escalera que une la cuarta y la quinta planta para ver la monumental imagen de la alegría y la energía de Henri Matisse, Danza (1909). El cuadro estaba destinado originalmente a ser colgado en el vestíbulo de la escalera de un palacio ruso en Moscú.

Y el texto recuperado:

Joyas ocultas: Ma s Abby Aldrich Rockeller Sculpre Gn, diseñada por Phip John 1953, es espectacular ursithtseflecting pools autifulandscapg. Esta galería al aire libre cuenta con exposiciones cambiantes de escultura exterior, que incluyen obras de Aristide Maillol, Alexander Calder, Henri Maisse, Pabloicasso y Anchard Sea.

Al visitar las nuevas galerías de pinturas y esculturas en Moscú, no olvide pasar por la escalera que salva el cuarto piso para ver el cuadro de Henri Matse sobre la alegría y el ojo, Dan (19). El cuadro se ha instalado en el vestíbulo de la escalera del palacio moscovita.

Y las capturas de pantalla:

Original text in Pages

Recovered text from sleepimage


Parece que para un documento (no guardado) de Pages (casi) todos los caracteres de su texto están separados por 0x00 en la memoria - así STRING se convierte en S.T.R.I.N.G con . ser 0x00 . Así que o bien tienes que buscar eso; puedo recomendar 0xED para un front-end gráfico... o busca loobsdpkdbik que parece ser (parte de) un identificador, que viene 5 bytes antes del texto (al menos sólo en un caso).

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X