O Macbook da minha namorada travou ao tentar restaurar a partir de um arquivo hibernado. A barra de progresso parou em ~ 10%, após o que reiniciamos o computador para uma inicialização normal.
Essa imagem de memória hibernada tinha um documento não salvo aberto no Pages, que gostaríamos de recuperar. Há um sleepimage
in /private/var/vm
, que eu assumo é a imagem de hibernação que nunca foi restaurada corretamente. Apoiámos essa coisa para mantê-la viva.
Tentamos, strings sleepimage | grep known_substring
mas não retornou nada. grep -a known_substring sleepimage
também não fez nada, portanto, estou assumindo que o Pages não manteve os dados de texto na memória como texto sem formatação.
Edit: Depois de ler esta resposta no grep binário eu tentei perl -ln0777e 'print unpack("H*",$1), "\n", pos() while /(null_padded_substring)/g' sleepimage
, novamente sendo infrutífero. Eu preenchi com nulos para tentar uma correspondência para o texto UTF-8. Então tentei com .*
globs entre cada personagem - ainda sem dados.
Portanto, o Pages provavelmente não armazena texto por nenhuma codificação comum na memória. Eu precisaria encontrar uma regra de tradução entre a string ASCII e a representação de dados do Pages - estou pensando em algum tipo de buffer de string do Objective C. Para mim, parece muito estranho armazenar dados de caracteres como qualquer outra coisa que não uma sequência de caracteres, mas isso parece ser o que o Pages está fazendo.
Se você tem alguma idéia de como descobrir a representação na memória do texto dentro do Pages, pode ser muito útil para resolver esse problema. Talvez eu possa despejar e ler a memória do processo de alguma maneira simples?
Outra solução possível é mais simples - presumo que seja possível reiniciar o computador a partir disso sleepimage
, mas não consigo encontrar nenhuma documentação sobre como você procederia com isso. Alguns outros usuários ( macrumores ) parecem ter encontrado isso, mas para todas as perguntas do fórum que encontrei, nenhum deles tem respostas.
A versão do OS X é o Snow Leopard, 10.6.8.
Sugestões complexas envolvendo programação são bem-vindas. Eu faço C e Python.
Obrigado.
fonte
sleepimage
. Peneirar outra imagem em busca de texto exclusivo seria igualmente difícil, pois a imagem ainda teria tamanho de 4 GB e o bloco de memória Pages seria alocado em algum lugar aleatório nesse arquivo. Suponho que eu poderia zerar a RAM, abrir páginas e procurar sequências diferentes de zero na imagem do sono. Mas o Pages consome 200 MB de memória, independentemente - ainda é uma pequena agulha no palheiro.Respostas:
Atualize com fotos:
esse
loobsdpkdbik
identificador mencionado primeiro, não é um - apenas aconteceu antes do meu texto a primeira vez que o experimentei.parte do texto parece ficar "perdida" (ou seja, não salva em uma extensão contínua de memória) e isso pode piorar com o uso da RAM
talvez você não consiga recuperar texto significativo da imagem do sono
Agora meu texto original (com erro de digitação no primeiro parágrafo, sry Mr. Matisse):
E o texto recuperado:
E as capturas de tela:
Parece que para um (unsaved) documento do Pages (quase) todos os caracteres do texto são separados por
0x00
na memória - assim,STRING
torna-seS.T.R.I.N.G
com.
estar0x00
. Então você precisa procurar por isso; Posso recomendar 0xED para um front-end gráfico .....ou procurarapenas em um caso).loobsdpkdbik
qual parece ser (parte de) um identificador, que vem 5 bytes antes do texto (pelo menosfonte
s\0u\0b\0s\0t\0r\0i\0n\0g
, não funcionou, mais descrições estão na minha pergunta original. Oh - como você descobriu isso?Primeira tentativa, se a string_conhecida foi armazenada em texto sem formatação (não é o caso)
Eu acho que você poderia tentar usar
A partir disso, o parâmetro -U especifica a pesquisa em arquivos binários, -b especifica que o deslocamento em bytes da parte correspondente deve ser exibido e, por último, -o especifica que apenas a parte correspondente deve ser impressa.
Se isso funcionar, você saberia o deslocamento em bytes para chegar a essa região, mas eu não saberia exatamente como proceder lá. Dependendo do tipo de arquivo, você provavelmente pode verificar a assinatura do tipo de arquivo próximo ao deslocamento informado e tentar isolar apenas os bytes que fazem parte desse arquivo. Para isso, acho que você pode escrever um programa em C para fazer isso ou talvez executar
hexdump -s known_offset sleepimage
e tentar obter apenas os bytes relacionados ao arquivo que você precisa.Por exemplo, suponha que eu queira saber algo sobre o Chrome:
Então, eu sei que tive uma ocorrência de cromo no deslocamento de bytes 3775011731. Portanto, pude:
A parte complicada seria obter apenas os bytes que você deseja. Se o tipo de arquivo tiver um cabeçalho conhecido, talvez você possa subtrair o tamanho do cabeçalho em bytes do deslocamento hexdump, para obter o arquivo "desde o início". Se o tipo de arquivo tiver uma assinatura "EOF" conhecida, você poderá tentar procurá-la também e, portanto, obter apenas os bytes até esse ponto.
Qual é o seu tipo de arquivo? Você acha que algum procedimento como esse poderia ser usado no seu caso? Note que eu nunca fiz isso antes e estou me baseando em muitas "suposições", mas suponho que algo assim tenha poucas chances de funcionar ..
Segunda tentativa, um método lento para analisar todos os bytes
O método anterior não funciona porque também procura apenas texto sem formatação, minha aposta. Para este segundo texto, criei um programa C simples, contendo:
Então, eu poderia procurar por "assim", que seria sua string conhecida, nesse texto. Para saber quais bytes procurar, fiz:
Portanto, devo encontrar "61 73 73 69 6d". Depois de compilar essa fonte C simples no programa "tt", fiz o seguinte:
O que voltou para mim:
Se você fez algo assim, acho que você poderia obter seus dados ... Seria muito lento analisar 2 a 8 GB de bytes ...
Observe que nesta abordagem você deve encontrar os hexágonos em letras maiúsculas (escreva 6D em vez de 6d no último grep), não em letras minúsculas e use \ n em vez de espaços em branco (para que você possa usar -A e - B para o grep). Você poderia usar
grep -i
para não diferenciar maiúsculas de minúsculas, mas seria um pouco mais lento. Portanto, basta usar maiúsculas se isso for usado.Ou, se você quiser um "script" automatizado de tudo:
fonte
-U
paragrep
não parece fazer muita diferença (a
é a abreviação de--binary-files=text
). Se eu tivesse o desvio de bytes, eu poderia continuar, mas o arquivo está corrompido ou o Pages está armazenando os dados de alguma maneira não ASCII. Talvez UTF-8, masgrep
não aceitará bytes nulos para um caractere de correspondência.echo -n "assim" | hexdump
recebo o hexdump para a codificação UTF-8, você pode tentarecho -n "assim" | iconv -t UTF-16 | hexdump
outras codificações, UTF-16, neste caso, não tenho idéia de como ele é armazenado na memória. Mas, no meu caso, ele foi armazenado como UTF-8 na verdade :)