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 sleepimage
en la /private/var/vm
que supongo que es la imagen de hibernación, que nunca nos correctamente restaurado. Respaldamos esto para mantenerlo vivo.
Lo intentamos strings sleepimage | grep known_substring
pero no devolvió nada. grep -a known_substring sleepimage
tampoco 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.
fuente
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.Respuestas:
Actualización con fotos:
ese
loobsdpkdbik
identificador 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):
Y el texto recuperado:
Y las capturas de pantalla:
Parece que para un documento de Pages (no guardado) (casi) todos los caracteres de su texto están separados por
0x00
en la memoria, por lo que seSTRING
convierteS.T.R.I.N.G
en.
ser0x00
. Entonces tienes que buscar eso; Puedo recomendar 0xED para un front-endgráfico... ...loobsdpkdbik
o busca loque parece ser (parte de) un identificador, que viene 5 bytes antes del texto (al menossolo en un caso).fuente
s\0u\0b\0s\0t\0r\0i\0n\0g
, no funcionó, hay más descripciones en mi pregunta original. Oh, ¿cómo descubriste esto?Primero intente, SI la cadena conocida FUE almacenada en texto sin formato (no es el caso)
Supongo que podrías intentar usar
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 sleepimage
e intentar obtener solo los bytes relacionados con el archivo que necesita.Por ejemplo, supongamos que quisiera saber algo sobre Chrome:
Entonces sé que tuve una aparición de cromo en el byte offset 3775011731. Por lo tanto, podría:
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:
Entonces podría buscar "assim", que sería su cadena conocida, en ese texto. Para saber qué bytes buscar hice:
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:
Lo que volvió a mí:
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 -i
para 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:
fuente
-U
agrep
no parecía hacer mucha diferencia (a
es 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, perogrep
no aceptará bytes nulos para un carácter coincidente.echo -n "assim" | hexdump
, obtengo el hexdump para la codificación UTF-8, podría intentarecho -n "assim" | iconv -t UTF-16 | hexdump
otras 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 :)