Memulihkan data Halaman dalam memori dari wakeup hibernation yang gagal

9

Macbook pacar saya macet saat mencoba memulihkan dari file yang terhibernasi. Bilah progres berhenti pada ~ 10%, setelah itu kami me-restart komputer untuk startup normal.

Gambar memori yang di-hibernasi ini memiliki dokumen yang belum disimpan terbuka di Halaman, yang ingin kami pulihkan. Ada sleepimagedalam /private/var/vm, yang saya asumsikan adalah gambar hibernate yang tidak pernah dikembalikan dengan benar. Kami mendukung hal ini agar tetap hidup.

Kami mencoba strings sleepimage | grep known_substringtetapi tidak mengembalikan apa pun. grep -a known_substring sleepimagejuga tidak melakukan apa pun, jadi saya berasumsi bahwa Pages tidak menyimpan data teks dalam memori sebagai teks biasa.

Sunting: Setelah membaca jawaban ini pada Biner grep saya mencoba perl -ln0777e 'print unpack("H*",$1), "\n", pos() while /(null_padded_substring)/g' sleepimage, lagi-lagi menjadi sia-sia. Saya menambahkannya dengan null untuk mencoba kecocokan untuk teks UTF-8. Lalu saya mencoba dengan .*gumpalan antara masing-masing karakter - masih tidak ada dadu.

Jadi Halaman mungkin tidak menyimpan teks dengan penyandian umum apa pun dalam memori. Saya perlu menemukan aturan terjemahan antara string ASCII dan representasi data Halaman - Saya pikir mungkin semacam buffer string C Objective. Bagi saya tampaknya sangat aneh untuk menyimpan data karakter sebagai apa pun selain urutan karakter, tetapi tampaknya inilah yang dilakukan Pages.

Jika Anda memiliki ide tentang cara mengetahui representasi teks di dalam memori di dalam Halaman, mungkin akan sangat membantu dalam menyelesaikan masalah ini. Mungkin saya bisa membuang dan membaca memori proses dengan cara sederhana?

Solusi lain yang mungkin lebih sederhana - saya berasumsi mungkin untuk me-reboot komputer dari ini sleepimage, tapi saya tidak dapat menemukan dokumentasi tentang bagaimana Anda akan melanjutkannya. Beberapa pengguna lain ( macrumors ) tampaknya telah menemukan ini, tetapi untuk semua pertanyaan forum yang saya temukan, tidak ada dari mereka yang memiliki respons.

Versi OS X adalah Snow Leopard, 10.6.8.

Saran kompleks yang melibatkan pemrograman dipersilakan. Saya melakukan C dan Python.

Terima kasih.

sapht
sumber
1
Mudah-mudahan Anda membuat salinan file itu sehingga Anda tidak memeriksa sleepimage baru yang ditulis setelah reboot. Maka Anda mungkin ingin menciptakan kembali situasi (tanpa crash) dengan RAM gratis maksimum - yaitu Halaman yang terbuka hanya menulis teks yang unik dan biarkan OS menulis sleepimage baru; dan kemudian mulai memeriksanya untuk teks unik Anda.
iolsmit
@ iolmit Ya, semua tes dilakukan pada salinan sleepimage. Memilah-milah gambar lain untuk mencari teks unik akan sama sulitnya, karena gambar tersebut masih berukuran 4GB, dan blok memori Pages akan dialokasikan di suatu tempat secara acak dalam file itu. Saya kira saya bisa nol keluar RAM, lalu buka halaman, dan kemudian mencari urutan non-nol di sleepimage, meskipun. Namun Pages memakan memori hingga 200MB - masih ada jarum kecil di tumpukan jerami.
sapht
Teks Anda disimpan dengan 0x00 di antara setiap karakter, jadi Anda harus mencari itu atau untuk string ini: loobsdpkdbik; lihat juga jawaban saya di bawah ini
iolsmit
Apakah halaman tidak memiliki versi yang dihidupkan secara default bahkan jika Anda tidak memiliki cadangan mesin waktu (cari cadangan seluler di mana sistem membuat cadangan semuanya bahkan tanpa drive cadangan terhubung)? Sudahkah Anda mengesampingkan cara yang lebih mudah untuk mendapatkan file kembali tanpa heroik melakukan analisis forensik pada format file gambar tidur? (Tidak peduli seberapa hebatnya itu jika Anda melakukannya;)
bmike
@bmike Versi hanya datang dengan Lion tetapi mesin itu ada di Snow Leopard (10.6.8) dan saya ingat kehilangan cukup banyak pekerjaan karena iWork menabrak SL dan tidak memiliki save otomatis ...
iolsmit

