Le Macbook de ma copine s'est écrasé lors d'une tentative de restauration à partir d'un fichier en veille prolongée. La barre de progression s'est arrêtée à ~ 10%, après quoi nous avons redémarré l'ordinateur pour un démarrage normal.
Cette image mémoire mise en veille prolongée avait un document non enregistré ouvert dans Pages, que nous aimerions récupérer. Il y a un sleepimage
in /private/var/vm
, qui je suppose est l'image d'hibernation qui n'a jamais été correctement restaurée. Nous avons sauvegardé cette chose pour la garder en vie.
Nous avons essayé strings sleepimage | grep known_substring
mais cela n'a rien donné. grep -a known_substring sleepimage
n'a également rien fait, donc je suppose que Pages n'a pas gardé les données de texte en mémoire sous forme de texte brut.
Edit: Après avoir lu cette réponse sur grep binaire, j'ai essayé perl -ln0777e 'print unpack("H*",$1), "\n", pos() while /(null_padded_substring)/g' sleepimage
, encore une fois sans résultat. Je l'ai rembourré avec des valeurs nulles afin d'essayer une correspondance pour le texte UTF-8. Ensuite, j'ai essayé avec des .*
globes entre chaque personnage - toujours pas de dés.
Donc, Pages ne stocke probablement pas de texte par un encodage commun en mémoire. Il faudrait que je trouve une règle de traduction entre la chaîne ASCII et la représentation des données Pages - je pense peut-être à une sorte de tampon de chaîne Objective C. Pour moi, il semble très étrange de stocker des données de caractères autrement que comme une séquence de caractères, mais cela semble être ce que Pages fait.
Si vous avez une idée sur la façon de comprendre la représentation en mémoire du texte dans Pages, cela peut être très utile pour résoudre ce problème. Peut-être que je peux vider et lire la mémoire de processus d'une manière simple?
Une autre solution possible est plus simple - je suppose qu'il est possible de redémarrer l'ordinateur à partir de cela sleepimage
, mais je ne trouve aucune documentation sur la façon dont vous procéderiez. Certains autres utilisateurs ( macrumors ) semblent avoir rencontré cela, mais pour toutes les questions du forum que j'ai trouvées, aucun d'entre eux n'a de réponse.
La version OS X est Snow Leopard, 10.6.8.
Les suggestions complexes concernant la programmation sont les bienvenues. Je fais du C et du Python.
Je vous remercie.
sleepimage
. Passer au crible une autre image à la recherche d'un texte unique serait tout aussi difficile, car l'image aurait toujours une taille de 4 Go et le bloc de mémoire Pages serait alloué quelque part au hasard dans ce fichier. Je suppose que je pourrais mettre à zéro la RAM, puis ouvrir des pages, puis rechercher des séquences non nulles dans l'image de sommeil, cependant. Mais Pages mange jusqu'à 200 Mo de mémoire malgré tout - toujours une petite aiguille dans la botte de foin.Réponses:
Mise à jour avec photos:
cet
loobsdpkdbik
identifiant mentionné en premier, n'en est pas un - il est juste arrivé d'être devant mon texte la première fois que je l'ai essayé.une partie du texte semble "perdue" (c'est-à-dire qu'elle n'est pas enregistrée dans un tronçon de mémoire continu) et cela peut empirer avec l'utilisation de la RAM
vous ne pourrez peut-être pas récupérer de texte significatif à partir de l'image de sommeil
Maintenant mon texte original (avec une faute de frappe au 1er paragraphe, monsieur M. Matisse):
Et le texte récupéré:
Et les captures d'écran:
Il semble que pour un document Pages (non enregistré) (presque) tous les caractères de votre texte soient séparés par
0x00
en mémoire -STRING
devient ainsiS.T.R.I.N.G
avec l'.
être0x00
. Vous devez donc soit rechercher cela; Je peux recommander 0xED pour une interface graphique ... ...ou vous recherchezseulement dans un cas).loobsdpkdbik
qui semble être (une partie de) un identifiant, qui vient 5 octets avant le texte (au moinsla source
s\0u\0b\0s\0t\0r\0i\0n\0g
-à- dire , n'a pas fonctionné, plus de description est dans ma question d'origine. Oh - comment avez-vous découvert cela?Essayez d'abord, SI chaîne_connue était stockée en texte brut (pas le cas)
Je suppose que vous pourriez essayer d'utiliser
A partir de cela, le paramètre -U spécifie la recherche sur les fichiers binaires, -b spécifie que le décalage en octets vers la partie correspondante doit être affiché et, enfin, -o spécifie que seule la partie correspondante doit être imprimée.
Si cela fonctionne, vous connaîtrez l'offset en octets pour accéder à cette région, mais je ne saurais pas exactement comment y procéder. Selon le type de fichier, vous pouvez probablement vérifier la signature de type de fichier près de l'offset informé et essayer d'isoler uniquement les octets qui font partie de ce fichier. Pour cela, je suppose que vous pouvez soit écrire un programme C pour cela, soit exécuter
hexdump -s known_offset sleepimage
et essayer d'obtenir uniquement les octets liés au fichier dont vous avez besoin.Par exemple, supposons que je veuille savoir quelque chose sur Chrome:
Je sais donc que j'ai eu une occurrence de chrome au décalage d'octet 3775011731. Par conséquent, je pouvais:
La partie délicate serait d'obtenir uniquement les octets souhaités. Si le type de fichier a un en-tête connu, vous pouvez peut-être soustraire la taille de l'en-tête en octets de l'offset hexdump, ainsi vous obtenez le fichier "depuis le début". Si le type de fichier a une signature "EOF" connue, vous pouvez également essayer de le rechercher et donc obtenir uniquement les octets jusqu'à ce point.
Quel est votre type de fichier? Pensez-vous qu'une telle procédure pourrait être utilisée dans votre cas? Notez que je n'ai jamais fait cela auparavant, et je me base sur beaucoup de "suppositions", mais je suppose que quelque chose comme ça a une petite chance de fonctionner ..
Deuxième essai, une méthode lente pour analyser tous les octets
La méthode précédente ne fonctionne pas car elle ne recherche également que du texte brut, mon pari. Pour ce deuxième texte, j'ai créé un simple programme C contenant:
Je pouvais donc rechercher "assim", qui serait votre chaîne connue, dans ce texte. Afin de savoir quels octets rechercher j'ai fait:
Par conséquent, je dois trouver "61 73 73 69 6d". Après avoir compilé cette simple source C dans le programme "tt", j'ai fait ce qui suit:
Qui me revient:
Si vous avez fait quelque chose comme ça, je suppose que vous pourriez obtenir vos données .. Il serait plutôt lent d'analyser 2 à 8 Go d'octets ...
Notez que dans cette approche, vous devez trouver les hexagones en majuscule (écrivez 6D au lieu de 6d sur le dernier grep), pas en lettres minuscules, et utilisez \ n au lieu des espaces blancs (vous pouvez donc utiliser -A et - B pour le grep). Vous pouvez l'utiliser
grep -i
pour qu'il devienne insensible à la casse, mais ce serait un peu plus lent. Par conséquent, utilisez simplement des majuscules si cela est utilisé.Ou, si vous voulez un "script" automatisé à tout faire:
la source
-U
àgrep
ne semble pas faire beaucoup de différence (a
c'est l'abréviation de--binary-files=text
). Si j'avais le décalage d'octet, je pourrais certainement continuer, mais soit le fichier est corrompu, soit Pages stocke les données d'une manière non ASCII. Peut-être UTF-8, maisgrep
n'acceptera pas d'octets nuls pour un caractère de correspondance.echo -n "assim" | hexdump
reçois le vidage hexadécimal pour l'encodage UTF-8, vous pouvez essayerecho -n "assim" | iconv -t UTF-16 | hexdump
d'autres encodages, UTF-16 dans ce cas, je n'ai aucune idée sur la façon dont il est stocké en mémoire .. Mais dans mon cas, il a été stocké comme UTF-8 en effet :)