Hatalı hazırda bekletme modundan çıkma sırasında bellek içi Sayfalar verilerini kurtarma


9

Hazırda bekletilen bir dosyadan geri yüklemeye çalışırken kız arkadaşımın Macbook'u çöktü. İlerleme çubuğu ~% 10'da durdu, ardından bilgisayarı normal bir başlangıç ​​için yeniden başlattık.

Bu hazırda bekletilen bellek görüntüsünde, kurtarmak istediğimiz Sayfalar'da kaydedilmemiş bir belge vardı. Asla doğru şekilde geri yüklenmemiş hazırda bekletme görüntüsü olduğunu bir sleepimagein /private/var/vmvar. Hayatta kalabilmek için bu şeyi yedekledik.

Biz denedik strings sleepimage | grep known_substringama hiçbir şey döndü. grep -a known_substring sleepimageAyrıca hiçbir şey yapmadı, bu yüzden Sayfalar metin verilerini düz metin olarak bellekte tutmak değil varsayalım.

Düzenleme: İkili grep bu cevabı okuduktan sonra perl -ln0777e 'print unpack("H*",$1), "\n", pos() while /(null_padded_substring)/g' sleepimagetekrar meyvesiz olmak için çalıştı . UTF-8 metniyle eşleşme girişiminde bulunmak için boş değerlerle doldurdum. Sonra .*her karakter arasında glob ile denedim - hala zar yok.

Bu yüzden Pages, muhtemelen bellekte herhangi bir yaygın kodlama ile metin saklamaz. ASCII dize ve Sayfalar veri gösterimi arasında bir çeviri kuralı bulmak gerekir - Belki Objective C string buffer bir tür düşünüyorum. Bana göre, karakter verilerini bir karakter dizisinden başka bir şey olarak saklamak çok garip görünüyor, ancak Pages'ın yaptığı şey bu gibi görünüyor.

Sayfalar içindeki metnin bellek içi sunumunu nasıl bulacağınız hakkında herhangi bir fikriniz varsa, bu sorunun çözümünde çok yardımcı olabilir. Belki de işlem belleğini basit bir şekilde döküp okuyabilirim?

Başka bir olası çözüm daha basit - bir şekilde bilgisayarı yeniden başlatmanın mümkün olduğunu varsayıyorum sleepimage, ancak bununla nasıl devam edeceğinize dair herhangi bir belge bulamıyorum. Bazı diğer kullanıcılar ( macrumors ) bu sorunla karşılaştı, ancak bu sorunların tadını çıkarıyor .

OS X sürümü Snow Leopard, 10.6.8'dir.

Programlamayı içeren karmaşık öneriler kabul edilir. C ve Python yapıyorum.

Teşekkür ederim.


1
Umarım bu dosyanın bir kopyasını oluşturmuş olursunuz, böylece yeniden başlatmanın ardından yazılan daha yeni bir uyku görüntüsünü incelemezsiniz. Daha sonra durumu (boşta kalmadan) maksimum boş RAM ile yeniden oluşturmak isteyebilirsiniz - yani sadece açık Sayfalar benzersiz bir metin yazar ve işletim sisteminin yeni bir uyku resmini yazmasına izin verir; ve sonra bunu benzersiz metniniz için incelemeye başlayın.
iolsmit

@iolsmit Evet, tüm testler bir kopyası üzerinde yapılır sleepimage. Benzersiz metin arayan başka bir görüntüyü elemek de o kadar zor olurdu, çünkü görüntü hala 4GB boyutunda olacak ve Pages bellek bloğu bu dosyada rastgele bir yere tahsis edilecekti. RAM'i sıfırlayabiliyorum, sonra sayfaları açabiliyorum ve daha sonra da sleepimage'de sıfır olmayan diziler arayabiliyorum. Ancak Pages, ne olursa olsun 200MB bellek tüketir - hala samanlıkta küçük bir iğne.
sapht

