실패한 최대 절전 모드 깨우기에서 인 메모리 페이지 데이터 복구


9

최대 절전 모드 파일에서 복원을 시도하는 동안 내 여자 친구의 Macbook이 충돌했습니다. 진행률 표시 줄이 ~ 10 %에서 멈춘 후 정상적인 시작을 위해 컴퓨터를 다시 시작했습니다.

이 최대 절전 모드 이미지에는 저장되지 않은 문서가 Pages에 열려 복구되어 있습니다. sleepimagein 이 있는데 /private/var/vm, 올바르게 복원되지 않은 최대 절전 모드 이미지라고 가정합니다. 우리는 이것을 살리기 위해 백업했습니다.

우리는 시도 strings sleepimage | grep known_substring했지만 아무것도 반환하지 않았습니다. grep -a known_substring sleepimage또한 아무것도하지 않았으므로 Pages가 텍스트 데이터를 메모리에 일반 텍스트로 유지하지 않았다고 가정합니다.

편집 : 이진 grep에 대한이 답변을 읽은 후에 perl -ln0777e 'print unpack("H*",$1), "\n", pos() while /(null_padded_substring)/g' sleepimage다시 시도하지 않고 시도했습니다 . UTF-8 텍스트와 일치시키기 위해 null로 채워 넣었습니다. 그런 다음 나는 .*각 캐릭터 사이의 글롭으로 시도했습니다 – 여전히 주사위는 없습니다.

따라서 Pages는 메모리에 일반적인 인코딩으로 텍스트를 저장하지 않을 것입니다. ASCII 문자열과 Pages 데이터 표현 사이의 변환 규칙을 찾아야합니다. 어쩌면 일종의 Objective C 문자열 버퍼라고 생각합니다. 나에게 문자 데이터를 일련의 문자 이외의 것으로 저장하는 것이 매우 이상해 보이지만 Pages 가하는 일 인 것 같습니다.

Pages 내부의 텍스트 내 메모리 표현을 이해하는 방법에 대한 아이디어가 있으면이 문제를 해결하는 데 매우 도움이 될 수 있습니다. 어쩌면 간단한 방법으로 프로세스 메모리를 덤프하고 읽을 수 있습니까?

또 다른 가능한 해결책은 더 간단합니다. 어떻게 든 컴퓨터를 재부팅 할 수 있다고 가정하고 sleepimage있지만 어떻게 진행하는지에 대한 문서를 찾을 수 없습니다. 일부 다른 사용자 ( macrumors ) 가이 문제를 겪은 것으로 보이지만 내가 찾은 모든 포럼 질문에 대해서는 응답이 없습니다.

OS X 버전은 Snow Leopard, 10.6.8입니다.

프로그래밍과 관련된 복잡한 제안을 환영합니다. 나는 C와 Python을한다.

감사합니다.


1
바라건대 당신은 그 파일의 사본을 만들었으므로 재부팅 후에 작성된 새로운 수면 이미지를 검사하지 않아도됩니다. 그런 다음 최대 여유 RAM을 사용하여 상황 (충돌없이)을 다시 만들고 싶을 수 있습니다. 즉, 페이지 만 열면 고유 한 텍스트를 작성하고 OS에서 새로운 잠자기 이미지를 작성할 수 있습니다. 그런 다음 고유 한 텍스트를 검사하십시오.
iolsmit

@iolsmit 예, 모든 테스트는의 사본에서 수행됩니다 sleepimage. 이미지의 크기가 여전히 4GB이고 페이지 메모리 블록이 해당 파일에서 임의의 위치에 할당되므로 고유 한 텍스트를 찾는 다른 이미지를 살펴 보는 것도 어렵습니다. 그래도 RAM을 제로로 만든 다음 페이지를 연 다음 수면 이미지에서 0이 아닌 시퀀스를 찾을 수 있다고 가정합니다. 그러나 Pages는 건초 더미의 작은 바늘에 관계없이 200MB의 메모리를 소비합니다.
sapht

