실패한 최대 절전 모드 깨우기에서 인 메모리 페이지 데이터 복구 동안 내 여자 친구의 Macbook이 충돌했습니다.

최대 절전 모드 파일에서 복원을 시도하는 동안 내 여자 친구의 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을한다.

감사합니다.



답변

사진으로 업데이트 :

  • 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하십시오
.


답변

첫 번째 시도, 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


답변