Metniniz her karakter arasında 0x00 ile saklanır, bu nedenle bunu veya bu dizeyi aramanız gerekir: loobsdpkdbik; ayrıca aşağıdaki
yanıtıma

Zaman makinesi yedeklemeniz olmasa bile sayfaların sürümleri varsayılan olarak açık değil mi (yedekleme sürücüsü bağlı olmadan bile sistemin işleri yedeklediği mobil yedeklemeleri arayın)? Uyku görüntü dosyası biçiminde adli bir analiz yapmadan dosyayı geri almanın daha kolay yollarını dışladınız mı? (eğer çekerseniz ne kadar harika olursa olsun;)
bmike

@bmike Sürümler yalnızca Lion ile geldi, ancak bu makine Snow Leopard'da (10.6.8) ve iWork
SL'de çökmesi

Yanıtlar:


1

Resimlerle güncelleme:

  • loobsdpkdbikilk önce bu tanımlayıcı bir değil, metnimden önce denedim.

  • metnin bir kısmı "kayboluyor" gibi görünüyor (yani bir sürekli bellek uzamasında kaydedilmemiş) ve bu RAM kullanımı ile daha da kötüleşebilir

  • uyku resminden anlamlı metinleri kurtaramayabilirsiniz

Şimdi orijinal metnim (1. paragrafta yazım hatasıyla sry Bay Matisse):

Gizli Taşlar: 1953 yılında Philip Johnson tarafından tasarlanan MoMa'nın Abby Aldrich Rockefeller Heykel Bahçesi, yansıtıcı havuzları ve güzel peyzajı ile muhteşem bir kentsel vahadır. Bu açık hava galerisi, Aristide Maillol, Alexander Calder, Henri Maisse, Pablo Picasso ve Richard Serra'nın çalışmaları da dahil olmak üzere açık hava heykelinin değişen ekranlarıyla kuruluyor.

MoMa'daki yeni resim ve heykel galerilerini ziyaret ederken, Henri Matisse'in anıtsal sevinç ve enerji imajını (1909) görmek için dördüncü ve beşinci katları köprüleyen merdiveni geçtiğinizden emin olun. Resim aslında Moskova'daki bir Rus sarayının merdiven salonunda asılmak için tasarlandı.

Ve kurtarılan metin:

Gizli Taşlar: Phip John 1953 tarafından tasarlanan Ma Abby Abby Aldrich Rockeller Sculpre Gn, muhteşem ursithtseflecting havuzları autifulandscapg. Bu açık galeri, Aristide Maillol, Alexander Calder, Henri Maisse, Pabloicasso, anchard Sea'nin çalışması dahil olmak üzere, outor sculpre'ın değişen ekranlarıyla italledir.

Ma'da yeni paintg heykel galleri ving ederken, ileri flrsn ordeto'nun Henri Matse'nin sevinç ve göz, neşe ve gözü, Dan (19) arasında köprü kurmaya devam ettiğinizden emin olun. Resim, rsian saray Moskova'nın hg t merdiven salonuna haince davrandı.

Ve ekran görüntüleri:

Sayfalardaki orijinal metin

Uyku resminden kurtarılan metin


Bir (kaydedilmemiş) Sayfalar belge için (neredeyse) sizin metinde tüm karakterler ile ayrılır gibi görünüyor 0x00bellekte - böylece STRINGolur S.T.R.I.N.Gile .varlık 0x00. Yani ya bunu aramalısınız; Ben grafiksel bir ön uç için 0xED tavsiye edebilirim .. ..veya aradığınız loobsdpkdbikmetnin 5 bayt önce gelen (en azından sadece bir durumda) bir tanımlayıcı (parçası) gibi görünüyor .


Hmm, "loobsdpkdbik" araması yaptım, ama yine de boş. Bu tanımlayıcı kaydedilmemiş belgenin her varyantından önce mi görüntülendi? Belki de belge hakkında bir şey ifade ediyor - pencere mirası, varsayılan yazı tipi, vb ... Daha önce perl kullanarak null-dolgulu bir dize aradım, yani s\0u\0b\0s\0t\0r\0i\0n\0gişe yaramadı, daha fazla açıklama orijinal sorum. Oh - bunu nasıl buldun?
sapht