텍스트는 각 문자 사이에 0x00으로 저장되므로 해당 문자열 또는이 문자열을 검색해야합니다. loobsdpkdbik; 아래의 답변도 참조하십시오
iolsmit

타임 머신 백업이없는 경우에도 페이지에 기본적으로 버전이 설정되어 있지 않습니다 (백업 드라이브를 연결하지 않아도 시스템이 백업하는 모바일 백업을 찾으십니까)? 수면 이미지 파일 형식에 대해 법 의학적 분석을 수행하지 않고 파일을 다시 가져 오는 쉬운 방법을 배제 했습니까? (만약 당신이 그것을
빼면

@bmike 버전은 Lion에만 제공되었지만 해당 시스템은 Snow Leopard (10.6.8)에 있으며 SL에서 iWork 충돌로 인해 자동 저장 기능이 없기 때문에 상당한 작업 손실이 발생합니다.
iolsmit

답변:


1

사진으로 업데이트 :

  • loobsdpkdbik식별자가 먼저 언급 된 것은 하나가 아닙니다. 필자가 텍스트를 시도하기 전에 내 텍스트 앞에 있었기 때문입니다.

  • 텍스트의 일부가 "잃어버린"것으로 보입니다 (즉, 하나의 연속 메모리 확장으로 저장되지 않음). 이는 RAM 사용으로 인해 악화 될 수 있습니다

  • 수면 이미지에서 의미있는 텍스트를 복구하지 못할 수 있습니다

이제 내 원본 텍스트 (첫 번째 단락의 오타가있는 sry Mr. Matisse) :

숨겨진 보석 : 1953 년 필립 존슨이 디자인 한 MoMa의 Abby Aldrich Rockefeller Sculpture Garden은 수영장과 아름다운 조경을 갖춘 멋진 도시 오아시스입니다. 이 야외 갤러리에는 Aristide Maillol, Alexander Calder, Henri Maisse, Pablo Picasso 및 Richard Serra의 작품을 포함하여 변화하는 야외 조각품이 전시되어 있습니다.

MoMa의 새로운 그림과 조각 갤러리를 방문하는 동안 Henri Matisse의 기념비적 인 기쁨과 에너지의 이미지 인 Dance (1909)를 보려면 4 층과 5 층을 연결하는 계단을 통과해야합니다. 이 그림은 원래 모스크바에있는 러시아 궁전의 계단 복도에 매달려 있습니다.

그리고 회복 된 텍스트 :

숨겨진 보석 : Phip John 1953이 디자인 한 Mas Abby Aldrich Rockeller Sculpre Gn은 멋진 어수선한 수영장 autifulandscapg입니다. 이 야외 갤러리에는 Aristide Maillol, Alexander Calder, Henri Maisse, Pabloicasso, anchard Sea의 작업을 포함한 외부 조각가의 전시가 바뀌 었습니다.

Ma에서 새로운 paintg 조각품 gallies를 여행하는 동안, 4 번째 flrsn ordeto s Henri Matse의 중대한 imagof 기쁨과 ey를 연결하는 stase를 통과해야한다, Dan (19). 그림은 Rsian 궁전 모스크바의 hg t 계단 홀에 waorinally intded했다.

그리고 스크린 샷 :

페이지의 원본 텍스트

수면 이미지에서 텍스트를 복구


(저장되지 않은) 페이지 문서 (거의) 텍스트의 모든 문자에 의해 분리 된 것으로 보인다 0x00메모리 - 따라서 STRING됩니다 S.T.R.I.N.G.있는 0x00. 그래서 당신은 그것을 검색해야합니다; 그래픽 프론트 엔드에는 0xED 를 추천 할 수 있습니다 ..... 또는 텍스트 앞에 5 바이트 (적어도 한 경우에만 )가있는 식별자 (일부) 인 것으로 검색 loobsdpkdbik하십시오 .


흠, "loobsdpkdbik"을 검색했지만 여전히 비어 있습니다. 저장되지 않은 문서의 모든 변형 앞에이 식별자가 나타 났습니까? 어쩌면 그것은 창 상속, 기본 글꼴 등과 같은 문서에 대해 뭔가를 의미합니다. perl을 사용하여 null로 채워진 문자열을 검색했습니다. 즉 s\0u\0b\0s\0t\0r\0i\0n\0g, 작동하지 않습니다. 자세한 설명은 내 원래 질문에 있습니다. 오, 어떻게 알았어?
sapht

@sapht 나는 대답을 업데이트했다. 텍스트가 메모리에 연속적으로 저장되지 않아 수면 이미지를 복구하지 못할 수 있습니다. 그리고 "loobsdpkdbik"은 Pages 문서와 관련이 없으며, 제 텍스트 이전입니다.
iolsmit

아마도 부분 문자열은 불연속 기억의 혼란스러운 단어 중 하나였습니다. 여전히 sleepimage에서 데이터를 찾지 못했지만 올바른 하위 문자열을 검색해야 할 수도 있습니다. 또는 메모리 블록이 쓰여지지 않았습니다. 수면 이미지를 조사하는 좋은 일, 감사합니다.
sapht

@sapht 수면 이미지가 손상되지 않은 경우 RAM을 복원하면 시스템이 최대 절전 모드 일 때 RAM 위치에 배치되므로 Pages 문서의 전체 텍스트가 포함되어야합니다. 가상 머신에서 sleepimage를 시도하는 것이 좋습니다. 지원되는 OS X를 가상 머신에 설치하거나 VMware fusion 4.1 ;을 사용 하여 머신을 가상 HDD에 복제 한 다음 sleepimage에서 부팅 해보십시오.
iolsmit

2

첫 번째 시도, IF known_string WAS는 일반 텍스트로 저장됩니다 (사례는 아님)

나는 당신이 사용해 볼 수 있다고 생각합니다

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

이로부터 -U 매개 변수는 2 진 파일에 대한 검색을 지정하고 -b는 일치하는 부분에 대한 바이트 단위 오프셋을 표시하도록 지정하고 마지막으로 -o는 일치하는 부분 만 인쇄하도록 지정합니다.

그것이 효과가 있다면, 그 지역에 도달하기 위해 바이트 단위의 오프셋을 알 수 있지만, 어떻게 진행하는지 정확히 알 수는 없습니다. 파일 유형에 따라 해당 오프셋 근처의 파일 유형 서명을 확인하고 해당 파일의 일부를 구성하는 바이트 만 분리하려고 시도 할 수 있습니다. 이를 위해 C 프로그램을 작성하거나 hexdump -s known_offset sleepimage필요한 파일과 관련된 바이트 만 가져 와서 시도 할 수 있습니다.

예를 들어 Chrome에 대해 알고 싶은 경우가 있습니다.

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

바이트 오프셋 3775011731에서 크롬이 발생했다는 것을 알고 있습니다.

$ 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

까다로운 부분은 원하는 바이트 만 얻는 것입니다. 파일 유형에 알려진 헤더가있는 경우 16 진 덤프 오프셋에서 헤더 크기를 바이트 단위로 뺄 수 있으므로 "처음부터"파일을 얻을 수 있습니다. 파일 유형에 알려진 "EOF"서명이있는 경우 해당 파일 유형도 검색하여 해당 지점까지의 바이트 만 가져올 수 있습니다.

파일 형식이 무엇입니까? 이와 같은 절차가 귀하의 경우에 사용될 수 있다고 생각하십니까? 나는 이것을 전에 한 번도 해 본 적이 없으며, 많은 "추측"에 기초하고 있지만, 이와 같은 것이 효과가 약간 있다고 생각합니다 ..

두 번째 시도, 모든 바이트를 구문 분석하는 느린 방법

이전의 방법은 평범한 텍스트 만 검색하기 때문에 작동하지 않습니다. 내기. 이 두 번째 텍스트를 위해 다음을 포함하는 간단한 C 프로그램을 만들었습니다.

#include <stdio.h>

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

그래서 나는 당신의 known_string 인 "assim"을 그 텍스트에서 검색 할 수 있습니다. 검색 할 바이트를 알기 위해 다음을 수행했습니다.

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

따라서 "61 73 73 69 6d"를 찾아야합니다. 그 간단한 C 소스를 프로그램 "tt"로 컴파일 한 후 다음을 수행했습니다.

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

어느 것이 나에게 돌아 왔는지 :

여기에 이미지 설명을 입력하십시오

그런 식으로하면 데이터를 얻을 수 있다고 생각합니다. 2 ~ 8GB 바이트를 구문 분석하는 것이 느릴 것입니다 ...

이 방법에서는 소문자가 아닌 대문자 (마지막 grep에 6d 대신 6D 쓰기)로 16 진수를 찾고 공백 대신 \ n을 사용해야합니다. 따라서 -A와-를 사용할 수 있습니다. grep의 경우 B)). grep -i대소 문자를 구분하지 않도록 사용할 수 있지만 조금 느려집니다. 따라서 이것이 사용되는 경우 자본을 사용하십시오.

