Macbook моей девушки упал при попытке восстановить файл из спящего режима. Индикатор выполнения остановился на уровне ~ 10%, после чего мы перезагрузили компьютер для нормального запуска.
На этом спящем образе памяти был открыт несохраненный документ в Pages, который мы хотели бы восстановить. Существует sleepimage
в /private/var/vm
, который я предполагаю , это спящий режим изображения , который никогда не был корректно восстановлен. Мы поддержали эту вещь, чтобы сохранить ее.
Мы пытались, strings sleepimage | grep known_substring
но ничего не вернулось. grep -a known_substring sleepimage
также ничего не делал, поэтому я предполагаю, что Pages не сохраняли текстовые данные в памяти как обычный текст.
Изменить: После прочтения этого ответа на бинарный 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
, но я не могу найти какую-либо документацию относительно того, как вы поступите с этим. Некоторые другие пользователи ( macrumors ), кажется, столкнулись с этим, но на все вопросы форума, которые я нашел, ни у одного из них нет ответов.
Версия OS X - Snow Leopard, 10.6.8.
Сложные предложения, касающиеся программирования, приветствуются. Я делаю C и Python.
Спасибо.
источник
sleepimage
. Пролистывать другое изображение в поисках уникального текста было бы так же сложно, так как размер изображения все равно составлял бы 4 ГБ, а блок памяти Страницы размещался бы где-то случайно в этом файле. Я полагаю, что мог бы обнулить ОЗУ, затем открыть страницы и затем искать ненулевые последовательности в образе сна. Но Pages съедает 200 МБ памяти независимо - все еще маленькая иголка в стоге сена.Ответы:
Обновление с картинками:
этот
loobsdpkdbik
идентификатор, упомянутый первым, не один - просто случилось до того, как мой текст впервые попробовал.кажется, что часть текста «теряется» (т.е. не сохраняется в одном непрерывном отрезке памяти), и это может ухудшиться при использовании ОЗУ
возможно, вы не сможете восстановить значимый текст из образа сна
Теперь мой оригинальный текст (с опечаткой в первом абзаце, сэр мистер Матисс):
И восстановленный текст:
И скриншоты:
Кажется, что для (несохраненного) документа Pages (почти) все символы в вашем тексте разделены
0x00
в памяти - таким образом,STRING
становитсяS.T.R.I.N.G
с.
существом0x00
. Так что вы либо должны искать это; Я могу порекомендовать 0xED для графического интерфейса ... ... илидля поиска,только в одном случае).loobsdpkdbik
который кажется (частью) идентификатора, который идет за 5 байтов до текста (по крайней мере,источник
s\0u\0b\0s\0t\0r\0i\0n\0g
Е. Не работал, подробное описание в моем исходном вопросе. Ох - как ты это узнал?Сначала попробуйте, если известная_строка БЫЛА сохранена в виде обычного текста (не так)
Я думаю, вы могли бы попробовать использовать
Исходя из этого, параметр -U указывает поиск в двоичных файлах, -b указывает, что должно отображаться смещение в байтах для соответствующей части, и, наконец, -o указывает, что должна быть напечатана только соответствующая часть.
Если это сработает, вы будете знать смещение в байтах, чтобы добраться до этого региона, но я не знаю точно, как действовать там. В зависимости от типа файла вы, вероятно, можете проверить наличие сигнатуры типа файла рядом с этим информированным смещением и попытаться выделить только те байты, которые составляют часть этого файла. Для этого, я полагаю, вы могли бы либо написать для этого программу на C, либо выполнить ее
hexdump -s known_offset sleepimage
и попытаться получить только те байты, которые относятся к нужному файлу.Например, предположим, что я хотел кое-что узнать о Chrome:
Итак, я знаю, что у меня есть вхождение хрома по смещению байта 3775011731. Следовательно, я мог:
Сложнее было бы получить только те байты, которые вы хотите. Если тип файла имеет известный заголовок, вы можете вычесть размер заголовка в байтах из смещения hexdump, так что вы получите файл «с начала». Если тип файла имеет известную сигнатуру "EOF", вы также можете попытаться найти его и, следовательно, получить только байты до этой точки.
Какой у вас тип файла? Считаете ли вы, что такая процедура может быть использована в вашем случае? Обратите внимание, что я никогда не делал этого раньше, и я основываюсь на многих «догадках», но я полагаю, что что-то вроде этого имеет небольшой шанс работать ..
Вторая попытка, медленный метод для анализа всех байтов
Мой метод не работает, потому что он также ищет только простой текст, моя ставка. Для этого второго текста я создал простую программу на C, содержащую:
Так что я мог бы найти в этом тексте «assim», который будет вашей известной строкой. Чтобы узнать, какие байты искать я сделал:
Следовательно, я должен найти «61 73 73 69 6d». После компиляции этого простого исходного кода C в программу "tt" я сделал следующее:
Который вернулся ко мне:
Если бы вы сделали что-то подобное, я думаю, вы могли бы получить свои данные ... Хотя это было бы довольно медленно для анализа 2 ~ 8 ГБ байтов ...
Обратите внимание, что в этом подходе вы должны найти гексы заглавными буквами (напишите 6D вместо 6d на последнем grep), а не заглавными буквами, и используйте \ n вместо пробелов (так что вы можете использовать -A и - B для grep). Вы можете использовать,
grep -i
чтобы он стал без учета регистра, но это будет немного медленнее. Следовательно, просто используйте заглавные буквы, если это используется.Или, если вам нужен универсальный «скрипт»:
источник
-U
кgrep
, казалось, не имел большого значения (a
сокращенно--binary-files=text
). Если бы у меня было смещение в байтах, я бы определенно мог продолжить, но либо файл поврежден, либо Pages хранит данные не в ASCII-формате. Возможно UTF-8, ноgrep
не будет принимать нулевые байты для символа совпадения.echo -n "assim" | hexdump
получаю hexdump для кодировки UTF-8, вы можете попробоватьecho -n "assim" | iconv -t UTF-16 | hexdump
другие кодировки, в данном случае UTF-16, я понятия не имею, как он хранится в памяти. Но в моем случае он был сохранен как UTF-8 действительно :)