从失败的休眠唤醒中恢复内存中页面数据


9

尝试从休眠文件还原时,我女友的Macbook崩溃了。进度条停在10%左右,之后我们重新启动计算机以进行正常启动。

此休眠的内存映像在Pages中打开了一个未保存的文档,我们希望对其进行恢复。有一个sleepimagein /private/var/vm,我认为它是从未正确还原的休眠映像。我们备份了这个东西以使其保持生命。

我们尝试过,strings sleepimage | grep known_substring但是什么也没返回。grep -a known_substring sleepimage也没有执行任何操作,因此我假设Pages不会将文本数据作为纯文本保留在内存中。

编辑:在我尝试对Binary grep阅读此答案后perl -ln0777e 'print unpack("H*",$1), "\n", pos() while /(null_padded_substring)/g' sleepimage,再次没有结果。我用空值填充了它,以尝试匹配UTF-8文本。然后我尝试了.*每个字符之间的问题–仍然没有骰子。

因此,Pages可能不会通过任何常见的编码在内存中存储文本。我需要找到ASCII字符串和Pages数据表示形式之间的转换规则-我在想也许是某种Objective C字符串缓冲区。在我看来,将字符数据存储为字符序列以外的其他东西似乎很奇怪,但这似乎是Pages所做的。

如果您对如何计算Pages中文本的内存表示形式有任何想法,则可能对解决此问题很有帮助。也许我可以用一些简单的方法转储和读取进程内存?

另一个可能的解决方案更简单-我假设可以通过某种方式重新启动计算机sleepimage,但是我找不到任何有关如何进行此操作的文档。其他一些用户(微不足道的人)似乎也遇到了这种情况,但是对于我发现的所有论坛问题,他们都没有回应。

OS X版本是Snow Leopard,10.6.8。

欢迎涉及编程的复杂建议。我做C和Python。

谢谢。


1
希望您制作了该文件的副本,这样您就不必检查重启后写入的新睡眠映像。然后,您可能想用最大的可用RAM重新创建情况(不崩溃)-即仅打开Pages写入唯一的文本,然后让OS写入新的sleepimage;然后开始检查您的独特文字。
iolsmit 2012年

@iolsmit是,所有测试均在的副本上执行sleepimage。在另一个图像中筛选以查找唯一文本也很困难,因为该图像的大小仍为4GB,并且Pages内存块将在该文件中随机分配。我想我可以将RAM清零,然后打开页面,然后在sleepimage中查找非零序列。但是Pages会吃掉200MB的内存,这仍然是大海捞针。
sapht 2012年

您的文本在每个字符之间以0x00存储,因此您必须搜索该字符或该字符串:loobsdpkdbik; 另请参阅以下我的答案
iolsmit 2012年

即使没有时间机器备份,页面上的默认版本也不会打开吗(寻找没有系统备份的移动备份,即使没有连接备份驱动器)?您是否已经排除了更简便的方法来取回文件,而无需英勇地对睡眠图像文件格式进行取证分析?(无论您将它拔下多大,都可以;)
bmike

@bmike Versions仅随Lion一起提供,但该机器位于Snow Leopard(10.6.8)上,我记得由于iWork在SL上崩溃而没有自动保存而丢失了很多工作...
iolsmit 2012年

Answers:


1

更新图片:

  • loobsdpkdbik标识第一次提到,是不是一个-只是happend是我的文字前的拳头一次我试了一下。

  • 文本的一部分似乎“丢失”(即未保存在一个连续的内存段中),这可能会因RAM使用情况而恶化

  • 您可能无法从sleepimage中恢复有意义的文本

现在我的原文(第一段有错字,马蒂斯先生说):

隐藏的宝石:MoMa的艾比·奥尔德里奇·洛克菲勒雕塑花园(Abby Aldrich Rockefeller Sculpture Garden)由菲利普·约翰逊(Philip Johnson)于1953年设计,是一座壮观的城市绿洲,其反射池和美丽的美化环境。这个户外画廊安装了不断变化的户外雕塑作品,包括阿里斯蒂德·梅洛(Aristide Maillol),亚历山大·卡尔德(Alexander Calder),亨利·梅斯(Henri Maisse),毕加索(Pablo Picasso)和理查德·塞拉(Richard Serra)的作品。

在参观MoMa的新绘画和雕塑画廊时,一定要走过连接四楼和五楼的楼梯,才能看到亨利·马蒂斯(Henri Matisse)的喜悦和能量的丰盛形象《舞蹈》(Dance)(1909年)。这幅画原本打算悬挂在莫斯科俄罗斯宫殿的楼梯大厅中。

和恢复的文本:

隐藏的宝石:马·艾比·奥尔德里奇·洛克勒(Abby Aldrich Rockeller)的Sculpre Gn,是皮普·约翰(Phip John)于1953年设计的,是壮观的ursithtseflecting泳池autifulandscapg。这个户外画廊摆放着不断变化的户外雕塑,包括阿里斯蒂德·梅洛(Aristide Maillol),亚历山大·卡尔德(Alexander Calder),亨利·梅斯(Henri Maisse),巴勃罗卡索(Pabloicasso)和安查德·海(anchard Sea)的作品。

在Ma参观新的绘画雕塑画廊时,一定要整理一下桥,将第四个弗雷德奥尔德托的Henri Matse的作品《欢乐与欢乐》,Dan(19)桥接起来。这幅画原意画在了俄罗斯宫殿莫斯科的楼梯大厅。

屏幕截图:

Pages中的原始文本

从sleepimage恢复文本