또는 전체 자동화 된 "스크립트"를 원하는 경우 :

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

파일은 저장되지 않았기 때문에 텍스트는 메모리에만 저장됩니다. 따라서 실제 파일 형식은 없으며 Pages가 데이터에 대해 내부적으로 유지하는 표현 형식 만 있습니다. 전달 -U하기 grep(큰 차이가없는 것 같았다 a에 대한 짧은 --binary-files=text). 바이트 오프셋이 있으면 계속 진행할 수 있지만 파일이 손상되었거나 Pages가 ASCII가 아닌 방식으로 데이터를 저장하고 있습니다. 아마도 UTF-8이지만 grep일치하는 문자에는 null 바이트를 허용하지 않습니다.
sapht

다른 시도로 게시물을 편집했습니다. 작동하는 것 같습니다. 그러나 실제로 속도가 느리고 known_string이 발생하기 전후에 원하는 바이트 수를 "추측"해야합니다. 참고 : echo -n "assim" | hexdumpUTF-8 인코딩의 echo -n "assim" | iconv -t UTF-16 | hexdump16 진수 덤프를 얻으면이 인코딩에서는 UTF-16 인 다른 인코딩을 시도 할 수 있습니다. 메모리에 저장되는 방법에 대해서는 전혀 알지 못했습니다. 그러나 내 경우에는 저장되었습니다. UTF-8로 :)
FernandoH

