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 sleepimage
dalam /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_substring
tetapi tidak mengembalikan apa pun. grep -a known_substring sleepimage
juga 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.
sumber
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.Jawaban:
Perbarui dengan gambar:
bahwa
loobsdpkdbik
identifier 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):
Dan teks yang dipulihkan:
Dan tangkapan layar:
Tampaknya untuk (belum disimpan) dokumen Pages (hampir) semua karakter dalam teks Anda dipisahkan oleh
0x00
dalam memori - sehinggaSTRING
menjadiS.T.R.I.N.G
dengan.
menjadi0x00
. Jadi Anda juga harus mencari itu; Saya dapat merekomendasikan 0xED untuk grafis front-end .....atau Anda mencarihanya dalam satu kasus).loobsdpkdbik
yang tampaknya (bagian dari) pengenal, yang datang 5 byte sebelum teks (setidaknyasumber
s\0u\0b\0s\0t\0r\0i\0n\0g
, tidak berfungsi, deskripsi lebih lanjut ada dalam pertanyaan asli saya. Oh - bagaimana Anda mengetahui ini?Coba pertama, JIKA Diketahui_STRUK disimpan dalam teks biasa (bukan case)
Saya kira Anda dapat mencoba menggunakan
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 sleepimage
dan mencoba hanya mendapatkan byte yang berhubungan dengan file yang Anda butuhkan.Misalnya, saya ingin tahu sesuatu tentang Chrome:
Jadi saya tahu saya mengalami chrome pada byte offset 3775011731. Karenanya saya bisa:
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:
Jadi saya bisa mencari "assim", yang akan Anda kenal, dalam teks itu. Untuk mengetahui byte apa yang harus dicari, saya lakukan:
Karena itu, saya harus menemukan "61 73 73 69 6d". Setelah mengkompilasi sumber C sederhana itu ke dalam program "tt", saya melakukan hal berikut:
Yang kembali kepada saya:
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 -i
sehingga menjadi case-sensitive, tetapi akan sedikit lebih lambat. Karenanya, gunakan saja huruf kapital jika ini digunakan.Atau, jika Anda menginginkan "skrip" otomatis semua-otomatis:
sumber
-U
kegrep
tampaknya tidak membuat banyak perbedaan (a
kependekan--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, tetapigrep
tidak akan menerima byte nol untuk karakter yang cocok.echo -n "assim" | hexdump
saya mendapatkan hexdump untuk pengkodean UTF-8, Anda bisa mencobaecho -n "assim" | iconv -t UTF-16 | hexdump
pengkodean lain, dalam kasus ini, UTF-16, saya tidak tahu bagaimana menyimpannya di memori .. Tetapi dalam kasus saya itu disimpan sebagai UTF-8 memang :)