Recupere los datos de las páginas en memoria de la activación de hibernación fallida

9

El Macbook de mi novia se bloqueó 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 inicio normal.

Esta imagen de memoria hibernada tenía un documento sin guardar abierto en Pages, que nos gustaría recuperar. Hay una sleepimageen la /private/var/vmque supongo que es la imagen de hibernación, que nunca nos correctamente restaurado. Respaldamos esto para mantenerlo vivo.

Lo intentamos strings sleepimage | grep known_substringpero no devolvió nada. grep -a known_substring sleepimagetampoco hizo nada, así que supongo que Pages no mantuvo los datos de texto en la memoria como texto sin formato.

Editar: después de leer esta respuesta en Binary grep , intenté hacerlo perl -ln0777e 'print unpack("H*",$1), "\n", pos() while /(null_padded_substring)/g' sleepimage, una vez más fue infructuoso. Lo rellené con nulos para intentar una coincidencia para el texto UTF-8. Luego lo intenté con .*globos entre cada personaje, aún sin dados.

Por lo tanto, Pages probablemente no almacena texto mediante 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 que tal vez sea algún tipo de búfer de cadena Objective C. Para mí, parece muy extraño almacenar datos de caracteres como algo más que una secuencia de caracteres, pero esto parece ser lo que está haciendo Pages.

Si tiene alguna idea sobre cómo resolver la representación en memoria del texto dentro de Pages, puede ser muy útil para resolver este problema. ¿Tal vez puedo volcar y leer la memoria del proceso de alguna manera simple?

Otra solución posible es más simple: supongo que de alguna manera es posible reiniciar la computadora desde esto sleepimage, pero no puedo encontrar ninguna documentación sobre cómo proceder con eso. Algunos otros usuarios ( macrumores ) parecen haber encontrado esto, pero para todas las preguntas del foro que he encontrado, ninguno de ellos tiene respuestas.

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

Sugerencias complejas que involucran programación son bienvenidas. Hago C y Python.

Gracias.

