Macbook mojej dziewczyny zawiesił się podczas próby przywrócenia ze hibernowanego pliku. Pasek postępu zatrzymał się na poziomie ~ 10%, po czym ponownie uruchomiliśmy komputer w celu normalnego uruchomienia.
Ten hibernowany obraz pamięci miał niezapisany dokument otwarty w Pages, który chcielibyśmy odzyskać. Jest taki, sleepimage
w /private/var/vm
którym, jak zakładam, jest obraz hibernacji, który nigdy nie został poprawnie przywrócony. Stworzyliśmy kopię zapasową tego elementu, aby utrzymać go przy życiu.
Próbowaliśmy, strings sleepimage | grep known_substring
ale nic nie zwróciło. grep -a known_substring sleepimage
też nic nie zrobił, więc zakładam, że Pages nie zachował danych tekstowych w pamięci jako zwykłego tekstu.
Edycja: Po przeczytaniu tej odpowiedzi na temat binarnego grepa spróbowałem perl -ln0777e 'print unpack("H*",$1), "\n", pos() while /(null_padded_substring)/g' sleepimage
, znów będąc bezowocnym. Wypełniłem go zerami, aby spróbować dopasować tekst UTF-8. Potem spróbowałem z .*
kulami między każdą postacią - wciąż nie ma kości.
Tak więc Pages prawdopodobnie nie przechowują tekstu w zwykłym kodowaniu w pamięci. Musiałbym znaleźć regułę tłumaczenia między ciągiem ASCII a reprezentacją danych Pages - myślę, że może jakiś bufor ciągu Objective C. Wydaje mi się, że przechowywanie danych o postaciach jako sekwencji innych niż sekwencja znaków wydaje się dziwne, ale wydaje się, że to właśnie robi Pages.
Jeśli masz jakiś pomysł, jak znaleźć reprezentację tekstu w pamięci Pages, może być bardzo pomocny w rozwiązaniu tego problemu. Może mogę zrzucić i odczytać pamięć procesu w prosty sposób?
Inne możliwe rozwiązanie jest prostsze - zakładam, że w jakiś sposób można zrestartować komputer sleepimage
, ale nie mogę znaleźć żadnej dokumentacji dotyczącej tego, jak byś to zrobił. Wygląda na to, że niektórzy użytkownicy ( makrumory ) zetknęli się z tym problemem , ale na wszystkie pytania z forum, które znalazłem, żaden z nich nie odpowiedział.
Wersja OS X to Snow Leopard, 10.6.8.
Mile widziane są złożone sugestie dotyczące programowania. Robię C i Python.
Dziękuję Ci.
źródło
sleepimage
. Przeszukanie innego obrazu w poszukiwaniu unikalnego tekstu byłoby równie trudne, ponieważ obraz miałby nadal rozmiar 4 GB, a blok pamięci Strony zostałby przydzielony gdzieś losowo w tym pliku. Przypuszczam, że mógłbym wyzerować pamięć RAM, potem otworzyć strony, a potem poszukać sekwencji niezerowych na obrazie uśpienia. Ale Pages zużywa 200 MB pamięci niezależnie - wciąż mała igła w stogu siana.Odpowiedzi:
Zaktualizuj ze zdjęciami:
ten
loobsdpkdbik
identyfikator wymieniony jako pierwszy nie jest jeden - po prostu zdarzyło mi się być przed moim tekstem przy pierwszej próbie.część tekstu wydaje się „zagubiona” (tzn. nie zapisana w jednym ciągłym odcinku pamięci), co może się pogorszyć przy użyciu pamięci RAM
możesz nie być w stanie odzyskać znaczącego tekstu ze snu
Teraz mój oryginalny tekst (z literówką w pierwszym akapicie, proszę pana Matisse):
I odzyskany tekst:
I zrzuty ekranu:
Wydaje się, że w (niezapisanym) dokumencie Pages (prawie) wszystkie znaki w tekście są oddzielone
0x00
w pamięci - w ten sposóbSTRING
stajeS.T.R.I.N.G
się.
istnieniem0x00
. Więc albo musicie tego poszukać; Mogę polecić 0xED dla graficznego interfejsu ...lub szukania,w jednym przypadku).loobsdpkdbik
który wydaje się (częścią) identyfikatora, który pojawia się 5 bajtów przed tekstem (przynajmniejźródło
s\0u\0b\0s\0t\0r\0i\0n\0g
Nie działał, więcej opisu znajduje się w moim pierwotnym pytaniu. Och - jak to odkryłeś?Pierwsza próba, JEŚLI znany ciąg znaków był przechowywany jako zwykły tekst (nie w tym przypadku)
Myślę, że możesz spróbować użyć
Z tego parametru -U określa wyszukiwanie plików binarnych, -b określa, że należy wyświetlić przesunięcie w bajtach do pasującej części, a na koniec -o określa, że należy wydrukować tylko pasującą część.
Jeśli to zadziała, poznasz przesunięcie w bajtach, aby dostać się do tego regionu, ale nie wiedziałbym dokładnie, jak tam postępować. W zależności od rodzaju pliku można prawdopodobnie sprawdzić podpis typu pliku w pobliżu tego świadomego przesunięcia i spróbować izolować tylko bajty, które stanowią część tego pliku. Wydaje mi się, że w tym celu można napisać program w języku C lub wykonać
hexdump -s known_offset sleepimage
i spróbować pobrać tylko bajty związane z plikiem, którego potrzebujesz.Załóżmy na przykład, że chcę wiedzieć coś o Chrome:
Wiem, że wystąpił błąd chromu przy przesunięciu bajtu 3775011731. W związku z tym mogłem:
Trudną częścią byłoby uzyskanie tylko bajtów, które chcesz. Jeśli typ pliku ma znany nagłówek, możesz odjąć rozmiar nagłówka w bajtach od przesunięcia zrzutu heksadecymalnego, aby otrzymać plik „od początku”. Jeśli typ pliku ma znany podpis „EOF”, możesz spróbować go wyszukać, a tym samym pobrać tylko bajty do tego momentu.
Jaki jest twój typ pliku? Czy uważasz, że w twoim przypadku można zastosować taką procedurę? Zauważ, że nigdy wcześniej tego nie robiłem i opieram się na wielu „domysłach”, ale przypuszczam, że coś takiego ma małe szanse na działanie…
Druga próba, powolna metoda analizowania wszystkich bajtów
Ta metoda wcześniej nie działa, ponieważ wyszukuje również tylko zwykły tekst, mój zakład. Dla tego drugiego tekstu stworzyłem prosty program C zawierający:
Chciałbym więc wyszukać w tym tekście wyrażenie „assim”, które byłoby twoim znanym ciągiem znaków. Aby wiedzieć, jakie bajty wyszukać, zrobiłem:
Dlatego muszę znaleźć „61 73 73 69 6d”. Po skompilowaniu tego prostego źródła C w programie „tt” zrobiłem następujące:
Który wrócił do mnie:
Gdybyś zrobił coś takiego, myślę, że mógłbyś zdobyć swoje dane. Parsowanie 2 ~ 8 GB bajtów byłoby jednak trochę powolne ...
Zauważ, że w tym podejściu musisz znaleźć heksy dużymi literami (na ostatnim grepie wpisz 6D zamiast 6d), a nie małymi literami i użyj \ n zamiast białych spacji (abyś mógł użyć -A i - B jak grep). Możesz użyć,
grep -i
aby stała się niewrażliwa na wielkość liter, ale byłoby to trochę wolniejsze. Dlatego używaj po prostu wielkich liter, jeśli są one używane.Lub, jeśli chcesz zrobić automatyczny „skrypt”:
źródło
-U
dogrep
nie wydawało się mieć większego znaczenia (a
jest skrótem--binary-files=text
). Gdybym miał przesunięcie bajtu, zdecydowanie mógłbym kontynuować, ale albo plik jest uszkodzony, albo Pages przechowuje dane w sposób inny niż ASCII. Być może UTF-8, alegrep
nie akceptuje pustych bajtów dla dopasowanego znaku.echo -n "assim" | hexdump
, otrzymam zrzut heksadecymalny dla kodowania UTF-8, możesz spróbowaćecho -n "assim" | iconv -t UTF-16 | hexdump
innych kodowań, w tym przypadku UTF-16, nie mam Idead, w jaki sposób jest przechowywany w pamięci. Ale w moim przypadku był przechowywany jak w rzeczywistości UTF-8 :)