看来,对于一个(未保存)的页面文件(几乎)在您的文本中的所有字符都被分隔0x00在内存中-从而 STRING变得S.T.R.I.N.G.0x00。因此,您要么必须搜索;我可以建议将0xED用于图形前端.... 或者您搜索loobsdpkdbik哪个似乎是标识符的一部分,该标识符在文本之前5个字节(至少在一种情况下)。


嗯,我搜索了“ loobsdpkdbik”,但仍然为空。该标识符是否出现在未保存文档的每个变体之前?也许它表示有关文档的某些信息-例如窗口继承,默认字体等...我之前使用perl搜索了一个以null填充的字符串,即s\0u\0b\0s\0t\0r\0i\0n\0g,它不起作用,更多的描述在我的原始问题中。哦-您是怎么发现的?
sapht 2012年

@sapht我更新了答案;似乎文本没有连续存储在内存中,这可能使它无法从sleepimage中恢复。而且“ loobsdpkdbik”与“页面”文档无关,只是碰巧在我的文字之前。
iolsmit 2012年

那时子串也许是不连续的记忆中含糊不清的单词之一。我仍然没有在sleepimage中找到任何数据,但是我们可能只需要搜索正确的子字符串。或内存块从未被写入。很好的调查睡眠图像,谢谢。
sapht 2012年

@sapht如果您的sleepimage没有损坏,它应该包含Pages文档的全文-因为恢复RAM会将其放在系统休眠时的位置。我建议在虚拟机中尝试sleepimage:在虚拟机中安装任何受支持的OS X(或使用VMware Fusion 4.1;)-然后将您的计算机克隆到虚拟HDD并尝试从sleepimage引导。
iolsmit

2

第一次尝试,如果已知字符串以纯文本格式存储(不是这种情况)

我想你可以尝试使用

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

由此,-U参数指定对二进制文件的搜索,-b指定应显示匹配部分的字节偏移量,最后,-o指定仅应打印匹配部分。

如果可行,您将知道到达该区域的偏移量(以字节为单位),但我不知道确切地在该处如何进行。根据文件类型,您可能会检查该已知偏移量附近的文件类型签名,并尝试仅隔离确实构成该文件一部分的字节。为此,我想您可以编写一个C程序来执行此操作,或者执行hexdump -s known_offset sleepimage并尝试仅获取与所需文件有关的字节。

例如,假设我想了解有关Chrome的一些知识:

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

因此,我知道在字节偏移量3775011731处出现了chrome。因此,我可以:

$ 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

棘手的部分是仅获取所需的字节。如果文件类型具有已知的标头,则可以从hexdump偏移量中减去标头大小(以字节为单位),因此您将获得文件“从头开始”。如果文件类型具有已知的“ EOF”签名,则也可以尝试搜索该文件,从而仅获取到该点为止的字节。

您的文件类型是什么?您是否认为您可以使用类似的程序?请注意,我以前从未做过此事,并且我以很多“猜测”为基础,但是我想类似的事情很少有起作用的机会。

第二次尝试,一种解析所有字节的慢方法

之前的方法不起作用,因为它也只能搜索纯文本,我敢打赌。对于第二篇文章,我创建了一个简单的C程序,其中包含:

#include <stdio.h>

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

因此,我可以在该文本中搜索“ assim”,即您的known_string。为了知道要搜索的字节,我做了:

$ 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),而不是小写字母,并使用\ n代替空格(因此可以使用-A和- B为grep)。您可以使用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

文本仅存储在内存中,因为从未保存过文件。因此,没有真正的文件类型,只有Pages在内部为数据保留的表示形式。传递-Ugrep似乎没有多大区别(a简称--binary-files=text)。如果我有字节偏移量,我肯定可以继续,但是文件已损坏,或者Pages以某种非ASCII方式存储数据。也许是UTF-8,但grep不会接受匹配字符为空字节。
sapht 2012年

我用另一种尝试编辑了该帖子。.它似乎可以工作..但确实很慢,您将不得不“猜测”在known_string发生之前和之后需要多少字节。注意:当我echo -n "assim" | hexdump得到UTF-8编码echo -n "assim" | iconv -t UTF-16 | hexdump的十六进制转储时,可以尝试其他编码,在这种情况下为UTF-16,我不知道如何将其存储在内存中。确实是UTF-8 :)
FernandoH

嗯,好吧,因为您的C程序的十六进制转储实际上是嵌入在二进制文件中的,所以它会打印文本-gcc以这种方式编译,以便所有静态字符缓冲区都存储在程序本身中以供内存中引用。但是对于Pages来说,数据是在运行时创建的。我通过尝试通过perl进行的新匹配更新了答案,这是徒劳的,因此,我可以确定文本以某种怪异的非标准方式存储,因为ASCII字节甚至不相同。也许一些目标C字符串缓冲区...
sapht 2012年

Hummm ..如果您尝试搜索字符串“ Pages.app”怎么办?如果找到任何内容(例如,属于应用程序的内容以及您的文档是什么?),我将不知道如何从那里继续,但是如果我们保持这种思路,那可能是尝试的开始。尽管我必须承认必须有更简便的替代方法,但这将是一个相当费力的替代方法
FernandoH

实际上,您还记得该Papers文件中的片段吗?即使已将其存储在内存中,如果您知道在其中写入的确切句子(如果您还记得或者您具有该文件的先前版本),也可以尝试直接搜索这些句子!我猜这会容易得多:)而且Pages是一个词编辑程序,我想您想恢复所写的内容,对吗?如果是这样的话,搜索内容,而不是元信息,它可能会更容易。我希望,至少..
FernandoH
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.