Jawaban:

1

Perbarui dengan gambar:

  • bahwa loobsdpkdbikidentifier disebutkan pertama, tidak satu - hanya happend menjadi sebelum teks saya waktu tinju saya mencobanya.

  • bagian dari teks tampaknya "hilang" (yaitu tidak disimpan dalam satu rentangan memori berkelanjutan) dan ini dapat memburuk dengan penggunaan RAM

  • Anda mungkin tidak dapat memulihkan teks yang bermakna dari sleepimage

Sekarang teks asli saya (dengan kesalahan ketik pada paragraf 1, sry Mr. Matisse):

Permata Tersembunyi: Abby Aldrich Rockefeller Sculpture Garden dari MoMa, dirancang oleh Philip Johnson pada tahun 1953, adalah oasis perkotaan yang spektakuler dengan kolam pantulan dan lansekap yang indah. Galeri luar ruang ini dipasang dengan pajangan luar ruang yang berubah, termasuk karya-karya Aristide Maillol, Alexander Calder, Henri Maisse, Pablo Picasso, dan Richard Serra.

Saat mengunjungi lukisan baru dan galeri patung di MoMa, pastikan untuk melintasi tangga yang menjembatani lantai empat dan lima untuk melihat citra monumental kegembiraan dan energi Henri Matisse, Dance (1909). Lukisan itu awalnya dimaksudkan untuk digantung di aula tangga sebuah istana Rusia di Moskow.

Dan teks yang dipulihkan:

Permata Tersembunyi: Abby Aldrich Rockeller Sculpre Gn, dirancang oleh Phip John 1953, adalah kolam ursithtseflecting spektakuler autifulandscapg. Galeri luar ini penuh dengan perubahan tampilan outor sculpre, termasuk karya Aristide Maillol, Alexander Calder, Henri Maisse, Pabloicasso, anchard Sea.

Sementara Anda menemukan galeri cat baru di Ma, pastikan untuk melewati menjembatani keempat untuk melihat gambar dan kegembiraan Henri Matse, Dan (19). Lukisan itu secara intrinsik dimasukkan ke ruang tangga istana Rsian, Moskow.

Dan tangkapan layar:

Teks asli dalam Halaman

Teks yang dipulihkan dari sleepimage


Tampaknya untuk (belum disimpan) dokumen Pages (hampir) semua karakter dalam teks Anda dipisahkan oleh 0x00dalam memori - sehingga STRINGmenjadi S.T.R.I.N.Gdengan .menjadi 0x00. Jadi Anda juga harus mencari itu; Saya dapat merekomendasikan 0xED untuk grafis front-end ... ..atau Anda mencari loobsdpkdbikyang tampaknya (bagian dari) pengenal, yang datang 5 byte sebelum teks (setidaknya hanya dalam satu kasus).