sapht
fuente
1
Esperemos que haya hecho una copia de ese archivo para no terminar examinando una imagen de sueño más nueva que se escribió después del reinicio. Entonces es posible que desee recrear la situación (sin bloqueo) con una RAM máxima libre, es decir, abrir solo las páginas que escriben un texto único y dejar que el sistema operativo escriba una nueva imagen dormida; y luego comienza a examinar eso para tu texto único.
iolsmit
@iolsmit Sí, todas las pruebas se realizan en una copia de sleepimage. Examinar otra imagen en busca de texto único sería igual de difícil, ya que la imagen aún tendría un tamaño de 4 GB, y el bloque de memoria de Páginas se asignaría en algún lugar al azar en ese archivo. Sin embargo, supongo que podría poner a cero la RAM, luego abrir páginas y luego buscar secuencias distintas de cero en la imagen del sueño. Sin embargo, Pages consume 200 MB de memoria de todos modos, sigue siendo una pequeña aguja en el pajar.
sapht
Su texto se almacena con 0x00 entre cada carácter, por lo que debe buscar eso o esta cadena: loobsdpkdbik; vea también mi respuesta a continuación
iolsmit
¿Las páginas no tienen versiones activadas de forma predeterminada, incluso si no tiene una copia de seguridad de la máquina del tiempo (busque copias de seguridad móviles donde el sistema respalde las cosas incluso sin la unidad de copia de seguridad conectada)? ¿Ha descartado formas más fáciles de recuperar el archivo sin realizar heroicamente un análisis forense sobre el formato del archivo de imagen de suspensión? (no importa lo maravilloso que sea si lo
logras
@bmike Versions solo vino con Lion, pero esa máquina está en Snow Leopard (10.6.8) y recuerdo haber perdido bastante trabajo debido a que iWork se bloqueó en SL y no tenía un guardado automático ...
iolsmit

Respuestas:

1

Actualización con fotos:

  • ese loobsdpkdbikidentificador mencionado primero, no es uno, solo sucedió antes de mi texto la primera vez que lo probé.

  • parte del texto parece "perderse" (es decir, no guardarse en una memoria continua) y esto puede empeorar con el uso de RAM

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

Ahora mi texto original (con error tipográfico en el primer párrafo, sry Mr. Matisse):

Gemas Ocultas: El Jardín de Esculturas Abby Aldrich Rockefeller de MoMa, diseñado por Philip Johnson en 1953, es un espectacular oasis urbano con sus piscinas reflectantes y hermosos paisajes. Esta galería al aire libre se instala con exhibiciones cambiantes de esculturas al aire libre, que incluyen obras de Aristide Maillol, Alexander Calder, Henri Maisse, Pablo Picasso y Richard Serra.

Mientras visita las nuevas galerías de pintura y escultura en MoMa, asegúrese de atravesar la escalera que une los pisos cuarto y quinto para ver la monumental imagen de alegría y energía de Henri Matisse, Dance (1909). Originalmente, la pintura estaba destinada a colgar en el pasillo de la escalera de un palacio ruso en Moscú.

Y el texto recuperado:

Gemas ocultas: Ma s Abby Aldrich Rockeller Sculpre Gn, diseñada por Phip John 1953, es espectacular con ursithtseflecting pools autifulandscapg. Esta galería al aire libre está repleta de exhibiciones cambiantes de esculturas externas, incluyendo trabajos de Aristide Maillol, Alexander Calder, Henri Maisse, Pabloicasso y Anchard Sea.

Mientras vives la nueva escultura de pintura galia en Ma, asegúrate de atravesar el puente de la cuarta orden de Henri Matse con la imaginación y la alegría de Dan (19). La pintura estaba destinada a la sala de escaleras del palacio Rsian de Moscú.

Y las capturas de pantalla:

Texto original en páginas

Texto recuperado de sleepimage


Parece que para un documento de Pages (no guardado) (casi) todos los caracteres de su texto están separados por 0x00en la memoria, por lo que se STRINGconvierte S.T.R.I.N.Gen .ser 0x00. Entonces tienes que buscar eso; Puedo recomendar 0xED para un front-end gráficoloobsdpkdbik ... ... o busca lo que parece ser (parte de) un identificador, que viene 5 bytes antes del texto (al menos solo en un caso).

Iolsmit
fuente
Hmm, hice una búsqueda de "loobsdpkdbik", pero aún vacío. ¿Aparece este identificador antes de cada variante del documento no guardado? Tal vez significa algo sobre el documento, como la herencia de ventanas, la fuente predeterminada, etc. Busqué una cadena con relleno nulo usando perl anteriormente, es decir s\0u\0b\0s\0t\0r\0i\0n\0g, no funcionó, hay más descripciones en mi pregunta original. Oh, ¿cómo descubriste esto?
sapht
@sapht Actualicé mi respuesta; parece que el texto no se almacena en un tramo continuo en la memoria, lo que podría hacer que sea imposible recuperarse de la imagen del sueño. Y ese "loobsdpkdbik" no está relacionado con el documento de Pages, solo sucedió antes de mi texto.
iolsmit
Tal vez la subcadena estaba entre las palabras murmuradas de memoria discontinua entonces. Todavía no he encontrado ningún dato en la imagen del sueño, pero podríamos tener que buscar la subcadena correcta. O el bloque de memoria nunca fue escrito. Buen trabajo investigando la imagen del sueño, gracias.
Sapht
@sapht Si su imagen de sueño no está dañada, debe contener el texto completo del documento de Pages, ya que la restauración de la RAM lo colocaría donde estaba el sistema cuando hibernaba. Recomendaría probar la imagen dormida en una máquina virtual: instale cualquier OS X compatible en una máquina virtual (o use VMware fusion 4.1 ;), luego clone su máquina en el HDD virtual e intente arrancar desde la imagen dormida.
iolsmit
2

Primero intente, SI la cadena conocida FUE almacenada en texto sin formato (no es el caso)

Supongo que podrías intentar usar

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

A partir de eso, 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 solo se debe imprimir la parte coincidente.

Si eso funciona, sabría 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 podría verificar la firma del tipo de archivo cerca de ese desplazamiento informado e intentar aislar solo los bytes que forman parte de ese archivo. Para esto, supongo que podría escribir un programa en C para hacer eso, o tal vez ejecutar hexdump -s known_offset sleepimagee intentar obtener solo los bytes relacionados con el archivo que necesita.

Por ejemplo, supongamos que quisiera saber algo sobre Chrome:

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

Entonces sé que tuve una aparición de cromo en el byte offset 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

La parte difícil sería obtener solo los bytes que desea. Si el tipo de archivo tiene un encabezado conocido, podría restar el tamaño del encabezado en bytes del desplazamiento hexdump, para obtener el archivo "desde el principio". Si el tipo de archivo tiene una firma conocida "EOF", puede intentar buscarla también y, por lo tanto, obtener solo los bytes hasta ese punto.

¿Cuál es tu tipo de archivo? ¿Crees que algún procedimiento como este podría usarse en tu caso? Tenga en cuenta que nunca he hecho esto antes, y me estoy basando en muchas "conjeturas", pero supongo que algo como esto tiene pocas posibilidades de funcionar ...

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

El método anterior no funciona porque también busca solo texto sin formato, mi apuesta. Para este segundo texto, creé un programa simple en C que contiene:

#include <stdio.h>

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

Entonces 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 esa fuente simple de 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

Lo que volvió a mí:

ingrese la descripción de la imagen aquí

Si hicieras algo así, supongo que podrías obtener tus datos ... Sin embargo, sería un poco lento analizar de 2 a 8 GB de bytes ...

Tenga en cuenta que en este enfoque debe encontrar los hexágonos en mayúscula (escriba 6D en lugar de 6d en el último grep), no en letras minúsculas, y use \ n en lugar de espacios en blanco (para que pueda usar -A y - B para el grep). Podrías usarlo grep -ipara que no distinga entre mayúsculas y minúsculas, pero sería un poco más lento. Por lo tanto, solo use mayúsculas si se usa.

O, si desea un "script" automatizado para todo:

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
fuente
El texto solo se almacena en la memoria, ya que el archivo nunca se guardó. Por lo tanto, no existe un tipo de archivo real, solo el tipo de representación que Pages mantiene internamente para los datos. Pasar -Ua grepno parecía hacer mucha diferencia ( aes la abreviatura de --binary-files=text). Si tuviera el desplazamiento de bytes, definitivamente podría continuar, pero el archivo está dañado o Pages está almacenando los datos de alguna manera no ASCII. Quizás UTF-8, pero grepno aceptará bytes nulos para un carácter coincidente.
sapht
Edité la publicación con otro intento ... parece funcionar ... pero es realmente lento y tendrá que "adivinar" cuántos bytes desea antes y después de la aparición de la cadena conocida. Nota: cuando lo hago echo -n "assim" | hexdump, obtengo el hexdump para la codificación UTF-8, podría intentar echo -n "assim" | iconv -t UTF-16 | hexdumpotras codificaciones, UTF-16 en este caso, no tengo idea de cómo se almacena en la memoria ... Pero en mi caso, se almacenó como UTF-8 en efecto :)
FernandoH
Hmm, bueno, el volcado hexadecimal para su programa C imprime el texto, ya que en realidad está incrustado en el binario: gcc se compila de esa manera para que todos los búferes de caracteres estáticos se almacenen en el propio programa para referencia en memoria. Pero para las páginas, esos datos se crearon en runti e. Actualicé mi respuesta con una nueva coincidencia que probé a través de perl, que fue infructuosa, así que estoy bastante seguro de que el texto se almacena de una manera extraña no estándar, ya que los bytes ASCII ni siquiera son iguales. Quizás algún búfer de cadena C objetivo ...
sapht
Hummm .. ¿Qué pasa si intentaste buscar la cadena "Pages.app" en su lugar? No sabría cómo proceder desde allí si se encuentra algo (como, ¿qué pertenece a la aplicación y cuál es su documento?), Pero si tuviéramos que mantener este tren de pensamiento, podría ser el comienzo de un intento. Aunque debo admitir que debe haber alternativas más fáciles, esta sería bastante laboriosa
FernandoH
En realidad, ¿recuerdas piezas de ese archivo de documentos? Aunque se almacenó en la memoria, si conoce algunas oraciones exactas que se escribieron allí (si recuerda o si tiene una versión anterior del archivo), ¡puede intentar buscarlas directamente! Esto sería mucho más fácil, supongo :) Y como Pages es un programa de edición de palabras, supongo que quieres recuperar lo que estaba escrito, ¿verdad? Si ese es el caso, busque el contenido en lugar de la metainformación, puede ser más fácil ... Espero, al menos ...
FernandoH