@sapht Cevabımı güncelledim; metnin sürekli bir bellekte saklanmadığı anlaşılıyor, bu da uyku resminden kurtarmayı imkansız kılabilir. Ve bu "loobsdpkdbik" Sayfalar belgesi ile ilgili değil, sadece metnimden önce oldu.
iolsmit

Belki de alt dize o zamanlar süreksiz belleğin mırıldanmış sözleri arasındaydı. Hala uyku görüntüsünde herhangi bir veri bulamadım, ancak doğru alt dizeyi aramak zorunda kalabiliriz. Veya hafıza bloğu hiç yazılmadı. Uykuyu inceleyen iyi çalışmalar, teşekkürler.
sapht

@sapht Uyku resminiz bozuk değilse, sayfalar belgesinin tam metnini içermelidir - RAM'in geri yüklenmesi sistemin hazırda bekletme modunda olduğu yere koyacağından. Uyku resmini sanal bir makinede denemenizi tavsiye ederim: Desteklenen herhangi bir OS X'i sanal bir makineye kurun (veya VMware fusion 4.1 ;) kullanın - sonra makinenizi sanal HDD'ye kopyalayın ve uyku resminden önyüklemeyi deneyin.
iolsmit

2

İlk olarak, bilinen_string WAS düz metin olarak depolanmışsa (durum değil)

Sanırım kullanmayı deneyebilirsin

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

Bundan sonra, -U parametresi ikili dosyalarda aramayı belirtir, -b eşleşen parçaya bayt cinsinden uzaklığın görüntülenmesini belirtir ve son olarak -o sadece eşleşen parçanın yazdırılmasını belirtir.

Bu işe yararsa, o bölgeye ulaşmak için bayt cinsinden ofseti bilirsiniz, ancak tam olarak nasıl ilerleyeceğimi bilemezdim. Dosya türüne bağlı olarak, muhtemelen bu ofsetin yakınındaki dosya türü imzasını kontrol edebilir ve yalnızca o dosyanın bir parçasını oluşturan baytları izole etmeye çalışabilirsiniz. Bunun için, bunu yapmak için bir C programı yazabilirsiniz veya belki de hexdump -s known_offset sleepimagesadece ihtiyacınız olan dosya ile ilgili baytları çalıştırıp çalıştırabilirsiniz .

Örneğin, Chrome hakkında bir şeyler bilmek istediğimi varsayalım:

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

Bu yüzden 3775011731 bayt uzaklığında krom oluşumuna sahip olduğumu biliyorum.

$ 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

Zor kısmı sadece istediğiniz bayt almak olacaktır. Dosya türünün bilinen bir üstbilgisi varsa, üstbilgi boyutunu onaltılık bayt uzaklıktan bayt cinsinden çıkarabilirsiniz, böylece dosyayı "başlangıçtan beri" alırsınız. Dosya türünün bilinen bir "EOF" imzası varsa, onu da aramayı deneyebilir ve bu nedenle o noktaya kadar yalnızca baytları alabilirsiniz.

Dosya türünüz nedir? Durumunuzda böyle bir prosedürün kullanılabileceğini düşünüyor musunuz? Bunu daha önce hiç yapmadığımı ve kendimi birçok "tahmin" e dayandığımı unutmayın, ancak bunun gibi bir şeyin çalışma şansı azdır.

İkinci deneme, tüm baytları ayrıştırmak için yavaş bir yöntem

Önceki yöntem işe yaramıyor çünkü aynı zamanda sadece düz metin, bahse girer. Bu ikinci metin için aşağıdakileri içeren basit bir C programı oluşturdum:

#include <stdio.h>

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

Bu metinde bilinen_dizeniz olan "assim" i arayabilirim. Hangi baytları arayacağımı bilmek için yaptım:

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