iolsmit
sumber
Hmm, saya melakukan pencarian untuk "loobsdpkdbik", tetapi masih kosong. Apakah pengenal ini muncul sebelum setiap varian dokumen yang belum disimpan? Mungkin itu menandakan sesuatu tentang dokumen - seperti pewarisan jendela, font default, dll ... Saya mencari string nol-empuk menggunakan perl sebelumnya, yaitu s\0u\0b\0s\0t\0r\0i\0n\0g, tidak berfungsi, deskripsi lebih lanjut ada dalam pertanyaan asli saya. Oh - bagaimana Anda mengetahui ini?
sapht
@ sapht Saya memperbarui jawaban saya; tampaknya teks tidak disimpan dalam memori terus menerus, yang dapat membuatnya mustahil untuk pulih dari sleepimage. Dan "loobsdpkdbik" itu tidak terkait dengan dokumen Pages, hanya senang berada di depan teks saya.
iolsmit
Mungkin substring itu di antara kata-kata bergumam dari memori terputus itu. Saya masih belum menemukan data di sleepimage, tetapi kami mungkin harus mencari substring yang tepat. Atau blok memori tidak pernah ditulis. Kerja bagus menyelidiki sleepimage, terima kasih.
sapht
@sapht Jika sleepimage Anda tidak rusak, ia harus berisi teks lengkap dari dokumen Pages - karena mengembalikan RAM akan meletakkannya di tempat sistem berada saat hibernasi. Saya akan merekomendasikan untuk mencoba sleepimage di mesin virtual: Instal OS X yang didukung di mesin virtual (atau gunakan VMware fusion 4.1 ;) - kemudian kloning mesin Anda ke HDD virtual dan coba booting dari sleepimage.
iolsmit
2

Coba pertama, JIKA Diketahui_STRUK disimpan dalam teks biasa (bukan case)

Saya kira Anda dapat mencoba menggunakan

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

Dari itu, -U parameter menentukan pencarian pada file biner, -b menentukan bahwa offset dalam byte ke bagian yang cocok harus ditampilkan dan, terakhir, -o menentukan bahwa hanya bagian yang cocok harus dicetak.

Jika itu berhasil, Anda akan tahu offset dalam byte untuk sampai ke wilayah itu, tapi saya tidak tahu persis bagaimana melanjutkan di sana. Bergantung pada filetype, Anda mungkin bisa memeriksa tanda tangan filetype di dekat offset yang diinformasikan itu dan mencoba untuk mengisolasi hanya byte yang membuat bagian dari file itu. Untuk ini, saya kira Anda bisa menulis program C untuk melakukan itu, atau mungkin menjalankan hexdump -s known_offset sleepimagedan mencoba hanya mendapatkan byte yang berhubungan dengan file yang Anda butuhkan.

Misalnya, saya ingin tahu sesuatu tentang Chrome:

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

Jadi saya tahu saya mengalami chrome pada byte offset 3775011731. Karenanya saya bisa:

$ 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

Bagian yang sulit adalah untuk mendapatkan hanya byte yang Anda inginkan. Jika filetype memiliki header yang dikenal, Anda mungkin bisa mengurangi ukuran header dalam byte dari hexdump offset, sehingga Anda mendapatkan file "sejak awal". Jika tipe file memiliki tanda tangan "EOF" yang dikenal, Anda dapat mencoba mencarinya juga dan karenanya hanya mendapatkan byte hingga saat itu.

Apa tipe file Anda? Apakah Anda berpikir bahwa beberapa prosedur seperti ini dapat digunakan dalam kasus Anda? Perhatikan bahwa saya belum pernah melakukan ini sebelumnya, dan saya mendasarkan diri pada banyak "tebakan", tapi saya kira sesuatu seperti ini memiliki sedikit peluang untuk bekerja ..

Percobaan kedua, metode lambat untuk mem-parsing semua byte

Metode sebelumnya tidak berfungsi karena hanya mencari teks biasa, taruhan saya. Untuk teks kedua ini saya membuat program C sederhana yang berisi:

#include <stdio.h>

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

Jadi saya bisa mencari "assim", yang akan Anda kenal, dalam teks itu. Untuk mengetahui byte apa yang harus dicari, saya lakukan:

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

Karena itu, saya harus menemukan "61 73 73 69 6d". Setelah mengkompilasi sumber C sederhana itu ke dalam program "tt", saya melakukan hal berikut:

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