음, C 프로그램의 16 진수 덤프는 실제로 바이너리에 포함되어 있기 때문에 텍스트를 인쇄합니다 .gcc는 모든 정적 문자 버퍼가 메모리 자체 참조를 위해 프로그램 자체에 저장되도록 그렇게 컴파일합니다. 그러나 Pages의 경우 데이터가 런타임에 작성되었습니다. 나는 perl을 통해 시도한 새로운 일치로 내 대답을 업데이트했는데 결과는 과일이 없었습니다 .ASCII 바이트가 같지 않기 때문에 텍스트가 이상한 비표준 방식으로 저장되어 있다고 확신합니다. 아마도 객관적인 C 스트링 버퍼 ...
sapht

Hummm .. 대신 "Pages.app"문자열을 검색하려고하면 어떻게됩니까? 무언가가 발견되면 (예 : 앱에 속한 것과 문서가 무엇입니까) 어떻게 진행되는지 알지 못하지만, 우리 가이 생각의 기차를 유지하려면 시도의 시작이 될 수 있습니다. 더 쉬운 대안이 있어야한다는 점을 인정해야하지만, 이는 상당히 힘든 일이 될 것입니다
FernandoH

실제로, 당신은 그 논문 파일에서 조각을 기억하십니까? 메모리에 저장되어 있지만 거기에 쓰여진 정확한 문장을 알고 있다면 (기억하거나 이전 버전의 파일이있는 경우) 직접 검색해 볼 수 있습니다! 이것은 훨씬 쉬울 것입니다.) Pages는 단어 편집 프로그램이므로 작성된 것을 복구하고 싶습니까? 이 경우 메타 정보가 아닌 콘텐츠를 검색하면 더 쉬울 수 있습니다. 적어도 희망이 있습니다.
FernandoH
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.