Bu nedenle, "61 73 73 69 6d" yi bulmalıyım. Bu basit C kaynağını "tt" programına derledikten sonra aşağıdakileri yaptım:

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

Bana geri döndü:

resim açıklamasını buraya girin

Böyle bir şey yaptıysanız, verilerinizi alabilirsiniz sanırım .. 2 ~ 8GB bayt ayrıştırmak için biraz yavaş olurdu ...

Bu yaklaşımda altıgenleri büyük harfle (son grep'e 6d yerine 6D yazın), küçük harflerle değil, boşluklar yerine \ n kullanmanız gerektiğini unutmayın (böylece -A ve - Grep için B). grep -iBöylece büyük / küçük harfe duyarsız olursunuz , ancak biraz daha yavaş olur. Bu nedenle, sadece bu kullanılırsa büyük harf kullanın.

Veya, tümüyle otomatikleştirilmiş bir "komut dosyası" istiyorsanız:

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

Dosya asla kaydedilmediğinden metin yalnızca bellekte saklanır. Dolayısıyla, gerçek bir dosya türü yoktur, yalnızca Pages'ın veriler için dahili olarak tuttuğu türden bir gösterimdir. Geçme -Uiçin grep(pek fark görünmüyordu akısaltmasıdır --binary-files=text). Bayt uzaklığına sahip olsaydım, kesinlikle devam edebilirdim, ancak dosya bozuk veya Sayfalar verileri ASCII olmayan bir şekilde saklıyor. Belki UTF-8, ancak grepbir maç karakteri için boş bayt kabul etmez.
sapht

Gönderiyi başka bir deneme ile düzenledim ... işe yarıyor gibi görünüyor ama gerçekten yavaş ve bilinen_dizesi oluşmadan önce ve sonra kaç bayt istediğinizi "tahmin etmek" zorunda kalacaksınız. Not: echo -n "assim" | hexdumpUTF-8 kodlaması echo -n "assim" | iconv -t UTF-16 | hexdumpiçin hexdump aldığımda, diğer kodlamalar için deneyebilirsiniz , bu durumda UTF-16, bellekte nasıl depolandığına dair hiçbir Fikrim yok .. Ama benim durumumda saklandı UTF-8 gibi :)
FernandoH

Hmm, aslında, C programınız için onaltılık döküm metni, ikili - gcc'ye aslında gömülü olduğundan metni yazdırır, böylece tüm statik karakter tamponları bellek içi referans için programın kendisinde saklanır. Ancak Pages için bu veriler runti e. Cevabımı perl ile denediğim yeni bir maçla güncelledim, bu da meyvesizdi, bu yüzden ASCII baytları bile aynı olmadığından metnin bazı standart olmayan garip bir şekilde saklandığından eminim. Belki de bazı objektif C string buffer ...
sapht

Hummm .. Ya bunun yerine "Pages.app" dizesini aramayı denerseniz? Bir şey bulunursa (Uygulamaya ait olan ve belgeniz nedir? Gibi) oradan nasıl ilerleyeceğimi bilemezdim, ancak bu düşünce trenini koruyacak olsaydık, denemenin başlangıcı olabilirdi. Daha kolay alternatifler olması gerektiğini itiraf etmeliyim de, bu oldukça zahmetli olurdu
FernandoH

Aslında, o Kağıt dosyasındaki parçaları hatırlıyor musunuz? Hafızada saklansa bile, orada yazılmış bazı kesin cümleler biliyorsanız (hatırlarsanız veya dosyanın önceki bir sürümüne sahipseniz), doğrudan bunları aramayı deneyebilirsiniz! Bu çok daha kolay olurdu, sanırım :) Ve Pages bir kelime düzenleme programı olduğundan, yazılanları kurtarmak istiyorsun, değil mi? Bu durumda, meta bilgi yerine içeriği arayın, daha kolay olabilir .. Umarım, en azından ..
FernandoH
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.