Yang kembali kepada saya:

masukkan deskripsi gambar di sini

Jika Anda melakukan sesuatu seperti itu, saya kira Anda bisa mendapatkan data Anda .. Akan agak lambat untuk mengurai 2 ~ 8GB byte meskipun ...

Perhatikan bahwa dalam pendekatan ini Anda harus menemukan heks dalam huruf kapital (tulis 6D bukan 6d pada grep terakhir), bukan dalam huruf kecil, dan gunakan \ n sebagai ganti spasi putih (sehingga Anda dapat menggunakan -A dan - B untuk grep). Anda dapat menggunakannya grep -isehingga menjadi case-sensitive, tetapi akan sedikit lebih lambat. Karenanya, gunakan saja huruf kapital jika ini digunakan.

Atau, jika Anda menginginkan "skrip" otomatis semua-otomatis:

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
FernandoH
sumber
Teks hanya disimpan dalam memori, karena file tidak pernah disimpan. Jadi tidak ada tipe file nyata, hanya jenis representasi yang disimpan secara internal untuk data. Melewati -Uke greptampaknya tidak membuat banyak perbedaan ( akependekan --binary-files=text). Jika saya memiliki byte offset, saya pasti dapat melanjutkan, tetapi file tersebut rusak, atau Halaman menyimpan data dalam beberapa cara non-ASCII. Mungkin UTF-8, tetapi greptidak akan menerima byte nol untuk karakter yang cocok.
sapht
Saya mengedit posting dengan percobaan lain .. sepertinya berfungsi .. tetapi sangat lambat dan Anda harus "menebak" berapa banyak byte yang Anda inginkan sebelum dan sesudah kemunculan known_string. Catatan: ketika saya melakukannya, echo -n "assim" | hexdumpsaya mendapatkan hexdump untuk pengkodean UTF-8, Anda bisa mencoba echo -n "assim" | iconv -t UTF-16 | hexdumppengkodean lain, dalam kasus ini, UTF-16, saya tidak tahu bagaimana menyimpannya di memori .. Tetapi dalam kasus saya itu disimpan sebagai UTF-8 memang :)
FernandoH
Hmm, well, hex dump untuk program C Anda mencetak teks karena sebenarnya tertanam dalam binary - gcc mengkompilasi seperti itu sehingga semua buffer karakter statis disimpan dalam program itu sendiri untuk referensi dalam memori. Tetapi untuk Halaman, data dibuat pada saat runti e. Saya memperbarui jawaban saya dengan pertandingan baru yang saya coba melalui perl, yang tidak membuahkan hasil, jadi saya cukup yakin teks tersebut disimpan dengan cara aneh dan tidak standar, karena byte ASCII bahkan tidak sama. Mungkin beberapa buffer string C objektif ...
sapht
Hummm .. Bagaimana jika Anda mencoba mencari string "Pages.app"? Saya tidak akan tahu bagaimana melanjutkan dari sana jika ada yang ditemukan (seperti, apa yang menjadi bagian dari Aplikasi dan apa dokumen Anda?), Tetapi jika kami ingin terus melatih pemikiran ini, itu bisa menjadi awal dari percobaan. Meskipun saya harus mengakui bahwa harus ada alternatif yang lebih mudah, ini akan menjadi alternatif yang cukup melelahkan
FernandoH
Sebenarnya, apakah Anda ingat potongan dari file Papers itu? Meskipun disimpan di memori, jika Anda tahu beberapa kalimat yang ditulis di sana (jika Anda ingat atau memiliki versi file sebelumnya), Anda dapat mencoba mencari langsung kalimat-kalimat ini! Ini akan jauh lebih mudah, saya kira :) Dan karena Pages adalah program pengeditan kata, saya kira Anda ingin memulihkan apa yang ditulis, kan? Jika itu masalahnya, cari konten daripada informasi meta, mungkin lebih mudah .. Saya harap, setidaknya ..
FernandoH